From 385f975569c1e3d4c6569cf84b6f9c3d70a250de Mon Sep 17 00:00:00 2001 From: yxming66 <2389287465@qq.com> Date: Fri, 3 Oct 2025 14:32:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=91=E5=81=87=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .mxproject | 39 + Core/Inc/FreeRTOSConfig.h | 171 + Core/Inc/dma.h | 52 + Core/Inc/gpio.h | 49 + Core/Inc/i2c.h | 55 + Core/Inc/main.h | 108 + Core/Inc/spi.h | 52 + Core/Inc/stm32f4xx_hal_conf.h | 495 + Core/Inc/stm32f4xx_it.h | 72 + Core/Inc/tim.h | 63 + Core/Inc/usart.h | 52 + Core/Src/dma.c | 65 + Core/Src/freertos.c | 129 + Core/Src/gpio.c | 126 + Core/Src/i2c.c | 221 + Core/Src/main.c | 207 + Core/Src/spi.c | 171 + Core/Src/stm32f4xx_hal_msp.c | 84 + Core/Src/stm32f4xx_it.c | 303 + Core/Src/system_stm32f4xx.c | 747 + Core/Src/tim.c | 446 + Core/Src/usart.c | 142 + .../Device/ST/STM32F4xx/Include/stm32f407xx.h | 15613 ++++++++++++++++ .../Device/ST/STM32F4xx/Include/stm32f4xx.h | 301 + .../ST/STM32F4xx/Include/system_stm32f4xx.h | 104 + Drivers/CMSIS/Device/ST/STM32F4xx/LICENSE.txt | 6 + Drivers/CMSIS/Include/cachel1_armv7.h | 411 + Drivers/CMSIS/Include/cmsis_armcc.h | 888 + Drivers/CMSIS/Include/cmsis_armclang.h | 1503 ++ Drivers/CMSIS/Include/cmsis_armclang_ltm.h | 1928 ++ Drivers/CMSIS/Include/cmsis_compiler.h | 283 + Drivers/CMSIS/Include/cmsis_gcc.h | 2211 +++ Drivers/CMSIS/Include/cmsis_iccarm.h | 1002 + Drivers/CMSIS/Include/cmsis_version.h | 39 + Drivers/CMSIS/Include/core_armv81mml.h | 4228 +++++ Drivers/CMSIS/Include/core_armv8mbl.h | 2222 +++ Drivers/CMSIS/Include/core_armv8mml.h | 3209 ++++ Drivers/CMSIS/Include/core_cm0.h | 952 + Drivers/CMSIS/Include/core_cm0plus.h | 1087 ++ Drivers/CMSIS/Include/core_cm1.h | 979 + Drivers/CMSIS/Include/core_cm23.h | 2297 +++ Drivers/CMSIS/Include/core_cm3.h | 1943 ++ Drivers/CMSIS/Include/core_cm33.h | 3277 ++++ Drivers/CMSIS/Include/core_cm35p.h | 3277 ++++ Drivers/CMSIS/Include/core_cm4.h | 2129 +++ Drivers/CMSIS/Include/core_cm55.h | 4817 +++++ Drivers/CMSIS/Include/core_cm7.h | 2366 +++ Drivers/CMSIS/Include/core_cm85.h | 4672 +++++ Drivers/CMSIS/Include/core_sc000.h | 1030 + Drivers/CMSIS/Include/core_sc300.h | 1917 ++ Drivers/CMSIS/Include/core_starmc1.h | 3592 ++++ Drivers/CMSIS/Include/mpu_armv7.h | 275 + Drivers/CMSIS/Include/mpu_armv8.h | 352 + Drivers/CMSIS/Include/pac_armv81.h | 206 + Drivers/CMSIS/Include/pmu_armv8.h | 337 + Drivers/CMSIS/Include/tz_context.h | 70 + Drivers/CMSIS/LICENSE.txt | 201 + .../Inc/Legacy/stm32_hal_legacy.h | 4422 +++++ .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h | 297 + .../Inc/stm32f4xx_hal_cortex.h | 410 + .../Inc/stm32f4xx_hal_def.h | 212 + .../Inc/stm32f4xx_hal_dma.h | 802 + .../Inc/stm32f4xx_hal_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_i2c.h | 741 + .../Inc/stm32f4xx_hal_i2c_ex.h | 115 + .../Inc/stm32f4xx_hal_pwr.h | 436 + .../Inc/stm32f4xx_hal_pwr_ex.h | 340 + .../Inc/stm32f4xx_hal_rcc.h | 1458 ++ .../Inc/stm32f4xx_hal_rcc_ex.h | 7190 +++++++ .../Inc/stm32f4xx_hal_spi.h | 733 + .../Inc/stm32f4xx_hal_tim.h | 2157 +++ .../Inc/stm32f4xx_hal_tim_ex.h | 357 + .../Inc/stm32f4xx_hal_uart.h | 909 + .../Inc/stm32f4xx_ll_bus.h | 2105 +++ .../Inc/stm32f4xx_ll_cortex.h | 647 + .../Inc/stm32f4xx_ll_dma.h | 2868 +++ .../Inc/stm32f4xx_ll_exti.h | 954 + .../Inc/stm32f4xx_ll_gpio.h | 981 + .../Inc/stm32f4xx_ll_i2c.h | 1890 ++ .../Inc/stm32f4xx_ll_pwr.h | 985 + .../Inc/stm32f4xx_ll_rcc.h | 7101 +++++++ .../Inc/stm32f4xx_ll_spi.h | 2042 ++ .../Inc/stm32f4xx_ll_system.h | 1711 ++ .../Inc/stm32f4xx_ll_tim.h | 4096 ++++ .../Inc/stm32f4xx_ll_usart.h | 2521 +++ .../Inc/stm32f4xx_ll_utils.h | 307 + Drivers/STM32F4xx_HAL_Driver/LICENSE.txt | 6 + .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c | 616 + .../Src/stm32f4xx_hal_cortex.c | 538 + .../Src/stm32f4xx_hal_dma.c | 1305 ++ .../Src/stm32f4xx_hal_dma_ex.c | 313 + .../Src/stm32f4xx_hal_exti.c | 553 + .../Src/stm32f4xx_hal_flash.c | 776 + .../Src/stm32f4xx_hal_flash_ex.c | 1344 ++ .../Src/stm32f4xx_hal_flash_ramfunc.c | 172 + .../Src/stm32f4xx_hal_gpio.c | 533 + .../Src/stm32f4xx_hal_i2c.c | 7567 ++++++++ .../Src/stm32f4xx_hal_i2c_ex.c | 182 + .../Src/stm32f4xx_hal_pwr.c | 598 + .../Src/stm32f4xx_hal_pwr_ex.c | 600 + .../Src/stm32f4xx_hal_rcc.c | 1124 ++ .../Src/stm32f4xx_hal_rcc_ex.c | 3833 ++++ .../Src/stm32f4xx_hal_spi.c | 3945 ++++ .../Src/stm32f4xx_hal_tim.c | 7629 ++++++++ .../Src/stm32f4xx_hal_tim_ex.c | 2410 +++ .../Src/stm32f4xx_hal_uart.c | 3807 ++++ DveC.ioc | 392 + .../DebugConfig/DveC_STM32F407IGHx.dbgconf | 48 + MDK-ARM/DveC.uvguix.yxm23 | 3628 ++++ MDK-ARM/DveC.uvoptx | 1381 ++ MDK-ARM/DveC.uvprojx | 922 + MDK-ARM/DveC/DveC.axf | Bin 0 -> 411040 bytes MDK-ARM/DveC/DveC.build_log.htm | 61 + MDK-ARM/DveC/DveC.hex | 1209 ++ MDK-ARM/DveC/DveC.htm | 2071 ++ MDK-ARM/DveC/DveC.lnp | 74 + MDK-ARM/DveC/DveC.map | 6880 +++++++ MDK-ARM/DveC/DveC.sct | 19 + MDK-ARM/DveC/DveC_DveC.dep | 2291 +++ MDK-ARM/DveC/ahrs.crf | Bin 0 -> 27411 bytes MDK-ARM/DveC/ahrs.d | 7 + MDK-ARM/DveC/ahrs.o | Bin 0 -> 17896 bytes MDK-ARM/DveC/atti_esti.crf | Bin 0 -> 77219 bytes MDK-ARM/DveC/atti_esti.d | 20 + MDK-ARM/DveC/atti_esti.o | Bin 0 -> 8116 bytes MDK-ARM/DveC/bmi088.crf | Bin 0 -> 873410 bytes MDK-ARM/DveC/bmi088.d | 42 + MDK-ARM/DveC/bmi088.o | Bin 0 -> 16272 bytes MDK-ARM/DveC/buzzer_pwm.crf | Bin 0 -> 836735 bytes MDK-ARM/DveC/buzzer_pwm.d | 35 + MDK-ARM/DveC/buzzer_pwm.o | Bin 0 -> 14140 bytes MDK-ARM/DveC/cmsis_os2.crf | Bin 0 -> 921880 bytes MDK-ARM/DveC/cmsis_os2.d | 54 + MDK-ARM/DveC/cmsis_os2.o | Bin 0 -> 92728 bytes MDK-ARM/DveC/config.crf | Bin 0 -> 18 bytes MDK-ARM/DveC/config.d | 1 + MDK-ARM/DveC/config.o | Bin 0 -> 584 bytes MDK-ARM/DveC/croutine.crf | Bin 0 -> 40868 bytes MDK-ARM/DveC/croutine.d | 13 + MDK-ARM/DveC/croutine.o | Bin 0 -> 584 bytes MDK-ARM/DveC/delay.crf | Bin 0 -> 889026 bytes MDK-ARM/DveC/delay.d | 45 + MDK-ARM/DveC/delay.o | Bin 0 -> 6244 bytes MDK-ARM/DveC/dma.crf | Bin 0 -> 833854 bytes MDK-ARM/DveC/dma.d | 34 + MDK-ARM/DveC/dma.o | Bin 0 -> 6096 bytes MDK-ARM/DveC/dwt.crf | Bin 0 -> 835477 bytes MDK-ARM/DveC/dwt.d | 34 + MDK-ARM/DveC/dwt.o | Bin 0 -> 10828 bytes MDK-ARM/DveC/easy_control.crf | Bin 0 -> 856841 bytes MDK-ARM/DveC/easy_control.d | 41 + MDK-ARM/DveC/easy_control.o | Bin 0 -> 17476 bytes MDK-ARM/DveC/event_groups.crf | Bin 0 -> 55218 bytes MDK-ARM/DveC/event_groups.d | 18 + MDK-ARM/DveC/event_groups.o | Bin 0 -> 20068 bytes MDK-ARM/DveC/filter.crf | Bin 0 -> 20357 bytes MDK-ARM/DveC/filter.d | 7 + MDK-ARM/DveC/filter.o | Bin 0 -> 9952 bytes MDK-ARM/DveC/fixed_height.crf | Bin 0 -> 851953 bytes MDK-ARM/DveC/fixed_height.d | 40 + MDK-ARM/DveC/fixed_height.o | Bin 0 -> 3836 bytes MDK-ARM/DveC/flash.crf | Bin 0 -> 837195 bytes MDK-ARM/DveC/flash.d | 35 + MDK-ARM/DveC/freertos.crf | Bin 0 -> 888102 bytes MDK-ARM/DveC/freertos.d | 45 + MDK-ARM/DveC/freertos.o | Bin 0 -> 5536 bytes MDK-ARM/DveC/gpio.crf | Bin 0 -> 835575 bytes MDK-ARM/DveC/gpio.d | 34 + MDK-ARM/DveC/gpio.o | Bin 0 -> 7712 bytes MDK-ARM/DveC/gpio_1.crf | Bin 0 -> 834413 bytes MDK-ARM/DveC/gpio_1.d | 36 + MDK-ARM/DveC/gpio_1.o | Bin 0 -> 7728 bytes MDK-ARM/DveC/heap_4.crf | Bin 0 -> 46700 bytes MDK-ARM/DveC/heap_4.d | 14 + MDK-ARM/DveC/heap_4.o | Bin 0 -> 11960 bytes MDK-ARM/DveC/height_cal.crf | Bin 0 -> 910595 bytes MDK-ARM/DveC/height_cal.d | 55 + MDK-ARM/DveC/height_cal.o | Bin 0 -> 6800 bytes MDK-ARM/DveC/i2c.crf | Bin 0 -> 835813 bytes MDK-ARM/DveC/i2c.d | 34 + MDK-ARM/DveC/i2c.o | Bin 0 -> 10884 bytes MDK-ARM/DveC/i2c_1.crf | Bin 0 -> 835975 bytes MDK-ARM/DveC/i2c_1.d | 35 + MDK-ARM/DveC/i2c_1.o | Bin 0 -> 14408 bytes MDK-ARM/DveC/init.crf | Bin 0 -> 905372 bytes MDK-ARM/DveC/init.d | 51 + MDK-ARM/DveC/init.o | Bin 0 -> 3120 bytes MDK-ARM/DveC/ist8310.crf | Bin 0 -> 869798 bytes MDK-ARM/DveC/ist8310.d | 43 + MDK-ARM/DveC/ist8310.o | Bin 0 -> 11324 bytes MDK-ARM/DveC/led_pwm.crf | Bin 0 -> 835314 bytes MDK-ARM/DveC/led_pwm.d | 35 + MDK-ARM/DveC/led_pwm.o | Bin 0 -> 9224 bytes MDK-ARM/DveC/list.crf | Bin 0 -> 34843 bytes MDK-ARM/DveC/list.d | 12 + MDK-ARM/DveC/list.o | Bin 0 -> 5480 bytes MDK-ARM/DveC/main.crf | Bin 0 -> 890152 bytes MDK-ARM/DveC/main.d | 48 + MDK-ARM/DveC/main.o | Bin 0 -> 6516 bytes MDK-ARM/DveC/main_control.crf | Bin 0 -> 908150 bytes MDK-ARM/DveC/main_control.d | 52 + MDK-ARM/DveC/main_control.o | Bin 0 -> 8020 bytes MDK-ARM/DveC/pid.crf | Bin 0 -> 21431 bytes MDK-ARM/DveC/pid.d | 8 + MDK-ARM/DveC/pid.o | Bin 0 -> 8092 bytes MDK-ARM/DveC/port.d | 13 + MDK-ARM/DveC/port.o | Bin 0 -> 11996 bytes MDK-ARM/DveC/ps2.crf | Bin 0 -> 847189 bytes MDK-ARM/DveC/ps2.d | 36 + MDK-ARM/DveC/ps2.o | Bin 0 -> 9136 bytes MDK-ARM/DveC/ps2_1.crf | Bin 0 -> 888231 bytes MDK-ARM/DveC/ps2_1.d | 46 + MDK-ARM/DveC/ps2_1.o | Bin 0 -> 3824 bytes MDK-ARM/DveC/pwm.crf | Bin 0 -> 835355 bytes MDK-ARM/DveC/pwm.d | 35 + MDK-ARM/DveC/pwm.o | Bin 0 -> 5304 bytes MDK-ARM/DveC/queue.crf | Bin 0 -> 70281 bytes MDK-ARM/DveC/queue.d | 16 + MDK-ARM/DveC/queue.o | Bin 0 -> 49680 bytes MDK-ARM/DveC/spi.crf | Bin 0 -> 835309 bytes MDK-ARM/DveC/spi.d | 34 + MDK-ARM/DveC/spi.o | Bin 0 -> 9916 bytes MDK-ARM/DveC/spi_1.crf | Bin 0 -> 835814 bytes MDK-ARM/DveC/spi_1.d | 35 + MDK-ARM/DveC/spi_1.o | Bin 0 -> 13304 bytes MDK-ARM/DveC/spl06.crf | Bin 0 -> 851586 bytes MDK-ARM/DveC/spl06.d | 37 + MDK-ARM/DveC/spl06.o | Bin 0 -> 15796 bytes MDK-ARM/DveC/startup_stm32f407xx.d | 1 + MDK-ARM/DveC/startup_stm32f407xx.o | Bin 0 -> 7892 bytes MDK-ARM/DveC/stm32f4xx_hal.crf | Bin 0 -> 834337 bytes MDK-ARM/DveC/stm32f4xx_hal.d | 34 + MDK-ARM/DveC/stm32f4xx_hal.o | Bin 0 -> 19772 bytes MDK-ARM/DveC/stm32f4xx_hal_cortex.crf | Bin 0 -> 833907 bytes MDK-ARM/DveC/stm32f4xx_hal_cortex.d | 35 + MDK-ARM/DveC/stm32f4xx_hal_cortex.o | Bin 0 -> 26980 bytes MDK-ARM/DveC/stm32f4xx_hal_dma.crf | Bin 0 -> 840527 bytes MDK-ARM/DveC/stm32f4xx_hal_dma.d | 35 + MDK-ARM/DveC/stm32f4xx_hal_dma.o | Bin 0 -> 19292 bytes MDK-ARM/DveC/stm32f4xx_hal_dma_ex.crf | Bin 0 -> 843034 bytes MDK-ARM/DveC/stm32f4xx_hal_dma_ex.d | 35 + MDK-ARM/DveC/stm32f4xx_hal_dma_ex.o | Bin 0 -> 9808 bytes MDK-ARM/DveC/stm32f4xx_hal_exti.crf | Bin 0 -> 835180 bytes MDK-ARM/DveC/stm32f4xx_hal_exti.d | 35 + MDK-ARM/DveC/stm32f4xx_hal_exti.o | Bin 0 -> 10192 bytes MDK-ARM/DveC/stm32f4xx_hal_flash.crf | Bin 0 -> 836960 bytes MDK-ARM/DveC/stm32f4xx_hal_flash.d | 35 + MDK-ARM/DveC/stm32f4xx_hal_flash.o | Bin 0 -> 14148 bytes MDK-ARM/DveC/stm32f4xx_hal_flash_ex.crf | Bin 0 -> 836862 bytes MDK-ARM/DveC/stm32f4xx_hal_flash_ex.d | 35 + MDK-ARM/DveC/stm32f4xx_hal_flash_ex.o | Bin 0 -> 14260 bytes MDK-ARM/DveC/stm32f4xx_hal_flash_ramfunc.crf | Bin 0 -> 831904 bytes MDK-ARM/DveC/stm32f4xx_hal_flash_ramfunc.d | 35 + MDK-ARM/DveC/stm32f4xx_hal_flash_ramfunc.o | Bin 0 -> 604 bytes MDK-ARM/DveC/stm32f4xx_hal_gpio.crf | Bin 0 -> 835569 bytes MDK-ARM/DveC/stm32f4xx_hal_gpio.d | 35 + MDK-ARM/DveC/stm32f4xx_hal_gpio.o | Bin 0 -> 10792 bytes MDK-ARM/DveC/stm32f4xx_hal_i2c.crf | Bin 0 -> 899820 bytes MDK-ARM/DveC/stm32f4xx_hal_i2c.d | 35 + MDK-ARM/DveC/stm32f4xx_hal_i2c.o | Bin 0 -> 94420 bytes MDK-ARM/DveC/stm32f4xx_hal_i2c_ex.crf | Bin 0 -> 831897 bytes MDK-ARM/DveC/stm32f4xx_hal_i2c_ex.d | 35 + MDK-ARM/DveC/stm32f4xx_hal_i2c_ex.o | Bin 0 -> 596 bytes MDK-ARM/DveC/stm32f4xx_hal_msp.crf | Bin 0 -> 833702 bytes MDK-ARM/DveC/stm32f4xx_hal_msp.d | 34 + MDK-ARM/DveC/stm32f4xx_hal_msp.o | Bin 0 -> 5988 bytes MDK-ARM/DveC/stm32f4xx_hal_pwr.crf | Bin 0 -> 834620 bytes MDK-ARM/DveC/stm32f4xx_hal_pwr.d | 35 + MDK-ARM/DveC/stm32f4xx_hal_pwr.o | Bin 0 -> 12304 bytes MDK-ARM/DveC/stm32f4xx_hal_pwr_ex.crf | Bin 0 -> 833309 bytes MDK-ARM/DveC/stm32f4xx_hal_pwr_ex.d | 35 + MDK-ARM/DveC/stm32f4xx_hal_pwr_ex.o | Bin 0 -> 7068 bytes MDK-ARM/DveC/stm32f4xx_hal_rcc.crf | Bin 0 -> 843318 bytes MDK-ARM/DveC/stm32f4xx_hal_rcc.d | 35 + MDK-ARM/DveC/stm32f4xx_hal_rcc.o | Bin 0 -> 17000 bytes MDK-ARM/DveC/stm32f4xx_hal_rcc_ex.crf | Bin 0 -> 837118 bytes MDK-ARM/DveC/stm32f4xx_hal_rcc_ex.d | 35 + MDK-ARM/DveC/stm32f4xx_hal_rcc_ex.o | Bin 0 -> 9752 bytes MDK-ARM/DveC/stm32f4xx_hal_spi.crf | Bin 0 -> 859764 bytes MDK-ARM/DveC/stm32f4xx_hal_spi.d | 35 + MDK-ARM/DveC/stm32f4xx_hal_spi.o | Bin 0 -> 52504 bytes MDK-ARM/DveC/stm32f4xx_hal_tim.crf | Bin 0 -> 901067 bytes MDK-ARM/DveC/stm32f4xx_hal_tim.d | 35 + MDK-ARM/DveC/stm32f4xx_hal_tim.o | Bin 0 -> 112052 bytes MDK-ARM/DveC/stm32f4xx_hal_tim_ex.crf | Bin 0 -> 860365 bytes MDK-ARM/DveC/stm32f4xx_hal_tim_ex.d | 35 + MDK-ARM/DveC/stm32f4xx_hal_tim_ex.o | Bin 0 -> 45920 bytes MDK-ARM/DveC/stm32f4xx_hal_uart.crf | Bin 0 -> 861091 bytes MDK-ARM/DveC/stm32f4xx_hal_uart.d | 35 + MDK-ARM/DveC/stm32f4xx_hal_uart.o | Bin 0 -> 59932 bytes MDK-ARM/DveC/stm32f4xx_it.crf | Bin 0 -> 870922 bytes MDK-ARM/DveC/stm32f4xx_it.d | 44 + MDK-ARM/DveC/stm32f4xx_it.o | Bin 0 -> 8852 bytes MDK-ARM/DveC/stream_buffer.crf | Bin 0 -> 56952 bytes MDK-ARM/DveC/stream_buffer.d | 15 + MDK-ARM/DveC/stream_buffer.o | Bin 0 -> 33844 bytes MDK-ARM/DveC/system_stm32f4xx.crf | Bin 0 -> 832527 bytes MDK-ARM/DveC/system_stm32f4xx.d | 34 + MDK-ARM/DveC/system_stm32f4xx.o | Bin 0 -> 5556 bytes MDK-ARM/DveC/tasks.crf | Bin 0 -> 75367 bytes MDK-ARM/DveC/tasks.d | 17 + MDK-ARM/DveC/tasks.o | Bin 0 -> 73760 bytes MDK-ARM/DveC/test1.crf | Bin 0 -> 889839 bytes MDK-ARM/DveC/test1.d | 48 + MDK-ARM/DveC/test1.o | Bin 0 -> 8656 bytes MDK-ARM/DveC/tim.crf | Bin 0 -> 838318 bytes MDK-ARM/DveC/tim.d | 34 + MDK-ARM/DveC/tim.o | Bin 0 -> 16396 bytes MDK-ARM/DveC/time.crf | Bin 0 -> 884244 bytes MDK-ARM/DveC/time.d | 45 + MDK-ARM/DveC/time.o | Bin 0 -> 5344 bytes MDK-ARM/DveC/timers.crf | Bin 0 -> 64746 bytes MDK-ARM/DveC/timers.d | 16 + MDK-ARM/DveC/timers.o | Bin 0 -> 33660 bytes MDK-ARM/DveC/uart.crf | Bin 0 -> 837062 bytes MDK-ARM/DveC/uart.d | 36 + MDK-ARM/DveC/uart.o | Bin 0 -> 16176 bytes MDK-ARM/DveC/usart.crf | Bin 0 -> 834654 bytes MDK-ARM/DveC/usart.d | 34 + MDK-ARM/DveC/usart.o | Bin 0 -> 12176 bytes MDK-ARM/DveC/user_math.crf | Bin 0 -> 19640 bytes MDK-ARM/DveC/user_math.d | 7 + MDK-ARM/DveC/user_math.o | Bin 0 -> 6392 bytes MDK-ARM/DveC/user_task.crf | Bin 0 -> 55364 bytes MDK-ARM/DveC/user_task.d | 13 + MDK-ARM/DveC/user_task.o | Bin 0 -> 6264 bytes MDK-ARM/JLinkLog.txt | 24 + MDK-ARM/RTE/_DveC/RTE_Components.h | 21 + MDK-ARM/startup_stm32f407xx.lst | 1964 ++ MDK-ARM/startup_stm32f407xx.s | 422 + .../FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os.h | 846 + .../FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c | 2482 +++ .../FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.h | 734 + .../Source/CMSIS_RTOS_V2/freertos_mpool.h | 63 + .../Source/CMSIS_RTOS_V2/freertos_os2.h | 310 + .../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 + .../FreeRTOS/Source/portable/MemMang/heap_4.c | 492 + .../Source/portable/RVDS/ARM_CM4F/port.c | 775 + .../Source/portable/RVDS/ARM_CM4F/portmacro.h | 243 + .../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 ++ User/bsp/bsp.h | 15 + User/bsp/buzzer_pwm.c | 171 + User/bsp/buzzer_pwm.h | 45 + User/bsp/delay.c | 118 + User/bsp/delay.h | 24 + User/bsp/dwt.c | 122 + User/bsp/dwt.h | 37 + User/bsp/flash.c | 51 + User/bsp/flash.h | 78 + User/bsp/gpio.c | 81 + User/bsp/gpio.h | 23 + User/bsp/i2c.c | 112 + User/bsp/i2c.h | 47 + User/bsp/led_pwm.c | 84 + User/bsp/led_pwm.h | 32 + User/bsp/pwm.c | 104 + User/bsp/pwm.h | 32 + User/bsp/spi.c | 106 + User/bsp/spi.h | 46 + User/bsp/time.c | 65 + User/bsp/time.h | 31 + User/bsp/uart.c | 139 + User/bsp/uart.h | 53 + User/component/ahrs.c | 405 + User/component/ahrs.h | 98 + User/component/filter.c | 185 + User/component/filter.h | 104 + User/component/fixed_height.c | 46 + User/component/fixed_height.h | 23 + User/component/pid.c | 158 + User/component/pid.h | 95 + User/component/user_math.c | 88 + User/component/user_math.h | 130 + User/device/SPL06.c | 334 + User/device/SPL06.h | 146 + User/device/bmi088.c | 394 + User/device/bmi088.h | 64 + User/device/device.h | 38 + User/device/ist8310.c | 170 + User/device/ist8310.h | 48 + User/device/ps2.c | 175 + User/device/ps2.h | 31 + User/module/config.c | 0 User/module/easy_control.c | 279 + User/module/easy_control.h | 64 + User/module/quad_att_control.c | 0 User/module/quad_att_control.h | 0 User/module/quad_pos_control.c | 161 + User/module/quad_pos_control.h | 44 + User/module/quad_pos_control_math.c | 56 + User/module/quad_pos_control_math.h | 15 + User/task/atti_esti.c | 135 + User/task/height_cal.c | 103 + User/task/init.c | 53 + User/task/main_control.c | 136 + User/task/ps2.c | 53 + User/task/test1.c | 104 + User/task/user_task.c | 36 + User/task/user_task.h | 113 + 429 files changed, 224519 insertions(+) create mode 100644 .mxproject create mode 100644 Core/Inc/FreeRTOSConfig.h create mode 100644 Core/Inc/dma.h create mode 100644 Core/Inc/gpio.h create mode 100644 Core/Inc/i2c.h create mode 100644 Core/Inc/main.h create mode 100644 Core/Inc/spi.h create mode 100644 Core/Inc/stm32f4xx_hal_conf.h create mode 100644 Core/Inc/stm32f4xx_it.h create mode 100644 Core/Inc/tim.h create mode 100644 Core/Inc/usart.h create mode 100644 Core/Src/dma.c create mode 100644 Core/Src/freertos.c create mode 100644 Core/Src/gpio.c create mode 100644 Core/Src/i2c.c create mode 100644 Core/Src/main.c create mode 100644 Core/Src/spi.c create mode 100644 Core/Src/stm32f4xx_hal_msp.c create mode 100644 Core/Src/stm32f4xx_it.c create mode 100644 Core/Src/system_stm32f4xx.c create mode 100644 Core/Src/tim.c create mode 100644 Core/Src/usart.c create mode 100644 Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f407xx.h create mode 100644 Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h create mode 100644 Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h create mode 100644 Drivers/CMSIS/Device/ST/STM32F4xx/LICENSE.txt create mode 100644 Drivers/CMSIS/Include/cachel1_armv7.h create mode 100644 Drivers/CMSIS/Include/cmsis_armcc.h create mode 100644 Drivers/CMSIS/Include/cmsis_armclang.h create mode 100644 Drivers/CMSIS/Include/cmsis_armclang_ltm.h create mode 100644 Drivers/CMSIS/Include/cmsis_compiler.h create mode 100644 Drivers/CMSIS/Include/cmsis_gcc.h create mode 100644 Drivers/CMSIS/Include/cmsis_iccarm.h create mode 100644 Drivers/CMSIS/Include/cmsis_version.h create mode 100644 Drivers/CMSIS/Include/core_armv81mml.h create mode 100644 Drivers/CMSIS/Include/core_armv8mbl.h create mode 100644 Drivers/CMSIS/Include/core_armv8mml.h create mode 100644 Drivers/CMSIS/Include/core_cm0.h create mode 100644 Drivers/CMSIS/Include/core_cm0plus.h create mode 100644 Drivers/CMSIS/Include/core_cm1.h create mode 100644 Drivers/CMSIS/Include/core_cm23.h create mode 100644 Drivers/CMSIS/Include/core_cm3.h create mode 100644 Drivers/CMSIS/Include/core_cm33.h create mode 100644 Drivers/CMSIS/Include/core_cm35p.h create mode 100644 Drivers/CMSIS/Include/core_cm4.h create mode 100644 Drivers/CMSIS/Include/core_cm55.h create mode 100644 Drivers/CMSIS/Include/core_cm7.h create mode 100644 Drivers/CMSIS/Include/core_cm85.h create mode 100644 Drivers/CMSIS/Include/core_sc000.h create mode 100644 Drivers/CMSIS/Include/core_sc300.h create mode 100644 Drivers/CMSIS/Include/core_starmc1.h create mode 100644 Drivers/CMSIS/Include/mpu_armv7.h create mode 100644 Drivers/CMSIS/Include/mpu_armv8.h create mode 100644 Drivers/CMSIS/Include/pac_armv81.h create mode 100644 Drivers/CMSIS/Include/pmu_armv8.h create mode 100644 Drivers/CMSIS/Include/tz_context.h create mode 100644 Drivers/CMSIS/LICENSE.txt create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c_ex.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_i2c.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_spi.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_tim.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h create mode 100644 Drivers/STM32F4xx_HAL_Driver/LICENSE.txt create mode 100644 Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c create mode 100644 Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c create mode 100644 Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c create mode 100644 Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c create mode 100644 Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c create mode 100644 Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c create mode 100644 Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c create mode 100644 Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c create mode 100644 Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c create mode 100644 Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c create mode 100644 Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c create mode 100644 Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c create mode 100644 Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c create mode 100644 Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c create mode 100644 Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c create mode 100644 Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c create mode 100644 Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c create mode 100644 Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c create mode 100644 Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c create mode 100644 DveC.ioc create mode 100644 MDK-ARM/DebugConfig/DveC_STM32F407IGHx.dbgconf create mode 100644 MDK-ARM/DveC.uvguix.yxm23 create mode 100644 MDK-ARM/DveC.uvoptx create mode 100644 MDK-ARM/DveC.uvprojx create mode 100644 MDK-ARM/DveC/DveC.axf create mode 100644 MDK-ARM/DveC/DveC.build_log.htm create mode 100644 MDK-ARM/DveC/DveC.hex create mode 100644 MDK-ARM/DveC/DveC.htm create mode 100644 MDK-ARM/DveC/DveC.lnp create mode 100644 MDK-ARM/DveC/DveC.map create mode 100644 MDK-ARM/DveC/DveC.sct create mode 100644 MDK-ARM/DveC/DveC_DveC.dep create mode 100644 MDK-ARM/DveC/ahrs.crf create mode 100644 MDK-ARM/DveC/ahrs.d create mode 100644 MDK-ARM/DveC/ahrs.o create mode 100644 MDK-ARM/DveC/atti_esti.crf create mode 100644 MDK-ARM/DveC/atti_esti.d create mode 100644 MDK-ARM/DveC/atti_esti.o create mode 100644 MDK-ARM/DveC/bmi088.crf create mode 100644 MDK-ARM/DveC/bmi088.d create mode 100644 MDK-ARM/DveC/bmi088.o create mode 100644 MDK-ARM/DveC/buzzer_pwm.crf create mode 100644 MDK-ARM/DveC/buzzer_pwm.d create mode 100644 MDK-ARM/DveC/buzzer_pwm.o create mode 100644 MDK-ARM/DveC/cmsis_os2.crf create mode 100644 MDK-ARM/DveC/cmsis_os2.d create mode 100644 MDK-ARM/DveC/cmsis_os2.o create mode 100644 MDK-ARM/DveC/config.crf create mode 100644 MDK-ARM/DveC/config.d create mode 100644 MDK-ARM/DveC/config.o create mode 100644 MDK-ARM/DveC/croutine.crf create mode 100644 MDK-ARM/DveC/croutine.d create mode 100644 MDK-ARM/DveC/croutine.o create mode 100644 MDK-ARM/DveC/delay.crf create mode 100644 MDK-ARM/DveC/delay.d create mode 100644 MDK-ARM/DveC/delay.o create mode 100644 MDK-ARM/DveC/dma.crf create mode 100644 MDK-ARM/DveC/dma.d create mode 100644 MDK-ARM/DveC/dma.o create mode 100644 MDK-ARM/DveC/dwt.crf create mode 100644 MDK-ARM/DveC/dwt.d create mode 100644 MDK-ARM/DveC/dwt.o create mode 100644 MDK-ARM/DveC/easy_control.crf create mode 100644 MDK-ARM/DveC/easy_control.d create mode 100644 MDK-ARM/DveC/easy_control.o create mode 100644 MDK-ARM/DveC/event_groups.crf create mode 100644 MDK-ARM/DveC/event_groups.d create mode 100644 MDK-ARM/DveC/event_groups.o create mode 100644 MDK-ARM/DveC/filter.crf create mode 100644 MDK-ARM/DveC/filter.d create mode 100644 MDK-ARM/DveC/filter.o create mode 100644 MDK-ARM/DveC/fixed_height.crf create mode 100644 MDK-ARM/DveC/fixed_height.d create mode 100644 MDK-ARM/DveC/fixed_height.o create mode 100644 MDK-ARM/DveC/flash.crf create mode 100644 MDK-ARM/DveC/flash.d create mode 100644 MDK-ARM/DveC/freertos.crf create mode 100644 MDK-ARM/DveC/freertos.d create mode 100644 MDK-ARM/DveC/freertos.o create mode 100644 MDK-ARM/DveC/gpio.crf create mode 100644 MDK-ARM/DveC/gpio.d create mode 100644 MDK-ARM/DveC/gpio.o create mode 100644 MDK-ARM/DveC/gpio_1.crf create mode 100644 MDK-ARM/DveC/gpio_1.d create mode 100644 MDK-ARM/DveC/gpio_1.o create mode 100644 MDK-ARM/DveC/heap_4.crf create mode 100644 MDK-ARM/DveC/heap_4.d create mode 100644 MDK-ARM/DveC/heap_4.o create mode 100644 MDK-ARM/DveC/height_cal.crf create mode 100644 MDK-ARM/DveC/height_cal.d create mode 100644 MDK-ARM/DveC/height_cal.o create mode 100644 MDK-ARM/DveC/i2c.crf create mode 100644 MDK-ARM/DveC/i2c.d create mode 100644 MDK-ARM/DveC/i2c.o create mode 100644 MDK-ARM/DveC/i2c_1.crf create mode 100644 MDK-ARM/DveC/i2c_1.d create mode 100644 MDK-ARM/DveC/i2c_1.o create mode 100644 MDK-ARM/DveC/init.crf create mode 100644 MDK-ARM/DveC/init.d create mode 100644 MDK-ARM/DveC/init.o create mode 100644 MDK-ARM/DveC/ist8310.crf create mode 100644 MDK-ARM/DveC/ist8310.d create mode 100644 MDK-ARM/DveC/ist8310.o create mode 100644 MDK-ARM/DveC/led_pwm.crf create mode 100644 MDK-ARM/DveC/led_pwm.d create mode 100644 MDK-ARM/DveC/led_pwm.o create mode 100644 MDK-ARM/DveC/list.crf create mode 100644 MDK-ARM/DveC/list.d create mode 100644 MDK-ARM/DveC/list.o create mode 100644 MDK-ARM/DveC/main.crf create mode 100644 MDK-ARM/DveC/main.d create mode 100644 MDK-ARM/DveC/main.o create mode 100644 MDK-ARM/DveC/main_control.crf create mode 100644 MDK-ARM/DveC/main_control.d create mode 100644 MDK-ARM/DveC/main_control.o create mode 100644 MDK-ARM/DveC/pid.crf create mode 100644 MDK-ARM/DveC/pid.d create mode 100644 MDK-ARM/DveC/pid.o create mode 100644 MDK-ARM/DveC/port.d create mode 100644 MDK-ARM/DveC/port.o create mode 100644 MDK-ARM/DveC/ps2.crf create mode 100644 MDK-ARM/DveC/ps2.d create mode 100644 MDK-ARM/DveC/ps2.o create mode 100644 MDK-ARM/DveC/ps2_1.crf create mode 100644 MDK-ARM/DveC/ps2_1.d create mode 100644 MDK-ARM/DveC/ps2_1.o create mode 100644 MDK-ARM/DveC/pwm.crf create mode 100644 MDK-ARM/DveC/pwm.d create mode 100644 MDK-ARM/DveC/pwm.o create mode 100644 MDK-ARM/DveC/queue.crf create mode 100644 MDK-ARM/DveC/queue.d create mode 100644 MDK-ARM/DveC/queue.o create mode 100644 MDK-ARM/DveC/spi.crf create mode 100644 MDK-ARM/DveC/spi.d create mode 100644 MDK-ARM/DveC/spi.o create mode 100644 MDK-ARM/DveC/spi_1.crf create mode 100644 MDK-ARM/DveC/spi_1.d create mode 100644 MDK-ARM/DveC/spi_1.o create mode 100644 MDK-ARM/DveC/spl06.crf create mode 100644 MDK-ARM/DveC/spl06.d create mode 100644 MDK-ARM/DveC/spl06.o create mode 100644 MDK-ARM/DveC/startup_stm32f407xx.d create mode 100644 MDK-ARM/DveC/startup_stm32f407xx.o create mode 100644 MDK-ARM/DveC/stm32f4xx_hal.crf create mode 100644 MDK-ARM/DveC/stm32f4xx_hal.d create mode 100644 MDK-ARM/DveC/stm32f4xx_hal.o create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_cortex.crf create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_cortex.d create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_cortex.o create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_dma.crf create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_dma.d create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_dma.o create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_dma_ex.crf create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_dma_ex.d create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_dma_ex.o create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_exti.crf create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_exti.d create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_exti.o create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_flash.crf create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_flash.d create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_flash.o create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_flash_ex.crf create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_flash_ex.d create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_flash_ex.o create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_flash_ramfunc.crf create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_flash_ramfunc.d create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_flash_ramfunc.o create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_gpio.crf create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_gpio.d create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_gpio.o create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_i2c.crf create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_i2c.d create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_i2c.o create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_i2c_ex.crf create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_i2c_ex.d create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_i2c_ex.o create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_msp.crf create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_msp.d create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_msp.o create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_pwr.crf create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_pwr.d create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_pwr.o create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_pwr_ex.crf create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_pwr_ex.d create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_pwr_ex.o create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_rcc.crf create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_rcc.d create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_rcc.o create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_rcc_ex.crf create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_rcc_ex.d create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_rcc_ex.o create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_spi.crf create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_spi.d create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_spi.o create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_tim.crf create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_tim.d create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_tim.o create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_tim_ex.crf create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_tim_ex.d create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_tim_ex.o create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_uart.crf create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_uart.d create mode 100644 MDK-ARM/DveC/stm32f4xx_hal_uart.o create mode 100644 MDK-ARM/DveC/stm32f4xx_it.crf create mode 100644 MDK-ARM/DveC/stm32f4xx_it.d create mode 100644 MDK-ARM/DveC/stm32f4xx_it.o create mode 100644 MDK-ARM/DveC/stream_buffer.crf create mode 100644 MDK-ARM/DveC/stream_buffer.d create mode 100644 MDK-ARM/DveC/stream_buffer.o create mode 100644 MDK-ARM/DveC/system_stm32f4xx.crf create mode 100644 MDK-ARM/DveC/system_stm32f4xx.d create mode 100644 MDK-ARM/DveC/system_stm32f4xx.o create mode 100644 MDK-ARM/DveC/tasks.crf create mode 100644 MDK-ARM/DveC/tasks.d create mode 100644 MDK-ARM/DveC/tasks.o create mode 100644 MDK-ARM/DveC/test1.crf create mode 100644 MDK-ARM/DveC/test1.d create mode 100644 MDK-ARM/DveC/test1.o create mode 100644 MDK-ARM/DveC/tim.crf create mode 100644 MDK-ARM/DveC/tim.d create mode 100644 MDK-ARM/DveC/tim.o create mode 100644 MDK-ARM/DveC/time.crf create mode 100644 MDK-ARM/DveC/time.d create mode 100644 MDK-ARM/DveC/time.o create mode 100644 MDK-ARM/DveC/timers.crf create mode 100644 MDK-ARM/DveC/timers.d create mode 100644 MDK-ARM/DveC/timers.o create mode 100644 MDK-ARM/DveC/uart.crf create mode 100644 MDK-ARM/DveC/uart.d create mode 100644 MDK-ARM/DveC/uart.o create mode 100644 MDK-ARM/DveC/usart.crf create mode 100644 MDK-ARM/DveC/usart.d create mode 100644 MDK-ARM/DveC/usart.o create mode 100644 MDK-ARM/DveC/user_math.crf create mode 100644 MDK-ARM/DveC/user_math.d create mode 100644 MDK-ARM/DveC/user_math.o create mode 100644 MDK-ARM/DveC/user_task.crf create mode 100644 MDK-ARM/DveC/user_task.d create mode 100644 MDK-ARM/DveC/user_task.o create mode 100644 MDK-ARM/JLinkLog.txt create mode 100644 MDK-ARM/RTE/_DveC/RTE_Components.h create mode 100644 MDK-ARM/startup_stm32f407xx.lst create mode 100644 MDK-ARM/startup_stm32f407xx.s create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/freertos_mpool.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/freertos_os2.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/LICENSE create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/croutine.c create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/event_groups.c create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/include/list.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/include/portable.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/include/queue.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/include/task.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/include/timers.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/list.c create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/portmacro.h create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/queue.c create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/tasks.c create mode 100644 Middlewares/Third_Party/FreeRTOS/Source/timers.c create mode 100644 User/bsp/bsp.h create mode 100644 User/bsp/buzzer_pwm.c create mode 100644 User/bsp/buzzer_pwm.h create mode 100644 User/bsp/delay.c create mode 100644 User/bsp/delay.h create mode 100644 User/bsp/dwt.c create mode 100644 User/bsp/dwt.h create mode 100644 User/bsp/flash.c create mode 100644 User/bsp/flash.h create mode 100644 User/bsp/gpio.c create mode 100644 User/bsp/gpio.h create mode 100644 User/bsp/i2c.c create mode 100644 User/bsp/i2c.h create mode 100644 User/bsp/led_pwm.c create mode 100644 User/bsp/led_pwm.h create mode 100644 User/bsp/pwm.c create mode 100644 User/bsp/pwm.h create mode 100644 User/bsp/spi.c create mode 100644 User/bsp/spi.h create mode 100644 User/bsp/time.c create mode 100644 User/bsp/time.h create mode 100644 User/bsp/uart.c create mode 100644 User/bsp/uart.h create mode 100644 User/component/ahrs.c create mode 100644 User/component/ahrs.h create mode 100644 User/component/filter.c create mode 100644 User/component/filter.h create mode 100644 User/component/fixed_height.c create mode 100644 User/component/fixed_height.h create mode 100644 User/component/pid.c create mode 100644 User/component/pid.h create mode 100644 User/component/user_math.c create mode 100644 User/component/user_math.h create mode 100644 User/device/SPL06.c create mode 100644 User/device/SPL06.h create mode 100644 User/device/bmi088.c create mode 100644 User/device/bmi088.h create mode 100644 User/device/device.h create mode 100644 User/device/ist8310.c create mode 100644 User/device/ist8310.h create mode 100644 User/device/ps2.c create mode 100644 User/device/ps2.h create mode 100644 User/module/config.c create mode 100644 User/module/easy_control.c create mode 100644 User/module/easy_control.h create mode 100644 User/module/quad_att_control.c create mode 100644 User/module/quad_att_control.h create mode 100644 User/module/quad_pos_control.c create mode 100644 User/module/quad_pos_control.h create mode 100644 User/module/quad_pos_control_math.c create mode 100644 User/module/quad_pos_control_math.h create mode 100644 User/task/atti_esti.c create mode 100644 User/task/height_cal.c create mode 100644 User/task/init.c create mode 100644 User/task/main_control.c create mode 100644 User/task/ps2.c create mode 100644 User/task/test1.c create mode 100644 User/task/user_task.c create mode 100644 User/task/user_task.h diff --git a/.mxproject b/.mxproject new file mode 100644 index 0000000..3cc053d --- /dev/null +++ b/.mxproject @@ -0,0 +1,39 @@ +[PreviousGenFiles] +AdvancedFolderStructure=true +HeaderFileListSize=10 +HeaderFiles#0=..\Core\Inc\gpio.h +HeaderFiles#1=..\Core\Inc\FreeRTOSConfig.h +HeaderFiles#2=..\Core\Inc\dma.h +HeaderFiles#3=..\Core\Inc\i2c.h +HeaderFiles#4=..\Core\Inc\spi.h +HeaderFiles#5=..\Core\Inc\tim.h +HeaderFiles#6=..\Core\Inc\usart.h +HeaderFiles#7=..\Core\Inc\stm32f4xx_it.h +HeaderFiles#8=..\Core\Inc\stm32f4xx_hal_conf.h +HeaderFiles#9=..\Core\Inc\main.h +HeaderFolderListSize=1 +HeaderPath#0=..\Core\Inc +HeaderFiles=; +SourceFileListSize=10 +SourceFiles#0=..\Core\Src\gpio.c +SourceFiles#1=..\Core\Src\freertos.c +SourceFiles#2=..\Core\Src\dma.c +SourceFiles#3=..\Core\Src\i2c.c +SourceFiles#4=..\Core\Src\spi.c +SourceFiles#5=..\Core\Src\tim.c +SourceFiles#6=..\Core\Src\usart.c +SourceFiles#7=..\Core\Src\stm32f4xx_it.c +SourceFiles#8=..\Core\Src\stm32f4xx_hal_msp.c +SourceFiles#9=..\Core\Src\main.c +SourceFolderListSize=1 +SourcePath#0=..\Core\Src +SourceFiles=; + +[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_i2c.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_i2c.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_spi.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_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_V2\cmsis_os2.h;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os.h;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\freertos_mpool.h;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\freertos_os2.h;Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\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_i2c.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_spi.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_V2\cmsis_os2.c;Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang\heap_4.c;Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\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_i2c.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_i2c.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_spi.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_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_V2\cmsis_os2.h;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os.h;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\freertos_mpool.h;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\freertos_os2.h;Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h;Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c;Drivers\CMSIS\Include\cachel1_armv7.h;Drivers\CMSIS\Include\cmsis_armcc.h;Drivers\CMSIS\Include\cmsis_armclang.h;Drivers\CMSIS\Include\cmsis_armclang_ltm.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_armv81mml.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_cm35p.h;Drivers\CMSIS\Include\core_cm4.h;Drivers\CMSIS\Include\core_cm55.h;Drivers\CMSIS\Include\core_cm7.h;Drivers\CMSIS\Include\core_cm85.h;Drivers\CMSIS\Include\core_sc000.h;Drivers\CMSIS\Include\core_sc300.h;Drivers\CMSIS\Include\core_starmc1.h;Drivers\CMSIS\Include\mpu_armv7.h;Drivers\CMSIS\Include\mpu_armv8.h;Drivers\CMSIS\Include\pac_armv81.h;Drivers\CMSIS\Include\pmu_armv8.h;Drivers\CMSIS\Include\tz_context.h; + +[PreviousUsedKeilFiles] +SourceFiles=..\Core\Src\main.c;..\Core\Src\gpio.c;..\Core\Src\freertos.c;..\Core\Src\dma.c;..\Core\Src\i2c.c;..\Core\Src\spi.c;..\Core\Src\tim.c;..\Core\Src\usart.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_i2c.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_spi.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_V2\cmsis_os2.c;..\Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang\heap_4.c;..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\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_i2c.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_spi.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_V2\cmsis_os2.c;..\Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang\heap_4.c;..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\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_V2\cmsis_os2.c;..\Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang\heap_4.c;..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\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_V2;..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F;..\Drivers\CMSIS\Device\ST\STM32F4xx\Include;..\Drivers\CMSIS\Include;..\Core\Inc; +CDefines=USE_HAL_DRIVER;STM32F407xx;USE_HAL_DRIVER;USE_HAL_DRIVER; + diff --git a/Core/Inc/FreeRTOSConfig.h b/Core/Inc/FreeRTOSConfig.h new file mode 100644 index 0000000..561795b --- /dev/null +++ b/Core/Inc/FreeRTOSConfig.h @@ -0,0 +1,171 @@ +/* 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 +#ifndef CMSIS_device_header +#define CMSIS_device_header "stm32f4xx.h" +#endif /* CMSIS_device_header */ + +#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 ( 56 ) +#define configMINIMAL_STACK_SIZE ((uint16_t)128) +#define configTOTAL_HEAP_SIZE ((size_t)15360) +#define configMAX_TASK_NAME_LEN ( 16 ) +#define configUSE_TRACE_FACILITY 1 +#define configUSE_16_BIT_TICKS 0 +#define configUSE_MUTEXES 1 +#define configQUEUE_REGISTRY_SIZE 8 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configUSE_COUNTING_SEMAPHORES 1 +#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 +/* 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 ) + +/* Software timer definitions. */ +#define configUSE_TIMERS 1 +#define configTIMER_TASK_PRIORITY ( 2 ) +#define configTIMER_QUEUE_LENGTH 10 +#define configTIMER_TASK_STACK_DEPTH 256 + +/* CMSIS-RTOS V2 flags */ +#define configUSE_OS2_THREAD_SUSPEND_RESUME 1 +#define configUSE_OS2_THREAD_ENUMERATE 1 +#define configUSE_OS2_EVENTFLAGS_FROM_ISR 1 +#define configUSE_OS2_THREAD_FLAGS 1 +#define configUSE_OS2_TIMER 1 +#define configUSE_OS2_MUTEX 1 + +/* 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 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_xTaskGetSchedulerState 1 +#define INCLUDE_xTimerPendFunctionCall 1 +#define INCLUDE_xQueueGetMutexHolder 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 +#define INCLUDE_xTaskGetCurrentTaskHandle 1 +#define INCLUDE_eTaskGetState 1 + +/* + * The CMSIS-RTOS V2 FreeRTOS wrapper is dependent on the heap implementation used + * by the application thus the correct define need to be enabled below + */ +#define USE_FreeRTOS_HEAP_4 + +/* 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: After 10.3.1 update, Systick_Handler comes from NVIC (if SYS timebase = systick), otherwise from cmsis_os2.c */ + +#define USE_CUSTOM_SYSTICK_HANDLER_IMPLEMENTATION 1 + +/* 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/Core/Inc/dma.h b/Core/Inc/dma.h new file mode 100644 index 0000000..493d98e --- /dev/null +++ b/Core/Inc/dma.h @@ -0,0 +1,52 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file dma.h + * @brief This file contains all the function prototypes for + * the dma.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __DMA_H__ +#define __DMA_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* DMA memory to memory transfer handles -------------------------------------*/ + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_DMA_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __DMA_H__ */ + diff --git a/Core/Inc/gpio.h b/Core/Inc/gpio.h new file mode 100644 index 0000000..9ac4857 --- /dev/null +++ b/Core/Inc/gpio.h @@ -0,0 +1,49 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file gpio.h + * @brief This file contains all the function prototypes for + * the gpio.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __GPIO_H__ +#define __GPIO_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_GPIO_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif +#endif /*__ GPIO_H__ */ + diff --git a/Core/Inc/i2c.h b/Core/Inc/i2c.h new file mode 100644 index 0000000..2f8610a --- /dev/null +++ b/Core/Inc/i2c.h @@ -0,0 +1,55 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file i2c.h + * @brief This file contains all the function prototypes for + * the i2c.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __I2C_H__ +#define __I2C_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern I2C_HandleTypeDef hi2c2; + +extern I2C_HandleTypeDef hi2c3; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_I2C2_Init(void); +void MX_I2C3_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __I2C_H__ */ + diff --git a/Core/Inc/main.h b/Core/Inc/main.h new file mode 100644 index 0000000..ee1fa81 --- /dev/null +++ b/Core/Inc/main.h @@ -0,0 +1,108 @@ +/* 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) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* 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 CMPS_RST_Pin GPIO_PIN_6 +#define CMPS_RST_GPIO_Port GPIOG +#define IMU_HEAT_PWM_Pin GPIO_PIN_6 +#define IMU_HEAT_PWM_GPIO_Port GPIOF +#define LED_R_Pin GPIO_PIN_12 +#define LED_R_GPIO_Port GPIOH +#define CMPS_INT_Pin GPIO_PIN_3 +#define CMPS_INT_GPIO_Port GPIOG +#define CMPS_INT_EXTI_IRQn EXTI3_IRQn +#define LED_G_Pin GPIO_PIN_11 +#define LED_G_GPIO_Port GPIOH +#define LED_B_Pin GPIO_PIN_10 +#define LED_B_GPIO_Port GPIOH +#define ACCL_CS_Pin GPIO_PIN_4 +#define ACCL_CS_GPIO_Port GPIOA +#define ACCL_INT_Pin GPIO_PIN_4 +#define ACCL_INT_GPIO_Port GPIOC +#define ACCL_INT_EXTI_IRQn EXTI4_IRQn +#define MOTOR_OUT3_Pin GPIO_PIN_13 +#define MOTOR_OUT3_GPIO_Port GPIOE +#define GYRO_INT_Pin GPIO_PIN_5 +#define GYRO_INT_GPIO_Port GPIOC +#define GYRO_INT_EXTI_IRQn EXTI9_5_IRQn +#define MOTOR_OUT1_Pin GPIO_PIN_9 +#define MOTOR_OUT1_GPIO_Port GPIOE +#define MOTOR_OUT2_Pin GPIO_PIN_11 +#define MOTOR_OUT2_GPIO_Port GPIOE +#define MOTOR_OUT4_Pin GPIO_PIN_14 +#define MOTOR_OUT4_GPIO_Port GPIOE +#define PS2_CS_Pin GPIO_PIN_12 +#define PS2_CS_GPIO_Port GPIOB +#define PS2_CLK_Pin GPIO_PIN_13 +#define PS2_CLK_GPIO_Port GPIOB +#define GYRO_CS_Pin GPIO_PIN_0 +#define GYRO_CS_GPIO_Port GPIOB +#define PS2_DI_Pin GPIO_PIN_14 +#define PS2_DI_GPIO_Port GPIOB +#define PS2_DO_Pin GPIO_PIN_15 +#define PS2_DO_GPIO_Port GPIOB + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ diff --git a/Core/Inc/spi.h b/Core/Inc/spi.h new file mode 100644 index 0000000..bf3fa2d --- /dev/null +++ b/Core/Inc/spi.h @@ -0,0 +1,52 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file spi.h + * @brief This file contains all the function prototypes for + * the spi.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __SPI_H__ +#define __SPI_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern SPI_HandleTypeDef hspi1; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_SPI1_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SPI_H__ */ + diff --git a/Core/Inc/stm32f4xx_hal_conf.h b/Core/Inc/stm32f4xx_hal_conf.h new file mode 100644 index 0000000..d1486b1 --- /dev/null +++ b/Core/Inc/stm32f4xx_hal_conf.h @@ -0,0 +1,495 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_hal_conf_template.h + * @author MCD Application Team + * @brief HAL configuration template file. + * This file should be copied to the application folder and renamed + * to stm32f4xx_hal_conf.h. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CONF_H +#define __STM32F4xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED + + /* #define HAL_CRYP_MODULE_ENABLED */ +/* #define HAL_ADC_MODULE_ENABLED */ +/* #define HAL_CAN_MODULE_ENABLED */ +/* #define HAL_CRC_MODULE_ENABLED */ +/* #define HAL_CAN_LEGACY_MODULE_ENABLED */ +/* #define HAL_DAC_MODULE_ENABLED */ +/* #define HAL_DCMI_MODULE_ENABLED */ +/* #define HAL_DMA2D_MODULE_ENABLED */ +/* #define HAL_ETH_MODULE_ENABLED */ +/* #define HAL_ETH_LEGACY_MODULE_ENABLED */ +/* #define HAL_NAND_MODULE_ENABLED */ +/* #define HAL_NOR_MODULE_ENABLED */ +/* #define HAL_PCCARD_MODULE_ENABLED */ +/* #define HAL_SRAM_MODULE_ENABLED */ +/* #define HAL_SDRAM_MODULE_ENABLED */ +/* #define HAL_HASH_MODULE_ENABLED */ +#define HAL_I2C_MODULE_ENABLED +/* #define HAL_I2S_MODULE_ENABLED */ +/* #define HAL_IWDG_MODULE_ENABLED */ +/* #define HAL_LTDC_MODULE_ENABLED */ +/* #define HAL_RNG_MODULE_ENABLED */ +/* #define HAL_RTC_MODULE_ENABLED */ +/* #define HAL_SAI_MODULE_ENABLED */ +/* #define HAL_SD_MODULE_ENABLED */ +/* #define HAL_MMC_MODULE_ENABLED */ +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +#define HAL_UART_MODULE_ENABLED +/* #define HAL_USART_MODULE_ENABLED */ +/* #define HAL_IRDA_MODULE_ENABLED */ +/* #define HAL_SMARTCARD_MODULE_ENABLED */ +/* #define HAL_SMBUS_MODULE_ENABLED */ +/* #define HAL_WWDG_MODULE_ENABLED */ +/* #define HAL_PCD_MODULE_ENABLED */ +/* #define HAL_HCD_MODULE_ENABLED */ +/* #define HAL_DSI_MODULE_ENABLED */ +/* #define HAL_QSPI_MODULE_ENABLED */ +/* #define HAL_QSPI_MODULE_ENABLED */ +/* #define HAL_CEC_MODULE_ENABLED */ +/* #define HAL_FMPI2C_MODULE_ENABLED */ +/* #define HAL_FMPSMBUS_MODULE_ENABLED */ +/* #define HAL_SPDIFRX_MODULE_ENABLED */ +/* #define HAL_DFSDM_MODULE_ENABLED */ +/* #define HAL_LPTIM_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED + +/* ########################## HSE/HSI Values adaptation ##################### */ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE 12000000U /*!< 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 ETH_MAX_PACKET_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB 4U /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB 4U /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848_PHY_ADDRESS Address*/ +#define DP83848_PHY_ADDRESS +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY 0x000000FFU +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY 0x00000FFFU + +#define PHY_READ_TO 0x0000FFFFU +#define PHY_WRITE_TO 0x0000FFFFU + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ +#define PHY_SR ((uint16_t)) /*!< PHY status register Offset */ + +#define PHY_SPEED_STATUS ((uint16_t)) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)) /*!< PHY Duplex mask */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver +* Activated: CRC code is present inside driver +* Deactivated: CRC code cleaned from driver +*/ + +#define USE_SPI_CRC 0U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32f4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32f4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32f4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32f4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32f4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32f4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CAN_LEGACY_MODULE_ENABLED + #include "stm32f4xx_hal_can_legacy.h" +#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32f4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32f4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32f4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32f4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32f4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED + #include "stm32f4xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_ETH_LEGACY_MODULE_ENABLED + #include "stm32f4xx_hal_eth_legacy.h" +#endif /* HAL_ETH_LEGACY_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32f4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32f4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32f4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED + #include "stm32f4xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32f4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32f4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED + #include "stm32f4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32f4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32f4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "stm32f4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32f4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32f4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32f4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32f4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32f4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32f4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32f4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32f4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32f4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32f4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32f4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32f4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32f4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32f4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32f4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32f4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED + #include "stm32f4xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_FMPI2C_MODULE_ENABLED + #include "stm32f4xx_hal_fmpi2c.h" +#endif /* HAL_FMPI2C_MODULE_ENABLED */ + +#ifdef HAL_FMPSMBUS_MODULE_ENABLED + #include "stm32f4xx_hal_fmpsmbus.h" +#endif /* HAL_FMPSMBUS_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED + #include "stm32f4xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED + #include "stm32f4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "stm32f4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32f4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_CONF_H */ diff --git a/Core/Inc/stm32f4xx_it.h b/Core/Inc/stm32f4xx_it.h new file mode 100644 index 0000000..e41f5f1 --- /dev/null +++ b/Core/Inc/stm32f4xx_it.h @@ -0,0 +1,72 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* 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); +void EXTI3_IRQHandler(void); +void EXTI4_IRQHandler(void); +void DMA1_Stream2_IRQHandler(void); +void EXTI9_5_IRQHandler(void); +void DMA2_Stream1_IRQHandler(void); +void DMA2_Stream2_IRQHandler(void); +void DMA2_Stream3_IRQHandler(void); +void USART6_IRQHandler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_IT_H */ diff --git a/Core/Inc/tim.h b/Core/Inc/tim.h new file mode 100644 index 0000000..8b1162f --- /dev/null +++ b/Core/Inc/tim.h @@ -0,0 +1,63 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file tim.h + * @brief This file contains all the function prototypes for + * the tim.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __TIM_H__ +#define __TIM_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern TIM_HandleTypeDef htim1; + +extern TIM_HandleTypeDef htim4; + +extern TIM_HandleTypeDef htim5; + +extern TIM_HandleTypeDef htim10; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_TIM1_Init(void); +void MX_TIM4_Init(void); +void MX_TIM5_Init(void); +void MX_TIM10_Init(void); + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __TIM_H__ */ + diff --git a/Core/Inc/usart.h b/Core/Inc/usart.h new file mode 100644 index 0000000..5aeed10 --- /dev/null +++ b/Core/Inc/usart.h @@ -0,0 +1,52 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file usart.h + * @brief This file contains all the function prototypes for + * the usart.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USART_H__ +#define __USART_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern UART_HandleTypeDef huart6; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_USART6_UART_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USART_H__ */ + diff --git a/Core/Src/dma.c b/Core/Src/dma.c new file mode 100644 index 0000000..d3a77ba --- /dev/null +++ b/Core/Src/dma.c @@ -0,0 +1,65 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file dma.c + * @brief This file provides code for the configuration + * of all the requested memory to memory DMA transfers. + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "dma.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/*----------------------------------------------------------------------------*/ +/* Configure DMA */ +/*----------------------------------------------------------------------------*/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/** + * Enable DMA controller clock + */ +void MX_DMA_Init(void) +{ + + /* DMA controller clock enable */ + __HAL_RCC_DMA1_CLK_ENABLE(); + __HAL_RCC_DMA2_CLK_ENABLE(); + + /* DMA interrupt init */ + /* DMA1_Stream2_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Stream2_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(DMA1_Stream2_IRQn); + /* DMA2_Stream1_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn); + /* DMA2_Stream2_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn); + /* DMA2_Stream3_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn); + +} + +/* USER CODE BEGIN 2 */ + +/* USER CODE END 2 */ + diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c new file mode 100644 index 0000000..8a81b40 --- /dev/null +++ b/Core/Src/freertos.c @@ -0,0 +1,129 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * File Name : freertos.c + * Description : Code for freertos applications + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "FreeRTOS.h" +#include "task.h" +#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 ---------------------------------------------------------*/ +/* USER CODE BEGIN Variables */ + +/* USER CODE END Variables */ +/* Definitions for defaultTask */ +osThreadId_t defaultTaskHandle; +const osThreadAttr_t defaultTask_attributes = { + .name = "defaultTask", + .stack_size = 128 * 4, + .priority = (osPriority_t) osPriorityNormal, +}; + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN FunctionPrototypes */ + +/* USER CODE END FunctionPrototypes */ + +void StartDefaultTask(void *argument); + +void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ + +/** + * @brief FreeRTOS initialization + * @param None + * @retval None + */ +void MX_FREERTOS_Init(void) { + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* 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) */ + /* creation of defaultTask */ + defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes); + + /* USER CODE BEGIN RTOS_THREADS */ + /* add threads, ... */ + /* USER CODE END RTOS_THREADS */ + + /* USER CODE BEGIN RTOS_EVENTS */ + /* add events, ... */ + /* USER CODE END RTOS_EVENTS */ + +} + +/* 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 *argument) +{ + /* USER CODE BEGIN StartDefaultTask */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END StartDefaultTask */ +} + +/* Private application code --------------------------------------------------*/ +/* USER CODE BEGIN Application */ + +/* USER CODE END Application */ + diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c new file mode 100644 index 0000000..3fcbfff --- /dev/null +++ b/Core/Src/gpio.c @@ -0,0 +1,126 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file gpio.c + * @brief This file provides code for the configuration + * of all used GPIO pins. + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "gpio.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/*----------------------------------------------------------------------------*/ +/* Configure GPIO */ +/*----------------------------------------------------------------------------*/ +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/** Configure pins as + * Analog + * Input + * Output + * EVENT_OUT + * EXTI +*/ +void MX_GPIO_Init(void) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOG_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOF_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + __HAL_RCC_GPIOE_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(CMPS_RST_GPIO_Port, CMPS_RST_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(ACCL_CS_GPIO_Port, ACCL_CS_Pin, GPIO_PIN_SET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOB, PS2_CS_Pin|PS2_CLK_Pin|GYRO_CS_Pin|PS2_DO_Pin, GPIO_PIN_SET); + + /*Configure GPIO pin : CMPS_RST_Pin */ + GPIO_InitStruct.Pin = CMPS_RST_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; + HAL_GPIO_Init(CMPS_RST_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : CMPS_INT_Pin */ + GPIO_InitStruct.Pin = CMPS_INT_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_PULLUP; + HAL_GPIO_Init(CMPS_INT_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : ACCL_CS_Pin */ + GPIO_InitStruct.Pin = ACCL_CS_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; + HAL_GPIO_Init(ACCL_CS_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pins : ACCL_INT_Pin GYRO_INT_Pin */ + GPIO_InitStruct.Pin = ACCL_INT_Pin|GYRO_INT_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_PULLUP; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /*Configure GPIO pins : PS2_CS_Pin PS2_CLK_Pin PS2_DO_Pin */ + GPIO_InitStruct.Pin = PS2_CS_Pin|PS2_CLK_Pin|PS2_DO_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /*Configure GPIO pin : GYRO_CS_Pin */ + GPIO_InitStruct.Pin = GYRO_CS_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; + HAL_GPIO_Init(GYRO_CS_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : PS2_DI_Pin */ + GPIO_InitStruct.Pin = PS2_DI_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_PULLUP; + HAL_GPIO_Init(PS2_DI_GPIO_Port, &GPIO_InitStruct); + + /* EXTI interrupt init*/ + HAL_NVIC_SetPriority(EXTI3_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(EXTI3_IRQn); + + HAL_NVIC_SetPriority(EXTI4_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(EXTI4_IRQn); + + HAL_NVIC_SetPriority(EXTI9_5_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); + +} + +/* USER CODE BEGIN 2 */ + +/* USER CODE END 2 */ diff --git a/Core/Src/i2c.c b/Core/Src/i2c.c new file mode 100644 index 0000000..98845cb --- /dev/null +++ b/Core/Src/i2c.c @@ -0,0 +1,221 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file i2c.c + * @brief This file provides code for the configuration + * of the I2C instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "i2c.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +I2C_HandleTypeDef hi2c2; +I2C_HandleTypeDef hi2c3; +DMA_HandleTypeDef hdma_i2c3_rx; + +/* I2C2 init function */ +void MX_I2C2_Init(void) +{ + + /* USER CODE BEGIN I2C2_Init 0 */ + + /* USER CODE END I2C2_Init 0 */ + + /* USER CODE BEGIN I2C2_Init 1 */ + + /* USER CODE END I2C2_Init 1 */ + hi2c2.Instance = I2C2; + hi2c2.Init.ClockSpeed = 100000; + hi2c2.Init.DutyCycle = I2C_DUTYCYCLE_2; + hi2c2.Init.OwnAddress1 = 0; + hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + hi2c2.Init.OwnAddress2 = 0; + hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&hi2c2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN I2C2_Init 2 */ + + /* USER CODE END I2C2_Init 2 */ + +} +/* I2C3 init function */ +void MX_I2C3_Init(void) +{ + + /* USER CODE BEGIN I2C3_Init 0 */ + + /* USER CODE END I2C3_Init 0 */ + + /* USER CODE BEGIN I2C3_Init 1 */ + + /* USER CODE END I2C3_Init 1 */ + hi2c3.Instance = I2C3; + hi2c3.Init.ClockSpeed = 400000; + hi2c3.Init.DutyCycle = I2C_DUTYCYCLE_2; + hi2c3.Init.OwnAddress1 = 0; + hi2c3.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + hi2c3.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + hi2c3.Init.OwnAddress2 = 0; + hi2c3.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + hi2c3.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&hi2c3) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN I2C3_Init 2 */ + + /* USER CODE END I2C3_Init 2 */ + +} + +void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(i2cHandle->Instance==I2C2) + { + /* USER CODE BEGIN I2C2_MspInit 0 */ + + /* USER CODE END I2C2_MspInit 0 */ + + __HAL_RCC_GPIOF_CLK_ENABLE(); + /**I2C2 GPIO Configuration + PF0 ------> I2C2_SDA + PF1 ------> I2C2_SCL + */ + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C2; + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + + /* I2C2 clock enable */ + __HAL_RCC_I2C2_CLK_ENABLE(); + /* USER CODE BEGIN I2C2_MspInit 1 */ + + /* USER CODE END I2C2_MspInit 1 */ + } + else if(i2cHandle->Instance==I2C3) + { + /* USER CODE BEGIN I2C3_MspInit 0 */ + + /* USER CODE END I2C3_MspInit 0 */ + + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**I2C3 GPIO Configuration + PC9 ------> I2C3_SDA + PA8 ------> I2C3_SCL + */ + GPIO_InitStruct.Pin = GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C3; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_8; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C3; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* I2C3 clock enable */ + __HAL_RCC_I2C3_CLK_ENABLE(); + + /* I2C3 DMA Init */ + /* I2C3_RX Init */ + hdma_i2c3_rx.Instance = DMA1_Stream2; + hdma_i2c3_rx.Init.Channel = DMA_CHANNEL_3; + hdma_i2c3_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma_i2c3_rx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_i2c3_rx.Init.MemInc = DMA_MINC_ENABLE; + hdma_i2c3_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_i2c3_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_i2c3_rx.Init.Mode = DMA_NORMAL; + hdma_i2c3_rx.Init.Priority = DMA_PRIORITY_LOW; + hdma_i2c3_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + if (HAL_DMA_Init(&hdma_i2c3_rx) != HAL_OK) + { + Error_Handler(); + } + + __HAL_LINKDMA(i2cHandle,hdmarx,hdma_i2c3_rx); + + /* USER CODE BEGIN I2C3_MspInit 1 */ + + /* USER CODE END I2C3_MspInit 1 */ + } +} + +void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle) +{ + + if(i2cHandle->Instance==I2C2) + { + /* USER CODE BEGIN I2C2_MspDeInit 0 */ + + /* USER CODE END I2C2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_I2C2_CLK_DISABLE(); + + /**I2C2 GPIO Configuration + PF0 ------> I2C2_SDA + PF1 ------> I2C2_SCL + */ + HAL_GPIO_DeInit(GPIOF, GPIO_PIN_0); + + HAL_GPIO_DeInit(GPIOF, GPIO_PIN_1); + + /* USER CODE BEGIN I2C2_MspDeInit 1 */ + + /* USER CODE END I2C2_MspDeInit 1 */ + } + else if(i2cHandle->Instance==I2C3) + { + /* USER CODE BEGIN I2C3_MspDeInit 0 */ + + /* USER CODE END I2C3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_I2C3_CLK_DISABLE(); + + /**I2C3 GPIO Configuration + PC9 ------> I2C3_SDA + PA8 ------> I2C3_SCL + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_9); + + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_8); + + /* I2C3 DMA DeInit */ + HAL_DMA_DeInit(i2cHandle->hdmarx); + /* USER CODE BEGIN I2C3_MspDeInit 1 */ + + /* USER CODE END I2C3_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/Core/Src/main.c b/Core/Src/main.c new file mode 100644 index 0000000..3fe3f17 --- /dev/null +++ b/Core/Src/main.c @@ -0,0 +1,207 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "cmsis_os.h" +#include "dma.h" +#include "i2c.h" +#include "spi.h" +#include "tim.h" +#include "usart.h" +#include "gpio.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +void MX_FREERTOS_Init(void); +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_DMA_Init(); + MX_I2C2_Init(); + MX_I2C3_Init(); + MX_TIM1_Init(); + MX_TIM4_Init(); + MX_TIM5_Init(); + MX_TIM10_Init(); + MX_SPI1_Init(); + MX_USART6_UART_Init(); + /* USER CODE BEGIN 2 */ + + /* USER CODE END 2 */ + + /* Init scheduler */ + osKernelInitialize(); /* Call init function for freertos objects (in cmsis_os2.c) */ + MX_FREERTOS_Init(); + + /* 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_SCALE1); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 6; + RCC_OscInitStruct.PLL.PLLN = 168; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 4; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) + { + Error_Handler(); + } +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/Core/Src/spi.c b/Core/Src/spi.c new file mode 100644 index 0000000..ca5bbe2 --- /dev/null +++ b/Core/Src/spi.c @@ -0,0 +1,171 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file spi.c + * @brief This file provides code for the configuration + * of the SPI instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "spi.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +SPI_HandleTypeDef hspi1; +DMA_HandleTypeDef hdma_spi1_rx; +DMA_HandleTypeDef hdma_spi1_tx; + +/* SPI1 init function */ +void MX_SPI1_Init(void) +{ + + /* USER CODE BEGIN SPI1_Init 0 */ + + /* USER CODE END SPI1_Init 0 */ + + /* USER CODE BEGIN SPI1_Init 1 */ + + /* USER CODE END SPI1_Init 1 */ + hspi1.Instance = SPI1; + hspi1.Init.Mode = SPI_MODE_MASTER; + hspi1.Init.Direction = SPI_DIRECTION_2LINES; + hspi1.Init.DataSize = SPI_DATASIZE_8BIT; + hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; + hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; + hspi1.Init.NSS = SPI_NSS_SOFT; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi1.Init.CRCPolynomial = 10; + if (HAL_SPI_Init(&hspi1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI1_Init 2 */ + + /* USER CODE END SPI1_Init 2 */ + +} + +void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(spiHandle->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspInit 0 */ + + /* USER CODE END SPI1_MspInit 0 */ + /* SPI1 clock enable */ + __HAL_RCC_SPI1_CLK_ENABLE(); + + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**SPI1 GPIO Configuration + PB4 ------> SPI1_MISO + PB3 ------> SPI1_SCK + PA7 ------> SPI1_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* SPI1 DMA Init */ + /* SPI1_RX Init */ + hdma_spi1_rx.Instance = DMA2_Stream2; + hdma_spi1_rx.Init.Channel = DMA_CHANNEL_3; + hdma_spi1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma_spi1_rx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_spi1_rx.Init.MemInc = DMA_MINC_ENABLE; + hdma_spi1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_spi1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_spi1_rx.Init.Mode = DMA_NORMAL; + hdma_spi1_rx.Init.Priority = DMA_PRIORITY_LOW; + hdma_spi1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + if (HAL_DMA_Init(&hdma_spi1_rx) != HAL_OK) + { + Error_Handler(); + } + + __HAL_LINKDMA(spiHandle,hdmarx,hdma_spi1_rx); + + /* SPI1_TX Init */ + hdma_spi1_tx.Instance = DMA2_Stream3; + hdma_spi1_tx.Init.Channel = DMA_CHANNEL_3; + hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; + hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE; + hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_spi1_tx.Init.Mode = DMA_NORMAL; + hdma_spi1_tx.Init.Priority = DMA_PRIORITY_LOW; + hdma_spi1_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK) + { + Error_Handler(); + } + + __HAL_LINKDMA(spiHandle,hdmatx,hdma_spi1_tx); + + /* USER CODE BEGIN SPI1_MspInit 1 */ + + /* USER CODE END SPI1_MspInit 1 */ + } +} + +void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle) +{ + + if(spiHandle->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspDeInit 0 */ + + /* USER CODE END SPI1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI1_CLK_DISABLE(); + + /**SPI1 GPIO Configuration + PB4 ------> SPI1_MISO + PB3 ------> SPI1_SCK + PA7 ------> SPI1_MOSI + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_4|GPIO_PIN_3); + + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_7); + + /* SPI1 DMA DeInit */ + HAL_DMA_DeInit(spiHandle->hdmarx); + HAL_DMA_DeInit(spiHandle->hdmatx); + /* USER CODE BEGIN SPI1_MspDeInit 1 */ + + /* USER CODE END SPI1_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/Core/Src/stm32f4xx_hal_msp.c b/Core/Src/stm32f4xx_hal_msp.c new file mode 100644 index 0000000..14a8392 --- /dev/null +++ b/Core/Src/stm32f4xx_hal_msp.c @@ -0,0 +1,84 @@ +/* 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) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + /* PendSV_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0); + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/Core/Src/stm32f4xx_it.c b/Core/Src/stm32f4xx_it.c new file mode 100644 index 0000000..333b929 --- /dev/null +++ b/Core/Src/stm32f4xx_it.c @@ -0,0 +1,303 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* 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 --------------------------------------------------------*/ +extern DMA_HandleTypeDef hdma_i2c3_rx; +extern DMA_HandleTypeDef hdma_spi1_rx; +extern DMA_HandleTypeDef hdma_spi1_tx; +extern DMA_HandleTypeDef hdma_usart6_rx; +extern UART_HandleTypeDef huart6; +/* 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). */ +/******************************************************************************/ + +/** + * @brief This function handles EXTI line3 interrupt. + */ +void EXTI3_IRQHandler(void) +{ + /* USER CODE BEGIN EXTI3_IRQn 0 */ + + /* USER CODE END EXTI3_IRQn 0 */ + HAL_GPIO_EXTI_IRQHandler(CMPS_INT_Pin); + /* USER CODE BEGIN EXTI3_IRQn 1 */ + + /* USER CODE END EXTI3_IRQn 1 */ +} + +/** + * @brief This function handles EXTI line4 interrupt. + */ +void EXTI4_IRQHandler(void) +{ + /* USER CODE BEGIN EXTI4_IRQn 0 */ + + /* USER CODE END EXTI4_IRQn 0 */ + HAL_GPIO_EXTI_IRQHandler(ACCL_INT_Pin); + /* USER CODE BEGIN EXTI4_IRQn 1 */ + + /* USER CODE END EXTI4_IRQn 1 */ +} + +/** + * @brief This function handles DMA1 stream2 global interrupt. + */ +void DMA1_Stream2_IRQHandler(void) +{ + /* USER CODE BEGIN DMA1_Stream2_IRQn 0 */ + + /* USER CODE END DMA1_Stream2_IRQn 0 */ + HAL_DMA_IRQHandler(&hdma_i2c3_rx); + /* USER CODE BEGIN DMA1_Stream2_IRQn 1 */ + + /* USER CODE END DMA1_Stream2_IRQn 1 */ +} + +/** + * @brief This function handles EXTI line[9:5] interrupts. + */ +void EXTI9_5_IRQHandler(void) +{ + /* USER CODE BEGIN EXTI9_5_IRQn 0 */ + + /* USER CODE END EXTI9_5_IRQn 0 */ + HAL_GPIO_EXTI_IRQHandler(GYRO_INT_Pin); + /* USER CODE BEGIN EXTI9_5_IRQn 1 */ + + /* USER CODE END EXTI9_5_IRQn 1 */ +} + +/** + * @brief This function handles DMA2 stream1 global interrupt. + */ +void DMA2_Stream1_IRQHandler(void) +{ + /* USER CODE BEGIN DMA2_Stream1_IRQn 0 */ + + /* USER CODE END DMA2_Stream1_IRQn 0 */ + HAL_DMA_IRQHandler(&hdma_usart6_rx); + /* USER CODE BEGIN DMA2_Stream1_IRQn 1 */ + + /* USER CODE END DMA2_Stream1_IRQn 1 */ +} + +/** + * @brief This function handles DMA2 stream2 global interrupt. + */ +void DMA2_Stream2_IRQHandler(void) +{ + /* USER CODE BEGIN DMA2_Stream2_IRQn 0 */ + + /* USER CODE END DMA2_Stream2_IRQn 0 */ + HAL_DMA_IRQHandler(&hdma_spi1_rx); + /* USER CODE BEGIN DMA2_Stream2_IRQn 1 */ + + /* USER CODE END DMA2_Stream2_IRQn 1 */ +} + +/** + * @brief This function handles DMA2 stream3 global interrupt. + */ +void DMA2_Stream3_IRQHandler(void) +{ + /* USER CODE BEGIN DMA2_Stream3_IRQn 0 */ + + /* USER CODE END DMA2_Stream3_IRQn 0 */ + HAL_DMA_IRQHandler(&hdma_spi1_tx); + /* USER CODE BEGIN DMA2_Stream3_IRQn 1 */ + + /* USER CODE END DMA2_Stream3_IRQn 1 */ +} + +/** + * @brief This function handles USART6 global interrupt. + */ +void USART6_IRQHandler(void) +{ + /* USER CODE BEGIN USART6_IRQn 0 */ + + /* USER CODE END USART6_IRQn 0 */ + HAL_UART_IRQHandler(&huart6); + /* USER CODE BEGIN USART6_IRQn 1 */ + + /* USER CODE END USART6_IRQn 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/Core/Src/system_stm32f4xx.c b/Core/Src/system_stm32f4xx.c new file mode 100644 index 0000000..7a61e9c --- /dev/null +++ b/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. */ +#else +#define VECT_TAB_BASE_ADDRESS FLASH_BASE /*!< Vector Table base address field. + This value must be a multiple of 0x200. */ +#endif /* VECT_TAB_SRAM */ +#if !defined(VECT_TAB_OFFSET) +#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table offset field. + This value must be a multiple of 0x200. */ +#endif /* VECT_TAB_OFFSET */ +#endif /* USER_VECT_TAB_ADDRESS */ +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ +uint32_t SystemCoreClock = 16000000; +const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; +const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ + +#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) + static void SystemInit_ExtMemCtl(void); +#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the FPU setting, vector table location and External memory + * configuration. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ + #endif + +#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) + SystemInit_ExtMemCtl(); +#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ + + /* Configure the Vector Table location -------------------------------------*/ +#if defined(USER_VECT_TAB_ADDRESS) + SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#endif /* USER_VECT_TAB_ADDRESS */ +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value + * depends on the application requirements), user has to ensure that HSE_VALUE + * is same as the real frequency of the crystal used. Otherwise, this function + * may have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp, pllvco, pllp, pllsource, pllm; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock source */ + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N + SYSCLK = PLL_VCO / PLL_P + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + + if (pllsource != 0) + { + /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + + pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; + SystemCoreClock = pllvco/pllp; + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK frequency --------------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK frequency */ + SystemCoreClock >>= tmp; +} + +#if defined (DATA_IN_ExtSRAM) && defined (DATA_IN_ExtSDRAM) +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f4xx.s before jump to main. + * This function configures the external memories (SRAM/SDRAM) + * This SRAM/SDRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + __IO uint32_t tmp = 0x00; + + register uint32_t tmpreg = 0, timeout = 0xFFFF; + register __IO uint32_t index; + + /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface clock */ + RCC->AHB1ENR |= 0x000001F8; + + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x00CCC0CC; + GPIOD->AFR[1] = 0xCCCCCCCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xAAAA0A8A; + /* Configure PDx pins speed to 100 MHz */ + GPIOD->OSPEEDR = 0xFFFF0FCF; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00CC0CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA828A; + /* Configure PEx pins speed to 100 MHz */ + GPIOE->OSPEEDR = 0xFFFFC3CF; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0xCCCCCCCC; + GPIOF->AFR[1] = 0xCCCCCCCC; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA800AAA; + /* Configure PFx pins speed to 50 MHz */ + GPIOF->OSPEEDR = 0xAA800AAA; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0xCCCCCCCC; + GPIOG->AFR[1] = 0xCCCCCCCC; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0xAAAAAAAA; + /* Configure PGx pins speed to 50 MHz */ + GPIOG->OSPEEDR = 0xAAAAAAAA; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + + /* Connect PHx pins to FMC Alternate function */ + GPIOH->AFR[0] = 0x00C0CC00; + GPIOH->AFR[1] = 0xCCCCCCCC; + /* Configure PHx pins in Alternate function mode */ + GPIOH->MODER = 0xAAAA08A0; + /* Configure PHx pins speed to 50 MHz */ + GPIOH->OSPEEDR = 0xAAAA08A0; + /* Configure PHx pins Output type to push-pull */ + GPIOH->OTYPER = 0x00000000; + /* No pull-up, pull-down for PHx pins */ + GPIOH->PUPDR = 0x00000000; + + /* Connect PIx pins to FMC Alternate function */ + GPIOI->AFR[0] = 0xCCCCCCCC; + GPIOI->AFR[1] = 0x00000CC0; + /* Configure PIx pins in Alternate function mode */ + GPIOI->MODER = 0x0028AAAA; + /* Configure PIx pins speed to 50 MHz */ + GPIOI->OSPEEDR = 0x0028AAAA; + /* Configure PIx pins Output type to push-pull */ + GPIOI->OTYPER = 0x00000000; + /* No pull-up, pull-down for PIx pins */ + GPIOI->PUPDR = 0x00000000; + +/*-- FMC Configuration -------------------------------------------------------*/ + /* Enable the FMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + + FMC_Bank5_6->SDCR[0] = 0x000019E4; + FMC_Bank5_6->SDTR[0] = 0x01115351; + + /* SDRAM initialization sequence */ + /* Clock enable command */ + FMC_Bank5_6->SDCMR = 0x00000011; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Delay */ + for (index = 0; index<1000; index++); + + /* PALL command */ + FMC_Bank5_6->SDCMR = 0x00000012; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Auto refresh command */ + FMC_Bank5_6->SDCMR = 0x00000073; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* MRD register program */ + FMC_Bank5_6->SDCMR = 0x00046014; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Set refresh count */ + tmpreg = FMC_Bank5_6->SDRTR; + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); + + /* Disable write protection */ + tmpreg = FMC_Bank5_6->SDCR[0]; + FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001011; + FMC_Bank1->BTCR[3] = 0x00000201; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +#if defined(STM32F469xx) || defined(STM32F479xx) + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001091; + FMC_Bank1->BTCR[3] = 0x00110212; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F469xx || STM32F479xx */ + + (void)(tmp); +} +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +#elif defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f4xx.s before jump to main. + * This function configures the external memories (SRAM/SDRAM) + * This SRAM/SDRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + __IO uint32_t tmp = 0x00; +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#if defined (DATA_IN_ExtSDRAM) + register uint32_t tmpreg = 0, timeout = 0xFFFF; + register __IO uint32_t index; + +#if defined(STM32F446xx) + /* Enable GPIOA, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG interface + clock */ + RCC->AHB1ENR |= 0x0000007D; +#else + /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface + clock */ + RCC->AHB1ENR |= 0x000001F8; +#endif /* STM32F446xx */ + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); + +#if defined(STM32F446xx) + /* Connect PAx pins to FMC Alternate function */ + GPIOA->AFR[0] |= 0xC0000000; + GPIOA->AFR[1] |= 0x00000000; + /* Configure PDx pins in Alternate function mode */ + GPIOA->MODER |= 0x00008000; + /* Configure PDx pins speed to 50 MHz */ + GPIOA->OSPEEDR |= 0x00008000; + /* Configure PDx pins Output type to push-pull */ + GPIOA->OTYPER |= 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOA->PUPDR |= 0x00000000; + + /* Connect PCx pins to FMC Alternate function */ + GPIOC->AFR[0] |= 0x00CC0000; + GPIOC->AFR[1] |= 0x00000000; + /* Configure PDx pins in Alternate function mode */ + GPIOC->MODER |= 0x00000A00; + /* Configure PDx pins speed to 50 MHz */ + GPIOC->OSPEEDR |= 0x00000A00; + /* Configure PDx pins Output type to push-pull */ + GPIOC->OTYPER |= 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOC->PUPDR |= 0x00000000; +#endif /* STM32F446xx */ + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x000000CC; + GPIOD->AFR[1] = 0xCC000CCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xA02A000A; + /* Configure PDx pins speed to 50 MHz */ + GPIOD->OSPEEDR = 0xA02A000A; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00000CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA800A; + /* Configure PEx pins speed to 50 MHz */ + GPIOE->OSPEEDR = 0xAAAA800A; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0xCCCCCCCC; + GPIOF->AFR[1] = 0xCCCCCCCC; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA800AAA; + /* Configure PFx pins speed to 50 MHz */ + GPIOF->OSPEEDR = 0xAA800AAA; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0xCCCCCCCC; + GPIOG->AFR[1] = 0xCCCCCCCC; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0xAAAAAAAA; + /* Configure PGx pins speed to 50 MHz */ + GPIOG->OSPEEDR = 0xAAAAAAAA; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) + /* Connect PHx pins to FMC Alternate function */ + GPIOH->AFR[0] = 0x00C0CC00; + GPIOH->AFR[1] = 0xCCCCCCCC; + /* Configure PHx pins in Alternate function mode */ + GPIOH->MODER = 0xAAAA08A0; + /* Configure PHx pins speed to 50 MHz */ + GPIOH->OSPEEDR = 0xAAAA08A0; + /* Configure PHx pins Output type to push-pull */ + GPIOH->OTYPER = 0x00000000; + /* No pull-up, pull-down for PHx pins */ + GPIOH->PUPDR = 0x00000000; + + /* Connect PIx pins to FMC Alternate function */ + GPIOI->AFR[0] = 0xCCCCCCCC; + GPIOI->AFR[1] = 0x00000CC0; + /* Configure PIx pins in Alternate function mode */ + GPIOI->MODER = 0x0028AAAA; + /* Configure PIx pins speed to 50 MHz */ + GPIOI->OSPEEDR = 0x0028AAAA; + /* Configure PIx pins Output type to push-pull */ + GPIOI->OTYPER = 0x00000000; + /* No pull-up, pull-down for PIx pins */ + GPIOI->PUPDR = 0x00000000; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +/*-- FMC Configuration -------------------------------------------------------*/ + /* Enable the FMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + + /* Configure and enable SDRAM bank1 */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCR[0] = 0x00001954; +#else + FMC_Bank5_6->SDCR[0] = 0x000019E4; +#endif /* STM32F446xx */ + FMC_Bank5_6->SDTR[0] = 0x01115351; + + /* SDRAM initialization sequence */ + /* Clock enable command */ + FMC_Bank5_6->SDCMR = 0x00000011; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Delay */ + for (index = 0; index<1000; index++); + + /* PALL command */ + FMC_Bank5_6->SDCMR = 0x00000012; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Auto refresh command */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCMR = 0x000000F3; +#else + FMC_Bank5_6->SDCMR = 0x00000073; +#endif /* STM32F446xx */ + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* MRD register program */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCMR = 0x00044014; +#else + FMC_Bank5_6->SDCMR = 0x00046014; +#endif /* STM32F446xx */ + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Set refresh count */ + tmpreg = FMC_Bank5_6->SDRTR; +#if defined(STM32F446xx) + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1)); +#else + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); +#endif /* STM32F446xx */ + + /* Disable write protection */ + tmpreg = FMC_Bank5_6->SDCR[0]; + FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); +#endif /* DATA_IN_ExtSDRAM */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ + || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) + +#if defined(DATA_IN_ExtSRAM) +/*-- GPIOs Configuration -----------------------------------------------------*/ + /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ + RCC->AHB1ENR |= 0x00000078; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN); + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x00CCC0CC; + GPIOD->AFR[1] = 0xCCCCCCCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xAAAA0A8A; + /* Configure PDx pins speed to 100 MHz */ + GPIOD->OSPEEDR = 0xFFFF0FCF; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00CC0CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA828A; + /* Configure PEx pins speed to 100 MHz */ + GPIOE->OSPEEDR = 0xFFFFC3CF; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0x00CCCCCC; + GPIOF->AFR[1] = 0xCCCC0000; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA000AAA; + /* Configure PFx pins speed to 100 MHz */ + GPIOF->OSPEEDR = 0xFF000FFF; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0x00CCCCCC; + GPIOG->AFR[1] = 0x000000C0; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0x00085AAA; + /* Configure PGx pins speed to 100 MHz */ + GPIOG->OSPEEDR = 0x000CAFFF; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + +/*-- FMC/FSMC Configuration --------------------------------------------------*/ + /* Enable the FMC/FSMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001011; + FMC_Bank1->BTCR[3] = 0x00000201; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +#if defined(STM32F469xx) || defined(STM32F479xx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001091; + FMC_Bank1->BTCR[3] = 0x00110212; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F469xx || STM32F479xx */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)\ + || defined(STM32F412Zx) || defined(STM32F412Vx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN); + /* Configure and enable Bank1_SRAM2 */ + FSMC_Bank1->BTCR[2] = 0x00001011; + FSMC_Bank1->BTCR[3] = 0x00000201; + FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF; +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F412Zx || STM32F412Vx */ + +#endif /* DATA_IN_ExtSRAM */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\ + STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx */ + (void)(tmp); +} +#endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ diff --git a/Core/Src/tim.c b/Core/Src/tim.c new file mode 100644 index 0000000..1aff6a9 --- /dev/null +++ b/Core/Src/tim.c @@ -0,0 +1,446 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file tim.c + * @brief This file provides code for the configuration + * of the TIM instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "tim.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +TIM_HandleTypeDef htim1; +TIM_HandleTypeDef htim4; +TIM_HandleTypeDef htim5; +TIM_HandleTypeDef htim10; + +/* TIM1 init function */ +void MX_TIM1_Init(void) +{ + + /* USER CODE BEGIN TIM1_Init 0 */ + + /* USER CODE END TIM1_Init 0 */ + + TIM_MasterConfigTypeDef sMasterConfig = {0}; + TIM_OC_InitTypeDef sConfigOC = {0}; + TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; + + /* USER CODE BEGIN TIM1_Init 1 */ + + /* USER CODE END TIM1_Init 1 */ + htim1.Instance = TIM1; + htim1.Init.Prescaler = 167; + htim1.Init.CounterMode = TIM_COUNTERMODE_UP; + htim1.Init.Period = 65535; + htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim1.Init.RepetitionCounter = 0; + htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_PWM_Init(&htim1) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; + sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; + if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4) != HAL_OK) + { + Error_Handler(); + } + sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; + sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; + sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; + sBreakDeadTimeConfig.DeadTime = 0; + sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; + sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; + sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; + if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM1_Init 2 */ + + /* USER CODE END TIM1_Init 2 */ + HAL_TIM_MspPostInit(&htim1); + +} +/* TIM4 init function */ +void MX_TIM4_Init(void) +{ + + /* USER CODE BEGIN TIM4_Init 0 */ + + /* USER CODE END TIM4_Init 0 */ + + TIM_MasterConfigTypeDef sMasterConfig = {0}; + TIM_OC_InitTypeDef sConfigOC = {0}; + + /* USER CODE BEGIN TIM4_Init 1 */ + + /* USER CODE END TIM4_Init 1 */ + htim4.Instance = TIM4; + htim4.Init.Prescaler = 167; + htim4.Init.CounterMode = TIM_COUNTERMODE_UP; + htim4.Init.Period = 65535; + htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_PWM_Init(&htim4) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM4_Init 2 */ + + /* USER CODE END TIM4_Init 2 */ + HAL_TIM_MspPostInit(&htim4); + +} +/* TIM5 init function */ +void MX_TIM5_Init(void) +{ + + /* USER CODE BEGIN TIM5_Init 0 */ + + /* USER CODE END TIM5_Init 0 */ + + TIM_MasterConfigTypeDef sMasterConfig = {0}; + TIM_OC_InitTypeDef sConfigOC = {0}; + + /* USER CODE BEGIN TIM5_Init 1 */ + + /* USER CODE END TIM5_Init 1 */ + htim5.Instance = TIM5; + htim5.Init.Prescaler = 167; + htim5.Init.CounterMode = TIM_COUNTERMODE_UP; + htim5.Init.Period = 4294967295; + htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim5.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_PWM_Init(&htim5) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM5_Init 2 */ + + /* USER CODE END TIM5_Init 2 */ + HAL_TIM_MspPostInit(&htim5); + +} +/* TIM10 init function */ +void MX_TIM10_Init(void) +{ + + /* USER CODE BEGIN TIM10_Init 0 */ + + /* USER CODE END TIM10_Init 0 */ + + TIM_OC_InitTypeDef sConfigOC = {0}; + + /* USER CODE BEGIN TIM10_Init 1 */ + + /* USER CODE END TIM10_Init 1 */ + htim10.Instance = TIM10; + htim10.Init.Prescaler = 0; + htim10.Init.CounterMode = TIM_COUNTERMODE_UP; + htim10.Init.Period = 65535; + htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim10.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim10) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_Init(&htim10) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim10, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM10_Init 2 */ + + /* USER CODE END TIM10_Init 2 */ + HAL_TIM_MspPostInit(&htim10); + +} + +void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* tim_pwmHandle) +{ + + if(tim_pwmHandle->Instance==TIM1) + { + /* USER CODE BEGIN TIM1_MspInit 0 */ + + /* USER CODE END TIM1_MspInit 0 */ + /* TIM1 clock enable */ + __HAL_RCC_TIM1_CLK_ENABLE(); + /* USER CODE BEGIN TIM1_MspInit 1 */ + + /* USER CODE END TIM1_MspInit 1 */ + } + else if(tim_pwmHandle->Instance==TIM4) + { + /* USER CODE BEGIN TIM4_MspInit 0 */ + + /* USER CODE END TIM4_MspInit 0 */ + /* TIM4 clock enable */ + __HAL_RCC_TIM4_CLK_ENABLE(); + /* USER CODE BEGIN TIM4_MspInit 1 */ + + /* USER CODE END TIM4_MspInit 1 */ + } + else if(tim_pwmHandle->Instance==TIM5) + { + /* USER CODE BEGIN TIM5_MspInit 0 */ + + /* USER CODE END TIM5_MspInit 0 */ + /* TIM5 clock enable */ + __HAL_RCC_TIM5_CLK_ENABLE(); + /* USER CODE BEGIN TIM5_MspInit 1 */ + + /* USER CODE END TIM5_MspInit 1 */ + } +} + +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) +{ + + if(tim_baseHandle->Instance==TIM10) + { + /* USER CODE BEGIN TIM10_MspInit 0 */ + + /* USER CODE END TIM10_MspInit 0 */ + /* TIM10 clock enable */ + __HAL_RCC_TIM10_CLK_ENABLE(); + /* USER CODE BEGIN TIM10_MspInit 1 */ + + /* USER CODE END TIM10_MspInit 1 */ + } +} +void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(timHandle->Instance==TIM1) + { + /* USER CODE BEGIN TIM1_MspPostInit 0 */ + + /* USER CODE END TIM1_MspPostInit 0 */ + __HAL_RCC_GPIOE_CLK_ENABLE(); + /**TIM1 GPIO Configuration + PE13 ------> TIM1_CH3 + PE9 ------> TIM1_CH1 + PE11 ------> TIM1_CH2 + PE14 ------> TIM1_CH4 + */ + GPIO_InitStruct.Pin = MOTOR_OUT3_Pin|MOTOR_OUT1_Pin|MOTOR_OUT2_Pin|MOTOR_OUT4_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM1_MspPostInit 1 */ + + /* USER CODE END TIM1_MspPostInit 1 */ + } + else if(timHandle->Instance==TIM4) + { + /* USER CODE BEGIN TIM4_MspPostInit 0 */ + + /* USER CODE END TIM4_MspPostInit 0 */ + + __HAL_RCC_GPIOD_CLK_ENABLE(); + /**TIM4 GPIO Configuration + PD14 ------> TIM4_CH3 + */ + GPIO_InitStruct.Pin = GPIO_PIN_14; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF2_TIM4; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM4_MspPostInit 1 */ + + /* USER CODE END TIM4_MspPostInit 1 */ + } + else if(timHandle->Instance==TIM5) + { + /* USER CODE BEGIN TIM5_MspPostInit 0 */ + + /* USER CODE END TIM5_MspPostInit 0 */ + + __HAL_RCC_GPIOH_CLK_ENABLE(); + /**TIM5 GPIO Configuration + PH12 ------> TIM5_CH3 + PH11 ------> TIM5_CH2 + PH10 ------> TIM5_CH1 + */ + GPIO_InitStruct.Pin = LED_R_Pin|LED_G_Pin|LED_B_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF2_TIM5; + HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM5_MspPostInit 1 */ + + /* USER CODE END TIM5_MspPostInit 1 */ + } + else if(timHandle->Instance==TIM10) + { + /* USER CODE BEGIN TIM10_MspPostInit 0 */ + + /* USER CODE END TIM10_MspPostInit 0 */ + + __HAL_RCC_GPIOF_CLK_ENABLE(); + /**TIM10 GPIO Configuration + PF6 ------> TIM10_CH1 + */ + GPIO_InitStruct.Pin = IMU_HEAT_PWM_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLDOWN; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF3_TIM10; + HAL_GPIO_Init(IMU_HEAT_PWM_GPIO_Port, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM10_MspPostInit 1 */ + + /* USER CODE END TIM10_MspPostInit 1 */ + } + +} + +void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* tim_pwmHandle) +{ + + if(tim_pwmHandle->Instance==TIM1) + { + /* USER CODE BEGIN TIM1_MspDeInit 0 */ + + /* USER CODE END TIM1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM1_CLK_DISABLE(); + /* USER CODE BEGIN TIM1_MspDeInit 1 */ + + /* USER CODE END TIM1_MspDeInit 1 */ + } + else if(tim_pwmHandle->Instance==TIM4) + { + /* USER CODE BEGIN TIM4_MspDeInit 0 */ + + /* USER CODE END TIM4_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM4_CLK_DISABLE(); + /* USER CODE BEGIN TIM4_MspDeInit 1 */ + + /* USER CODE END TIM4_MspDeInit 1 */ + } + else if(tim_pwmHandle->Instance==TIM5) + { + /* USER CODE BEGIN TIM5_MspDeInit 0 */ + + /* USER CODE END TIM5_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM5_CLK_DISABLE(); + /* USER CODE BEGIN TIM5_MspDeInit 1 */ + + /* USER CODE END TIM5_MspDeInit 1 */ + } +} + +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) +{ + + if(tim_baseHandle->Instance==TIM10) + { + /* USER CODE BEGIN TIM10_MspDeInit 0 */ + + /* USER CODE END TIM10_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM10_CLK_DISABLE(); + /* USER CODE BEGIN TIM10_MspDeInit 1 */ + + /* USER CODE END TIM10_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/Core/Src/usart.c b/Core/Src/usart.c new file mode 100644 index 0000000..6a7b684 --- /dev/null +++ b/Core/Src/usart.c @@ -0,0 +1,142 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file usart.c + * @brief This file provides code for the configuration + * of the USART instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "usart.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +UART_HandleTypeDef huart6; +DMA_HandleTypeDef hdma_usart6_rx; + +/* USART6 init function */ + +void MX_USART6_UART_Init(void) +{ + + /* USER CODE BEGIN USART6_Init 0 */ + + /* USER CODE END USART6_Init 0 */ + + /* USER CODE BEGIN USART6_Init 1 */ + + /* USER CODE END USART6_Init 1 */ + huart6.Instance = USART6; + huart6.Init.BaudRate = 115200; + huart6.Init.WordLength = UART_WORDLENGTH_8B; + huart6.Init.StopBits = UART_STOPBITS_1; + huart6.Init.Parity = UART_PARITY_NONE; + huart6.Init.Mode = UART_MODE_TX_RX; + huart6.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart6.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart6) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART6_Init 2 */ + + /* USER CODE END USART6_Init 2 */ + +} + +void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(uartHandle->Instance==USART6) + { + /* USER CODE BEGIN USART6_MspInit 0 */ + + /* USER CODE END USART6_MspInit 0 */ + /* USART6 clock enable */ + __HAL_RCC_USART6_CLK_ENABLE(); + + __HAL_RCC_GPIOG_CLK_ENABLE(); + /**USART6 GPIO Configuration + PG14 ------> USART6_TX + PG9 ------> USART6_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF8_USART6; + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + + /* USART6 DMA Init */ + /* USART6_RX Init */ + hdma_usart6_rx.Instance = DMA2_Stream1; + hdma_usart6_rx.Init.Channel = DMA_CHANNEL_5; + hdma_usart6_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma_usart6_rx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_usart6_rx.Init.MemInc = DMA_MINC_ENABLE; + hdma_usart6_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_usart6_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_usart6_rx.Init.Mode = DMA_NORMAL; + hdma_usart6_rx.Init.Priority = DMA_PRIORITY_LOW; + hdma_usart6_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + if (HAL_DMA_Init(&hdma_usart6_rx) != HAL_OK) + { + Error_Handler(); + } + + __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart6_rx); + + /* USART6 interrupt Init */ + HAL_NVIC_SetPriority(USART6_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(USART6_IRQn); + /* USER CODE BEGIN USART6_MspInit 1 */ + + /* USER CODE END USART6_MspInit 1 */ + } +} + +void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) +{ + + if(uartHandle->Instance==USART6) + { + /* USER CODE BEGIN USART6_MspDeInit 0 */ + + /* USER CODE END USART6_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART6_CLK_DISABLE(); + + /**USART6 GPIO Configuration + PG14 ------> USART6_TX + PG9 ------> USART6_RX + */ + HAL_GPIO_DeInit(GPIOG, GPIO_PIN_14|GPIO_PIN_9); + + /* USART6 DMA DeInit */ + HAL_DMA_DeInit(uartHandle->hdmarx); + + /* USART6 interrupt Deinit */ + HAL_NVIC_DisableIRQ(USART6_IRQn); + /* USER CODE BEGIN USART6_MspDeInit 1 */ + + /* USER CODE END USART6_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f407xx.h b/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f407xx.h new file mode 100644 index 0000000..c7ca43c --- /dev/null +++ b/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f407xx.h @@ -0,0 +1,15613 @@ +/** + ****************************************************************************** + * @file stm32f407xx.h + * @author MCD Application Team + * @brief CMSIS STM32F407xx Device Peripheral Access Layer Header File. + * + * This file contains: + * - Data structures and the address mapping for all peripherals + * - peripherals registers declarations and bits definition + * - Macros to access peripheral's registers hardware + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software 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 stm32f407xx + * @{ + */ + +#ifndef __STM32F407xx_H +#define __STM32F407xx_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** @addtogroup Configuration_section_for_CMSIS + * @{ + */ + +/** + * @brief Configuration of the Cortex-M4 Processor and Core Peripherals + */ +#define __CM4_REV 0x0001U /*!< Core revision r0p1 */ +#define __MPU_PRESENT 1U /*!< STM32F4XX provides an MPU */ +#define __NVIC_PRIO_BITS 4U /*!< STM32F4XX uses 4 Bits for the Priority Levels */ +#define __Vendor_SysTickConfig 0U /*!< Set to 1 if different SysTick Config is used */ +#define __FPU_PRESENT 1U /*!< FPU present */ + +/** + * @} + */ + +/** @addtogroup Peripheral_interrupt_number_definition + * @{ + */ + +/** + * @brief STM32F4XX Interrupt Number Definition, according to the selected device + * in @ref Library_configuration_section + */ +typedef enum +{ + /****** Cortex-M4 Processor Exceptions Numbers ****************************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M4 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M4 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M4 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M4 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M4 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M4 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M4 System Tick Interrupt */ + /****** STM32 specific Interrupt Numbers **********************************************************************/ + WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ + PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ + TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */ + RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */ + FLASH_IRQn = 4, /*!< FLASH global Interrupt */ + RCC_IRQn = 5, /*!< RCC global Interrupt */ + EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ + EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ + EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ + EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ + EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ + DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */ + DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */ + DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */ + DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */ + DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */ + DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */ + DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */ + ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */ + CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */ + CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */ + TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */ + TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTC_Alarm_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */ + OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */ + TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */ + TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */ + TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ + TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare global interrupt */ + DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */ + FSMC_IRQn = 48, /*!< FSMC global Interrupt */ + SDIO_IRQn = 49, /*!< SDIO global Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */ + TIM7_IRQn = 55, /*!< TIM7 global interrupt */ + DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */ + DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */ + DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */ + DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */ + DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */ + ETH_IRQn = 61, /*!< Ethernet global Interrupt */ + ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */ + CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ + CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ + CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ + CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ + OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */ + DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */ + DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */ + DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */ + USART6_IRQn = 71, /*!< USART6 global interrupt */ + I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */ + I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */ + OTG_HS_EP1_OUT_IRQn = 74, /*!< USB OTG HS End Point 1 Out global interrupt */ + OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */ + OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */ + OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */ + DCMI_IRQn = 78, /*!< DCMI global interrupt */ + RNG_IRQn = 80, /*!< RNG global Interrupt */ + FPU_IRQn = 81 /*!< FPU global interrupt */ +} IRQn_Type; +/* Legacy define */ +#define HASH_RNG_IRQn RNG_IRQn + +/** + * @} + */ + +#include "core_cm4.h" /* Cortex-M4 processor and core peripherals */ +#include "system_stm32f4xx.h" +#include + +/** @addtogroup Peripheral_registers_structures + * @{ + */ + +/** + * @brief Analog to Digital Converter + */ + +typedef struct +{ + __IO uint32_t SR; /*!< ADC status register, Address offset: 0x00 */ + __IO uint32_t CR1; /*!< ADC control register 1, Address offset: 0x04 */ + __IO uint32_t CR2; /*!< ADC control register 2, Address offset: 0x08 */ + __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x0C */ + __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x10 */ + __IO uint32_t JOFR1; /*!< ADC injected channel data offset register 1, Address offset: 0x14 */ + __IO uint32_t JOFR2; /*!< ADC injected channel data offset register 2, Address offset: 0x18 */ + __IO uint32_t JOFR3; /*!< ADC injected channel data offset register 3, Address offset: 0x1C */ + __IO uint32_t JOFR4; /*!< ADC injected channel data offset register 4, Address offset: 0x20 */ + __IO uint32_t HTR; /*!< ADC watchdog higher threshold register, Address offset: 0x24 */ + __IO uint32_t LTR; /*!< ADC watchdog lower threshold register, Address offset: 0x28 */ + __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x2C */ + __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x30 */ + __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x34 */ + __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x38*/ + __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x3C */ + __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x40 */ + __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x44 */ + __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x48 */ + __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x4C */ +} ADC_TypeDef; + +typedef struct +{ + __IO uint32_t CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ + __IO uint32_t CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ + __IO uint32_t CDR; /*!< ADC common regular data register for dual + AND triple modes, Address offset: ADC1 base address + 0x308 */ +} ADC_Common_TypeDef; + + +/** + * @brief Controller Area Network TxMailBox + */ + +typedef struct +{ + __IO uint32_t TIR; /*!< CAN TX mailbox identifier register */ + __IO uint32_t TDTR; /*!< CAN mailbox data length control and time stamp register */ + __IO uint32_t TDLR; /*!< CAN mailbox data low register */ + __IO uint32_t TDHR; /*!< CAN mailbox data high register */ +} CAN_TxMailBox_TypeDef; + +/** + * @brief Controller Area Network FIFOMailBox + */ + +typedef struct +{ + __IO uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ + __IO uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ + __IO uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ + __IO uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ +} CAN_FIFOMailBox_TypeDef; + +/** + * @brief Controller Area Network FilterRegister + */ + +typedef struct +{ + __IO uint32_t FR1; /*!< CAN Filter bank register 1 */ + __IO uint32_t FR2; /*!< CAN Filter bank register 1 */ +} CAN_FilterRegister_TypeDef; + +/** + * @brief Controller Area Network + */ + +typedef struct +{ + __IO uint32_t MCR; /*!< CAN master control register, Address offset: 0x00 */ + __IO uint32_t MSR; /*!< CAN master status register, Address offset: 0x04 */ + __IO uint32_t TSR; /*!< CAN transmit status register, Address offset: 0x08 */ + __IO uint32_t RF0R; /*!< CAN receive FIFO 0 register, Address offset: 0x0C */ + __IO uint32_t RF1R; /*!< CAN receive FIFO 1 register, Address offset: 0x10 */ + __IO uint32_t IER; /*!< CAN interrupt enable register, Address offset: 0x14 */ + __IO uint32_t ESR; /*!< CAN error status register, Address offset: 0x18 */ + __IO uint32_t BTR; /*!< CAN bit timing register, Address offset: 0x1C */ + uint32_t RESERVED0[88]; /*!< Reserved, 0x020 - 0x17F */ + CAN_TxMailBox_TypeDef sTxMailBox[3]; /*!< CAN Tx MailBox, Address offset: 0x180 - 0x1AC */ + CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; /*!< CAN FIFO MailBox, Address offset: 0x1B0 - 0x1CC */ + uint32_t RESERVED1[12]; /*!< Reserved, 0x1D0 - 0x1FF */ + __IO uint32_t FMR; /*!< CAN filter master register, Address offset: 0x200 */ + __IO uint32_t FM1R; /*!< CAN filter mode register, Address offset: 0x204 */ + uint32_t RESERVED2; /*!< Reserved, 0x208 */ + __IO uint32_t FS1R; /*!< CAN filter scale register, Address offset: 0x20C */ + uint32_t RESERVED3; /*!< Reserved, 0x210 */ + __IO uint32_t FFA1R; /*!< CAN filter FIFO assignment register, Address offset: 0x214 */ + uint32_t RESERVED4; /*!< Reserved, 0x218 */ + __IO uint32_t FA1R; /*!< CAN filter activation register, Address offset: 0x21C */ + uint32_t RESERVED5[8]; /*!< Reserved, 0x220-0x23F */ + CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register, Address offset: 0x240-0x31C */ +} CAN_TypeDef; + +/** + * @brief CRC calculation unit + */ + +typedef struct +{ + __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ + __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ + uint8_t RESERVED0; /*!< Reserved, 0x05 */ + uint16_t RESERVED1; /*!< Reserved, 0x06 */ + __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ +} CRC_TypeDef; + +/** + * @brief Digital to Analog Converter + */ + +typedef struct +{ + __IO uint32_t CR; /*!< DAC control register, Address offset: 0x00 */ + __IO uint32_t SWTRIGR; /*!< DAC software trigger register, Address offset: 0x04 */ + __IO uint32_t DHR12R1; /*!< DAC channel1 12-bit right-aligned data holding register, Address offset: 0x08 */ + __IO uint32_t DHR12L1; /*!< DAC channel1 12-bit left aligned data holding register, Address offset: 0x0C */ + __IO uint32_t DHR8R1; /*!< DAC channel1 8-bit right aligned data holding register, Address offset: 0x10 */ + __IO uint32_t DHR12R2; /*!< DAC channel2 12-bit right aligned data holding register, Address offset: 0x14 */ + __IO uint32_t DHR12L2; /*!< DAC channel2 12-bit left aligned data holding register, Address offset: 0x18 */ + __IO uint32_t DHR8R2; /*!< DAC channel2 8-bit right-aligned data holding register, Address offset: 0x1C */ + __IO uint32_t DHR12RD; /*!< Dual DAC 12-bit right-aligned data holding register, Address offset: 0x20 */ + __IO uint32_t DHR12LD; /*!< DUAL DAC 12-bit left aligned data holding register, Address offset: 0x24 */ + __IO uint32_t DHR8RD; /*!< DUAL DAC 8-bit right aligned data holding register, Address offset: 0x28 */ + __IO uint32_t DOR1; /*!< DAC channel1 data output register, Address offset: 0x2C */ + __IO uint32_t DOR2; /*!< DAC channel2 data output register, Address offset: 0x30 */ + __IO uint32_t SR; /*!< DAC status register, Address offset: 0x34 */ +} DAC_TypeDef; + +/** + * @brief Debug MCU + */ + +typedef struct +{ + __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ + __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ + __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ + __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ +} DBGMCU_TypeDef; + +/** + * @brief DCMI + */ + +typedef struct +{ + __IO uint32_t CR; /*!< DCMI control register 1, Address offset: 0x00 */ + __IO uint32_t SR; /*!< DCMI status register, Address offset: 0x04 */ + __IO uint32_t RISR; /*!< DCMI raw interrupt status register, Address offset: 0x08 */ + __IO uint32_t IER; /*!< DCMI interrupt enable register, Address offset: 0x0C */ + __IO uint32_t MISR; /*!< DCMI masked interrupt status register, Address offset: 0x10 */ + __IO uint32_t ICR; /*!< DCMI interrupt clear register, Address offset: 0x14 */ + __IO uint32_t ESCR; /*!< DCMI embedded synchronization code register, Address offset: 0x18 */ + __IO uint32_t ESUR; /*!< DCMI embedded synchronization unmask register, Address offset: 0x1C */ + __IO uint32_t CWSTRTR; /*!< DCMI crop window start, Address offset: 0x20 */ + __IO uint32_t CWSIZER; /*!< DCMI crop window size, Address offset: 0x24 */ + __IO uint32_t DR; /*!< DCMI data register, Address offset: 0x28 */ +} DCMI_TypeDef; + +/** + * @brief DMA Controller + */ + +typedef struct +{ + __IO uint32_t CR; /*!< DMA stream x configuration register */ + __IO uint32_t NDTR; /*!< DMA stream x number of data register */ + __IO uint32_t PAR; /*!< DMA stream x peripheral address register */ + __IO uint32_t M0AR; /*!< DMA stream x memory 0 address register */ + __IO uint32_t M1AR; /*!< DMA stream x memory 1 address register */ + __IO uint32_t FCR; /*!< DMA stream x FIFO control register */ +} DMA_Stream_TypeDef; + +typedef struct +{ + __IO uint32_t LISR; /*!< DMA low interrupt status register, Address offset: 0x00 */ + __IO uint32_t HISR; /*!< DMA high interrupt status register, Address offset: 0x04 */ + __IO uint32_t LIFCR; /*!< DMA low interrupt flag clear register, Address offset: 0x08 */ + __IO uint32_t HIFCR; /*!< DMA high interrupt flag clear register, Address offset: 0x0C */ +} DMA_TypeDef; + +/** + * @brief Ethernet MAC + */ + +typedef struct +{ + __IO uint32_t MACCR; + __IO uint32_t MACFFR; + __IO uint32_t MACHTHR; + __IO uint32_t MACHTLR; + __IO uint32_t MACMIIAR; + __IO uint32_t MACMIIDR; + __IO uint32_t MACFCR; + __IO uint32_t MACVLANTR; /* 8 */ + uint32_t RESERVED0[2]; + __IO uint32_t MACRWUFFR; /* 11 */ + __IO uint32_t MACPMTCSR; + uint32_t RESERVED1; + __IO uint32_t MACDBGR; + __IO uint32_t MACSR; /* 15 */ + __IO uint32_t MACIMR; + __IO uint32_t MACA0HR; + __IO uint32_t MACA0LR; + __IO uint32_t MACA1HR; + __IO uint32_t MACA1LR; + __IO uint32_t MACA2HR; + __IO uint32_t MACA2LR; + __IO uint32_t MACA3HR; + __IO uint32_t MACA3LR; /* 24 */ + uint32_t RESERVED2[40]; + __IO uint32_t MMCCR; /* 65 */ + __IO uint32_t MMCRIR; + __IO uint32_t MMCTIR; + __IO uint32_t MMCRIMR; + __IO uint32_t MMCTIMR; /* 69 */ + uint32_t RESERVED3[14]; + __IO uint32_t MMCTGFSCCR; /* 84 */ + __IO uint32_t MMCTGFMSCCR; + uint32_t RESERVED4[5]; + __IO uint32_t MMCTGFCR; + uint32_t RESERVED5[10]; + __IO uint32_t MMCRFCECR; + __IO uint32_t MMCRFAECR; + uint32_t RESERVED6[10]; + __IO uint32_t MMCRGUFCR; + uint32_t RESERVED7[334]; + __IO uint32_t PTPTSCR; + __IO uint32_t PTPSSIR; + __IO uint32_t PTPTSHR; + __IO uint32_t PTPTSLR; + __IO uint32_t PTPTSHUR; + __IO uint32_t PTPTSLUR; + __IO uint32_t PTPTSAR; + __IO uint32_t PTPTTHR; + __IO uint32_t PTPTTLR; + __IO uint32_t RESERVED8; + __IO uint32_t PTPTSSR; + uint32_t RESERVED9[565]; + __IO uint32_t DMABMR; + __IO uint32_t DMATPDR; + __IO uint32_t DMARPDR; + __IO uint32_t DMARDLAR; + __IO uint32_t DMATDLAR; + __IO uint32_t DMASR; + __IO uint32_t DMAOMR; + __IO uint32_t DMAIER; + __IO uint32_t DMAMFBOCR; + __IO uint32_t DMARSWTR; + uint32_t RESERVED10[8]; + __IO uint32_t DMACHTDR; + __IO uint32_t DMACHRDR; + __IO uint32_t DMACHTBAR; + __IO uint32_t DMACHRBAR; +} ETH_TypeDef; + +/** + * @brief External Interrupt/Event Controller + */ + +typedef struct +{ + __IO uint32_t IMR; /*!< EXTI Interrupt mask register, Address offset: 0x00 */ + __IO uint32_t EMR; /*!< EXTI Event mask register, Address offset: 0x04 */ + __IO uint32_t RTSR; /*!< EXTI Rising trigger selection register, Address offset: 0x08 */ + __IO uint32_t FTSR; /*!< EXTI Falling trigger selection register, Address offset: 0x0C */ + __IO uint32_t SWIER; /*!< EXTI Software interrupt event register, Address offset: 0x10 */ + __IO uint32_t PR; /*!< EXTI Pending register, Address offset: 0x14 */ +} EXTI_TypeDef; + +/** + * @brief FLASH Registers + */ + +typedef struct +{ + __IO uint32_t ACR; /*!< FLASH access control register, Address offset: 0x00 */ + __IO uint32_t KEYR; /*!< FLASH key register, Address offset: 0x04 */ + __IO uint32_t OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ + __IO uint32_t SR; /*!< FLASH status register, Address offset: 0x0C */ + __IO uint32_t CR; /*!< FLASH control register, Address offset: 0x10 */ + __IO uint32_t OPTCR; /*!< FLASH option control register , Address offset: 0x14 */ + __IO uint32_t OPTCR1; /*!< FLASH option control register 1, Address offset: 0x18 */ +} FLASH_TypeDef; + + + +/** + * @brief Flexible Static Memory Controller + */ + +typedef struct +{ + __IO uint32_t BTCR[8]; /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */ +} FSMC_Bank1_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank1E + */ + +typedef struct +{ + __IO uint32_t BWTR[7]; /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */ +} FSMC_Bank1E_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank2 + */ + +typedef struct +{ + __IO uint32_t PCR2; /*!< NAND Flash control register 2, Address offset: 0x60 */ + __IO uint32_t SR2; /*!< NAND Flash FIFO status and interrupt register 2, Address offset: 0x64 */ + __IO uint32_t PMEM2; /*!< NAND Flash Common memory space timing register 2, Address offset: 0x68 */ + __IO uint32_t PATT2; /*!< NAND Flash Attribute memory space timing register 2, Address offset: 0x6C */ + uint32_t RESERVED0; /*!< Reserved, 0x70 */ + __IO uint32_t ECCR2; /*!< NAND Flash ECC result registers 2, Address offset: 0x74 */ + uint32_t RESERVED1; /*!< Reserved, 0x78 */ + uint32_t RESERVED2; /*!< Reserved, 0x7C */ + __IO uint32_t PCR3; /*!< NAND Flash control register 3, Address offset: 0x80 */ + __IO uint32_t SR3; /*!< NAND Flash FIFO status and interrupt register 3, Address offset: 0x84 */ + __IO uint32_t PMEM3; /*!< NAND Flash Common memory space timing register 3, Address offset: 0x88 */ + __IO uint32_t PATT3; /*!< NAND Flash Attribute memory space timing register 3, Address offset: 0x8C */ + uint32_t RESERVED3; /*!< Reserved, 0x90 */ + __IO uint32_t ECCR3; /*!< NAND Flash ECC result registers 3, Address offset: 0x94 */ +} FSMC_Bank2_3_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank4 + */ + +typedef struct +{ + __IO uint32_t PCR4; /*!< PC Card control register 4, Address offset: 0xA0 */ + __IO uint32_t SR4; /*!< PC Card FIFO status and interrupt register 4, Address offset: 0xA4 */ + __IO uint32_t PMEM4; /*!< PC Card Common memory space timing register 4, Address offset: 0xA8 */ + __IO uint32_t PATT4; /*!< PC Card Attribute memory space timing register 4, Address offset: 0xAC */ + __IO uint32_t PIO4; /*!< PC Card I/O space timing register 4, Address offset: 0xB0 */ +} FSMC_Bank4_TypeDef; + +/** + * @brief General Purpose I/O + */ + +typedef struct +{ + __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ + __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ + __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ + __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ + __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ + __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ + __IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */ + __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ + __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ +} GPIO_TypeDef; + +/** + * @brief System configuration controller + */ + +typedef struct +{ + __IO uint32_t MEMRMP; /*!< SYSCFG memory remap register, Address offset: 0x00 */ + __IO uint32_t PMC; /*!< SYSCFG peripheral mode configuration register, Address offset: 0x04 */ + __IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */ + uint32_t RESERVED[2]; /*!< Reserved, 0x18-0x1C */ + __IO uint32_t CMPCR; /*!< SYSCFG Compensation cell control register, Address offset: 0x20 */ +} SYSCFG_TypeDef; + +/** + * @brief Inter-integrated Circuit Interface + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< I2C Control register 1, Address offset: 0x00 */ + __IO uint32_t CR2; /*!< I2C Control register 2, Address offset: 0x04 */ + __IO uint32_t OAR1; /*!< I2C Own address register 1, Address offset: 0x08 */ + __IO uint32_t OAR2; /*!< I2C Own address register 2, Address offset: 0x0C */ + __IO uint32_t DR; /*!< I2C Data register, Address offset: 0x10 */ + __IO uint32_t SR1; /*!< I2C Status register 1, Address offset: 0x14 */ + __IO uint32_t SR2; /*!< I2C Status register 2, Address offset: 0x18 */ + __IO uint32_t CCR; /*!< I2C Clock control register, Address offset: 0x1C */ + __IO uint32_t TRISE; /*!< I2C TRISE register, Address offset: 0x20 */ +} I2C_TypeDef; + +/** + * @brief Independent WATCHDOG + */ + +typedef struct +{ + __IO uint32_t KR; /*!< IWDG Key register, Address offset: 0x00 */ + __IO uint32_t PR; /*!< IWDG Prescaler register, Address offset: 0x04 */ + __IO uint32_t RLR; /*!< IWDG Reload register, Address offset: 0x08 */ + __IO uint32_t SR; /*!< IWDG Status register, Address offset: 0x0C */ +} IWDG_TypeDef; + + +/** + * @brief Power Control + */ + +typedef struct +{ + __IO uint32_t CR; /*!< PWR power control register, Address offset: 0x00 */ + __IO uint32_t CSR; /*!< PWR power control/status register, Address offset: 0x04 */ +} PWR_TypeDef; + +/** + * @brief Reset and Clock Control + */ + +typedef struct +{ + __IO uint32_t CR; /*!< RCC clock control register, Address offset: 0x00 */ + __IO uint32_t PLLCFGR; /*!< RCC PLL configuration register, Address offset: 0x04 */ + __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ + __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ + __IO uint32_t AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ + __IO uint32_t AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ + __IO uint32_t AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ + uint32_t RESERVED0; /*!< Reserved, 0x1C */ + __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ + __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ + uint32_t RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ + __IO uint32_t AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ + __IO uint32_t AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ + __IO uint32_t AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ + uint32_t RESERVED2; /*!< Reserved, 0x3C */ + __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ + __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ + uint32_t RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ + __IO uint32_t AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ + __IO uint32_t AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ + __IO uint32_t AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ + uint32_t RESERVED4; /*!< Reserved, 0x5C */ + __IO uint32_t APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ + __IO uint32_t APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ + uint32_t RESERVED5[2]; /*!< Reserved, 0x68-0x6C */ + __IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x70 */ + __IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x74 */ + uint32_t RESERVED6[2]; /*!< Reserved, 0x78-0x7C */ + __IO uint32_t SSCGR; /*!< RCC spread spectrum clock generation register, Address offset: 0x80 */ + __IO uint32_t PLLI2SCFGR; /*!< RCC PLLI2S configuration register, Address offset: 0x84 */ +} RCC_TypeDef; + +/** + * @brief Real-Time Clock + */ + +typedef struct +{ + __IO uint32_t TR; /*!< RTC time register, Address offset: 0x00 */ + __IO uint32_t DR; /*!< RTC date register, Address offset: 0x04 */ + __IO uint32_t CR; /*!< RTC control register, Address offset: 0x08 */ + __IO uint32_t ISR; /*!< RTC initialization and status register, Address offset: 0x0C */ + __IO uint32_t PRER; /*!< RTC prescaler register, Address offset: 0x10 */ + __IO uint32_t WUTR; /*!< RTC wakeup timer register, Address offset: 0x14 */ + __IO uint32_t CALIBR; /*!< RTC calibration register, Address offset: 0x18 */ + __IO uint32_t ALRMAR; /*!< RTC alarm A register, Address offset: 0x1C */ + __IO uint32_t ALRMBR; /*!< RTC alarm B register, Address offset: 0x20 */ + __IO uint32_t WPR; /*!< RTC write protection register, Address offset: 0x24 */ + __IO uint32_t SSR; /*!< RTC sub second register, Address offset: 0x28 */ + __IO uint32_t SHIFTR; /*!< RTC shift control register, Address offset: 0x2C */ + __IO uint32_t TSTR; /*!< RTC time stamp time register, Address offset: 0x30 */ + __IO uint32_t TSDR; /*!< RTC time stamp date register, Address offset: 0x34 */ + __IO uint32_t TSSSR; /*!< RTC time-stamp sub second register, Address offset: 0x38 */ + __IO uint32_t CALR; /*!< RTC calibration register, Address offset: 0x3C */ + __IO uint32_t TAFCR; /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */ + __IO uint32_t ALRMASSR;/*!< RTC alarm A sub second register, Address offset: 0x44 */ + __IO uint32_t ALRMBSSR;/*!< RTC alarm B sub second register, Address offset: 0x48 */ + uint32_t RESERVED7; /*!< Reserved, 0x4C */ + __IO uint32_t BKP0R; /*!< RTC backup register 1, Address offset: 0x50 */ + __IO uint32_t BKP1R; /*!< RTC backup register 1, Address offset: 0x54 */ + __IO uint32_t BKP2R; /*!< RTC backup register 2, Address offset: 0x58 */ + __IO uint32_t BKP3R; /*!< RTC backup register 3, Address offset: 0x5C */ + __IO uint32_t BKP4R; /*!< RTC backup register 4, Address offset: 0x60 */ + __IO uint32_t BKP5R; /*!< RTC backup register 5, Address offset: 0x64 */ + __IO uint32_t BKP6R; /*!< RTC backup register 6, Address offset: 0x68 */ + __IO uint32_t BKP7R; /*!< RTC backup register 7, Address offset: 0x6C */ + __IO uint32_t BKP8R; /*!< RTC backup register 8, Address offset: 0x70 */ + __IO uint32_t BKP9R; /*!< RTC backup register 9, Address offset: 0x74 */ + __IO uint32_t BKP10R; /*!< RTC backup register 10, Address offset: 0x78 */ + __IO uint32_t BKP11R; /*!< RTC backup register 11, Address offset: 0x7C */ + __IO uint32_t BKP12R; /*!< RTC backup register 12, Address offset: 0x80 */ + __IO uint32_t BKP13R; /*!< RTC backup register 13, Address offset: 0x84 */ + __IO uint32_t BKP14R; /*!< RTC backup register 14, Address offset: 0x88 */ + __IO uint32_t BKP15R; /*!< RTC backup register 15, Address offset: 0x8C */ + __IO uint32_t BKP16R; /*!< RTC backup register 16, Address offset: 0x90 */ + __IO uint32_t BKP17R; /*!< RTC backup register 17, Address offset: 0x94 */ + __IO uint32_t BKP18R; /*!< RTC backup register 18, Address offset: 0x98 */ + __IO uint32_t BKP19R; /*!< RTC backup register 19, Address offset: 0x9C */ +} RTC_TypeDef; + +/** + * @brief SD host Interface + */ + +typedef struct +{ + __IO uint32_t POWER; /*!< SDIO power control register, Address offset: 0x00 */ + __IO uint32_t CLKCR; /*!< SDI clock control register, Address offset: 0x04 */ + __IO uint32_t ARG; /*!< SDIO argument register, Address offset: 0x08 */ + __IO uint32_t CMD; /*!< SDIO command register, Address offset: 0x0C */ + __IO const uint32_t RESPCMD; /*!< SDIO command response register, Address offset: 0x10 */ + __IO const uint32_t RESP1; /*!< SDIO response 1 register, Address offset: 0x14 */ + __IO const uint32_t RESP2; /*!< SDIO response 2 register, Address offset: 0x18 */ + __IO const uint32_t RESP3; /*!< SDIO response 3 register, Address offset: 0x1C */ + __IO const uint32_t RESP4; /*!< SDIO response 4 register, Address offset: 0x20 */ + __IO uint32_t DTIMER; /*!< SDIO data timer register, Address offset: 0x24 */ + __IO uint32_t DLEN; /*!< SDIO data length register, Address offset: 0x28 */ + __IO uint32_t DCTRL; /*!< SDIO data control register, Address offset: 0x2C */ + __IO const uint32_t DCOUNT; /*!< SDIO data counter register, Address offset: 0x30 */ + __IO const uint32_t STA; /*!< SDIO status register, Address offset: 0x34 */ + __IO uint32_t ICR; /*!< SDIO interrupt clear register, Address offset: 0x38 */ + __IO uint32_t MASK; /*!< SDIO mask register, Address offset: 0x3C */ + uint32_t RESERVED0[2]; /*!< Reserved, 0x40-0x44 */ + __IO const uint32_t FIFOCNT; /*!< SDIO FIFO counter register, Address offset: 0x48 */ + uint32_t RESERVED1[13]; /*!< Reserved, 0x4C-0x7C */ + __IO uint32_t FIFO; /*!< SDIO data FIFO register, Address offset: 0x80 */ +} SDIO_TypeDef; + +/** + * @brief Serial Peripheral Interface + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< SPI control register 1 (not used in I2S mode), Address offset: 0x00 */ + __IO uint32_t CR2; /*!< SPI control register 2, Address offset: 0x04 */ + __IO uint32_t SR; /*!< SPI status register, Address offset: 0x08 */ + __IO uint32_t DR; /*!< SPI data register, Address offset: 0x0C */ + __IO uint32_t CRCPR; /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */ + __IO uint32_t RXCRCR; /*!< SPI RX CRC register (not used in I2S mode), Address offset: 0x14 */ + __IO uint32_t TXCRCR; /*!< SPI TX CRC register (not used in I2S mode), Address offset: 0x18 */ + __IO uint32_t I2SCFGR; /*!< SPI_I2S configuration register, Address offset: 0x1C */ + __IO uint32_t I2SPR; /*!< SPI_I2S prescaler register, Address offset: 0x20 */ +} SPI_TypeDef; + + +/** + * @brief TIM + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< TIM control register 1, Address offset: 0x00 */ + __IO uint32_t CR2; /*!< TIM control register 2, Address offset: 0x04 */ + __IO uint32_t SMCR; /*!< TIM slave mode control register, Address offset: 0x08 */ + __IO uint32_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */ + __IO uint32_t SR; /*!< TIM status register, Address offset: 0x10 */ + __IO uint32_t EGR; /*!< TIM event generation register, Address offset: 0x14 */ + __IO uint32_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */ + __IO uint32_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */ + __IO uint32_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */ + __IO uint32_t CNT; /*!< TIM counter register, Address offset: 0x24 */ + __IO uint32_t PSC; /*!< TIM prescaler, Address offset: 0x28 */ + __IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */ + __IO uint32_t RCR; /*!< TIM repetition counter register, Address offset: 0x30 */ + __IO uint32_t CCR1; /*!< TIM capture/compare register 1, Address offset: 0x34 */ + __IO uint32_t CCR2; /*!< TIM capture/compare register 2, Address offset: 0x38 */ + __IO uint32_t CCR3; /*!< TIM capture/compare register 3, Address offset: 0x3C */ + __IO uint32_t CCR4; /*!< TIM capture/compare register 4, Address offset: 0x40 */ + __IO uint32_t BDTR; /*!< TIM break and dead-time register, Address offset: 0x44 */ + __IO uint32_t DCR; /*!< TIM DMA control register, Address offset: 0x48 */ + __IO uint32_t DMAR; /*!< TIM DMA address for full transfer, Address offset: 0x4C */ + __IO uint32_t OR; /*!< TIM option register, Address offset: 0x50 */ +} TIM_TypeDef; + +/** + * @brief Universal Synchronous Asynchronous Receiver Transmitter + */ + +typedef struct +{ + __IO uint32_t SR; /*!< USART Status register, Address offset: 0x00 */ + __IO uint32_t DR; /*!< USART Data register, Address offset: 0x04 */ + __IO uint32_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ + __IO uint32_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ + __IO uint32_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ + __IO uint32_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ + __IO uint32_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ +} USART_TypeDef; + +/** + * @brief Window WATCHDOG + */ + +typedef struct +{ + __IO uint32_t CR; /*!< WWDG Control register, Address offset: 0x00 */ + __IO uint32_t CFR; /*!< WWDG Configuration register, Address offset: 0x04 */ + __IO uint32_t SR; /*!< WWDG Status register, Address offset: 0x08 */ +} WWDG_TypeDef; + +/** + * @brief RNG + */ + +typedef struct +{ + __IO uint32_t CR; /*!< RNG control register, Address offset: 0x00 */ + __IO uint32_t SR; /*!< RNG status register, Address offset: 0x04 */ + __IO uint32_t DR; /*!< RNG data register, Address offset: 0x08 */ +} RNG_TypeDef; + +/** + * @brief USB_OTG_Core_Registers + */ +typedef struct +{ + __IO uint32_t GOTGCTL; /*!< USB_OTG Control and Status Register 000h */ + __IO uint32_t GOTGINT; /*!< USB_OTG Interrupt Register 004h */ + __IO uint32_t GAHBCFG; /*!< Core AHB Configuration Register 008h */ + __IO uint32_t GUSBCFG; /*!< Core USB Configuration Register 00Ch */ + __IO uint32_t GRSTCTL; /*!< Core Reset Register 010h */ + __IO uint32_t GINTSTS; /*!< Core Interrupt Register 014h */ + __IO uint32_t GINTMSK; /*!< Core Interrupt Mask Register 018h */ + __IO uint32_t GRXSTSR; /*!< Receive Sts Q Read Register 01Ch */ + __IO uint32_t GRXSTSP; /*!< Receive Sts Q Read & POP Register 020h */ + __IO uint32_t GRXFSIZ; /*!< Receive FIFO Size Register 024h */ + __IO uint32_t DIEPTXF0_HNPTXFSIZ; /*!< EP0 / Non Periodic Tx FIFO Size Register 028h */ + __IO uint32_t HNPTXSTS; /*!< Non Periodic Tx FIFO/Queue Sts reg 02Ch */ + uint32_t Reserved30[2]; /*!< Reserved 030h */ + __IO uint32_t GCCFG; /*!< General Purpose IO Register 038h */ + __IO uint32_t CID; /*!< User ID Register 03Ch */ + uint32_t Reserved40[48]; /*!< Reserved 0x40-0xFF */ + __IO uint32_t HPTXFSIZ; /*!< Host Periodic Tx FIFO Size Reg 100h */ + __IO uint32_t DIEPTXF[0x0F]; /*!< dev Periodic Transmit FIFO */ +} USB_OTG_GlobalTypeDef; + +/** + * @brief USB_OTG_device_Registers + */ +typedef struct +{ + __IO uint32_t DCFG; /*!< dev Configuration Register 800h */ + __IO uint32_t DCTL; /*!< dev Control Register 804h */ + __IO uint32_t DSTS; /*!< dev Status Register (RO) 808h */ + uint32_t Reserved0C; /*!< Reserved 80Ch */ + __IO uint32_t DIEPMSK; /*!< dev IN Endpoint Mask 810h */ + __IO uint32_t DOEPMSK; /*!< dev OUT Endpoint Mask 814h */ + __IO uint32_t DAINT; /*!< dev All Endpoints Itr Reg 818h */ + __IO uint32_t DAINTMSK; /*!< dev All Endpoints Itr Mask 81Ch */ + uint32_t Reserved20; /*!< Reserved 820h */ + uint32_t Reserved9; /*!< Reserved 824h */ + __IO uint32_t DVBUSDIS; /*!< dev VBUS discharge Register 828h */ + __IO uint32_t DVBUSPULSE; /*!< dev VBUS Pulse Register 82Ch */ + __IO uint32_t DTHRCTL; /*!< dev threshold 830h */ + __IO uint32_t DIEPEMPMSK; /*!< dev empty msk 834h */ + __IO uint32_t DEACHINT; /*!< dedicated EP interrupt 838h */ + __IO uint32_t DEACHMSK; /*!< dedicated EP msk 83Ch */ + uint32_t Reserved40; /*!< dedicated EP mask 840h */ + __IO uint32_t DINEP1MSK; /*!< dedicated EP mask 844h */ + uint32_t Reserved44[15]; /*!< Reserved 844-87Ch */ + __IO uint32_t DOUTEP1MSK; /*!< dedicated EP msk 884h */ +} USB_OTG_DeviceTypeDef; + +/** + * @brief USB_OTG_IN_Endpoint-Specific_Register + */ +typedef struct +{ + __IO uint32_t DIEPCTL; /*!< dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h */ + uint32_t Reserved04; /*!< Reserved 900h + (ep_num * 20h) + 04h */ + __IO uint32_t DIEPINT; /*!< dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h */ + uint32_t Reserved0C; /*!< Reserved 900h + (ep_num * 20h) + 0Ch */ + __IO uint32_t DIEPTSIZ; /*!< IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h */ + __IO uint32_t DIEPDMA; /*!< IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h */ + __IO uint32_t DTXFSTS; /*!< IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h */ + uint32_t Reserved18; /*!< Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch */ +} USB_OTG_INEndpointTypeDef; + +/** + * @brief USB_OTG_OUT_Endpoint-Specific_Registers + */ +typedef struct +{ + __IO uint32_t DOEPCTL; /*!< dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h */ + uint32_t Reserved04; /*!< Reserved B00h + (ep_num * 20h) + 04h */ + __IO uint32_t DOEPINT; /*!< dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h */ + uint32_t Reserved0C; /*!< Reserved B00h + (ep_num * 20h) + 0Ch */ + __IO uint32_t DOEPTSIZ; /*!< dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h */ + __IO uint32_t DOEPDMA; /*!< dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h */ + uint32_t Reserved18[2]; /*!< Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch */ +} USB_OTG_OUTEndpointTypeDef; + +/** + * @brief USB_OTG_Host_Mode_Register_Structures + */ +typedef struct +{ + __IO uint32_t HCFG; /*!< Host Configuration Register 400h */ + __IO uint32_t HFIR; /*!< Host Frame Interval Register 404h */ + __IO uint32_t HFNUM; /*!< Host Frame Nbr/Frame Remaining 408h */ + uint32_t Reserved40C; /*!< Reserved 40Ch */ + __IO uint32_t HPTXSTS; /*!< Host Periodic Tx FIFO/ Queue Status 410h */ + __IO uint32_t HAINT; /*!< Host All Channels Interrupt Register 414h */ + __IO uint32_t HAINTMSK; /*!< Host All Channels Interrupt Mask 418h */ +} USB_OTG_HostTypeDef; + +/** + * @brief USB_OTG_Host_Channel_Specific_Registers + */ +typedef struct +{ + __IO uint32_t HCCHAR; /*!< Host Channel Characteristics Register 500h */ + __IO uint32_t HCSPLT; /*!< Host Channel Split Control Register 504h */ + __IO uint32_t HCINT; /*!< Host Channel Interrupt Register 508h */ + __IO uint32_t HCINTMSK; /*!< Host Channel Interrupt Mask Register 50Ch */ + __IO uint32_t HCTSIZ; /*!< Host Channel Transfer Size Register 510h */ + __IO uint32_t HCDMA; /*!< Host Channel DMA Address Register 514h */ + uint32_t Reserved[2]; /*!< Reserved */ +} USB_OTG_HostChannelTypeDef; + +/** + * @} + */ + +/** @addtogroup Peripheral_memory_map + * @{ + */ +#define FLASH_BASE 0x08000000UL /*!< FLASH(up to 1 MB) base address in the alias region */ +#define CCMDATARAM_BASE 0x10000000UL /*!< CCM(core coupled memory) data RAM(64 KB) base address in the alias region */ +#define SRAM1_BASE 0x20000000UL /*!< SRAM1(112 KB) base address in the alias region */ +#define SRAM2_BASE 0x2001C000UL /*!< SRAM2(16 KB) base address in the alias region */ +#define PERIPH_BASE 0x40000000UL /*!< Peripheral base address in the alias region */ +#define BKPSRAM_BASE 0x40024000UL /*!< Backup SRAM(4 KB) base address in the alias region */ +#define FSMC_R_BASE 0xA0000000UL /*!< FSMC registers base address */ +#define SRAM1_BB_BASE 0x22000000UL /*!< SRAM1(112 KB) base address in the bit-band region */ +#define SRAM2_BB_BASE 0x22380000UL /*!< SRAM2(16 KB) base address in the bit-band region */ +#define PERIPH_BB_BASE 0x42000000UL /*!< Peripheral base address in the bit-band region */ +#define BKPSRAM_BB_BASE 0x42480000UL /*!< Backup SRAM(4 KB) base address in the bit-band region */ +#define FLASH_END 0x080FFFFFUL /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800UL /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FUL /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define CCMDATARAM_END 0x1000FFFFUL /*!< CCM data RAM end address */ + +/* Legacy defines */ +#define SRAM_BASE SRAM1_BASE +#define SRAM_BB_BASE SRAM1_BB_BASE + +/*!< Peripheral memory map */ +#define APB1PERIPH_BASE PERIPH_BASE +#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000UL) +#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000UL) +#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000UL) + +/*!< APB1 peripherals */ +#define TIM2_BASE (APB1PERIPH_BASE + 0x0000UL) +#define TIM3_BASE (APB1PERIPH_BASE + 0x0400UL) +#define TIM4_BASE (APB1PERIPH_BASE + 0x0800UL) +#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00UL) +#define TIM6_BASE (APB1PERIPH_BASE + 0x1000UL) +#define TIM7_BASE (APB1PERIPH_BASE + 0x1400UL) +#define TIM12_BASE (APB1PERIPH_BASE + 0x1800UL) +#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00UL) +#define TIM14_BASE (APB1PERIPH_BASE + 0x2000UL) +#define RTC_BASE (APB1PERIPH_BASE + 0x2800UL) +#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00UL) +#define IWDG_BASE (APB1PERIPH_BASE + 0x3000UL) +#define I2S2ext_BASE (APB1PERIPH_BASE + 0x3400UL) +#define SPI2_BASE (APB1PERIPH_BASE + 0x3800UL) +#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00UL) +#define I2S3ext_BASE (APB1PERIPH_BASE + 0x4000UL) +#define USART2_BASE (APB1PERIPH_BASE + 0x4400UL) +#define USART3_BASE (APB1PERIPH_BASE + 0x4800UL) +#define UART4_BASE (APB1PERIPH_BASE + 0x4C00UL) +#define UART5_BASE (APB1PERIPH_BASE + 0x5000UL) +#define I2C1_BASE (APB1PERIPH_BASE + 0x5400UL) +#define I2C2_BASE (APB1PERIPH_BASE + 0x5800UL) +#define I2C3_BASE (APB1PERIPH_BASE + 0x5C00UL) +#define CAN1_BASE (APB1PERIPH_BASE + 0x6400UL) +#define CAN2_BASE (APB1PERIPH_BASE + 0x6800UL) +#define PWR_BASE (APB1PERIPH_BASE + 0x7000UL) +#define DAC_BASE (APB1PERIPH_BASE + 0x7400UL) + +/*!< APB2 peripherals */ +#define TIM1_BASE (APB2PERIPH_BASE + 0x0000UL) +#define TIM8_BASE (APB2PERIPH_BASE + 0x0400UL) +#define USART1_BASE (APB2PERIPH_BASE + 0x1000UL) +#define USART6_BASE (APB2PERIPH_BASE + 0x1400UL) +#define ADC1_BASE (APB2PERIPH_BASE + 0x2000UL) +#define ADC2_BASE (APB2PERIPH_BASE + 0x2100UL) +#define ADC3_BASE (APB2PERIPH_BASE + 0x2200UL) +#define ADC123_COMMON_BASE (APB2PERIPH_BASE + 0x2300UL) +/* Legacy define */ +#define ADC_BASE ADC123_COMMON_BASE +#define SDIO_BASE (APB2PERIPH_BASE + 0x2C00UL) +#define SPI1_BASE (APB2PERIPH_BASE + 0x3000UL) +#define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800UL) +#define EXTI_BASE (APB2PERIPH_BASE + 0x3C00UL) +#define TIM9_BASE (APB2PERIPH_BASE + 0x4000UL) +#define TIM10_BASE (APB2PERIPH_BASE + 0x4400UL) +#define TIM11_BASE (APB2PERIPH_BASE + 0x4800UL) + +/*!< AHB1 peripherals */ +#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000UL) +#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400UL) +#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800UL) +#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00UL) +#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000UL) +#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400UL) +#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800UL) +#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00UL) +#define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000UL) +#define CRC_BASE (AHB1PERIPH_BASE + 0x3000UL) +#define RCC_BASE (AHB1PERIPH_BASE + 0x3800UL) +#define FLASH_R_BASE (AHB1PERIPH_BASE + 0x3C00UL) +#define DMA1_BASE (AHB1PERIPH_BASE + 0x6000UL) +#define DMA1_Stream0_BASE (DMA1_BASE + 0x010UL) +#define DMA1_Stream1_BASE (DMA1_BASE + 0x028UL) +#define DMA1_Stream2_BASE (DMA1_BASE + 0x040UL) +#define DMA1_Stream3_BASE (DMA1_BASE + 0x058UL) +#define DMA1_Stream4_BASE (DMA1_BASE + 0x070UL) +#define DMA1_Stream5_BASE (DMA1_BASE + 0x088UL) +#define DMA1_Stream6_BASE (DMA1_BASE + 0x0A0UL) +#define DMA1_Stream7_BASE (DMA1_BASE + 0x0B8UL) +#define DMA2_BASE (AHB1PERIPH_BASE + 0x6400UL) +#define DMA2_Stream0_BASE (DMA2_BASE + 0x010UL) +#define DMA2_Stream1_BASE (DMA2_BASE + 0x028UL) +#define DMA2_Stream2_BASE (DMA2_BASE + 0x040UL) +#define DMA2_Stream3_BASE (DMA2_BASE + 0x058UL) +#define DMA2_Stream4_BASE (DMA2_BASE + 0x070UL) +#define DMA2_Stream5_BASE (DMA2_BASE + 0x088UL) +#define DMA2_Stream6_BASE (DMA2_BASE + 0x0A0UL) +#define DMA2_Stream7_BASE (DMA2_BASE + 0x0B8UL) +#define ETH_BASE (AHB1PERIPH_BASE + 0x8000UL) +#define ETH_MAC_BASE (ETH_BASE) +#define ETH_MMC_BASE (ETH_BASE + 0x0100UL) +#define ETH_PTP_BASE (ETH_BASE + 0x0700UL) +#define ETH_DMA_BASE (ETH_BASE + 0x1000UL) + +/*!< AHB2 peripherals */ +#define DCMI_BASE (AHB2PERIPH_BASE + 0x50000UL) +#define RNG_BASE (AHB2PERIPH_BASE + 0x60800UL) + +/*!< FSMC Bankx registers base address */ +#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000UL) +#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104UL) +#define FSMC_Bank2_3_R_BASE (FSMC_R_BASE + 0x0060UL) +#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0UL) + + +/*!< Debug MCU registers base address */ +#define DBGMCU_BASE 0xE0042000UL +/*!< USB registers base address */ +#define USB_OTG_HS_PERIPH_BASE 0x40040000UL +#define USB_OTG_FS_PERIPH_BASE 0x50000000UL + +#define USB_OTG_GLOBAL_BASE 0x000UL +#define USB_OTG_DEVICE_BASE 0x800UL +#define USB_OTG_IN_ENDPOINT_BASE 0x900UL +#define USB_OTG_OUT_ENDPOINT_BASE 0xB00UL +#define USB_OTG_EP_REG_SIZE 0x20UL +#define USB_OTG_HOST_BASE 0x400UL +#define USB_OTG_HOST_PORT_BASE 0x440UL +#define USB_OTG_HOST_CHANNEL_BASE 0x500UL +#define USB_OTG_HOST_CHANNEL_SIZE 0x20UL +#define USB_OTG_PCGCCTL_BASE 0xE00UL +#define USB_OTG_FIFO_BASE 0x1000UL +#define USB_OTG_FIFO_SIZE 0x1000UL + +#define UID_BASE 0x1FFF7A10UL /*!< Unique device ID register base address */ +#define FLASHSIZE_BASE 0x1FFF7A22UL /*!< FLASH Size register base address */ +#define PACKAGE_BASE 0x1FFF7BF0UL /*!< Package size register base address */ +/** + * @} + */ + +/** @addtogroup Peripheral_declaration + * @{ + */ +#define TIM2 ((TIM_TypeDef *) TIM2_BASE) +#define TIM3 ((TIM_TypeDef *) TIM3_BASE) +#define TIM4 ((TIM_TypeDef *) TIM4_BASE) +#define TIM5 ((TIM_TypeDef *) TIM5_BASE) +#define TIM6 ((TIM_TypeDef *) TIM6_BASE) +#define TIM7 ((TIM_TypeDef *) TIM7_BASE) +#define TIM12 ((TIM_TypeDef *) TIM12_BASE) +#define TIM13 ((TIM_TypeDef *) TIM13_BASE) +#define TIM14 ((TIM_TypeDef *) TIM14_BASE) +#define RTC ((RTC_TypeDef *) RTC_BASE) +#define WWDG ((WWDG_TypeDef *) WWDG_BASE) +#define IWDG ((IWDG_TypeDef *) IWDG_BASE) +#define I2S2ext ((SPI_TypeDef *) I2S2ext_BASE) +#define SPI2 ((SPI_TypeDef *) SPI2_BASE) +#define SPI3 ((SPI_TypeDef *) SPI3_BASE) +#define I2S3ext ((SPI_TypeDef *) I2S3ext_BASE) +#define USART2 ((USART_TypeDef *) USART2_BASE) +#define USART3 ((USART_TypeDef *) USART3_BASE) +#define UART4 ((USART_TypeDef *) UART4_BASE) +#define UART5 ((USART_TypeDef *) UART5_BASE) +#define I2C1 ((I2C_TypeDef *) I2C1_BASE) +#define I2C2 ((I2C_TypeDef *) I2C2_BASE) +#define I2C3 ((I2C_TypeDef *) I2C3_BASE) +#define CAN1 ((CAN_TypeDef *) CAN1_BASE) +#define CAN2 ((CAN_TypeDef *) CAN2_BASE) +#define PWR ((PWR_TypeDef *) PWR_BASE) +#define DAC1 ((DAC_TypeDef *) DAC_BASE) +#define DAC ((DAC_TypeDef *) DAC_BASE) /* Kept for legacy purpose */ +#define TIM1 ((TIM_TypeDef *) TIM1_BASE) +#define TIM8 ((TIM_TypeDef *) TIM8_BASE) +#define USART1 ((USART_TypeDef *) USART1_BASE) +#define USART6 ((USART_TypeDef *) USART6_BASE) +#define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC2 ((ADC_TypeDef *) ADC2_BASE) +#define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define ADC123_COMMON ((ADC_Common_TypeDef *) ADC123_COMMON_BASE) +/* Legacy define */ +#define ADC ADC123_COMMON +#define SDIO ((SDIO_TypeDef *) SDIO_BASE) +#define SPI1 ((SPI_TypeDef *) SPI1_BASE) +#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) +#define EXTI ((EXTI_TypeDef *) EXTI_BASE) +#define TIM9 ((TIM_TypeDef *) TIM9_BASE) +#define TIM10 ((TIM_TypeDef *) TIM10_BASE) +#define TIM11 ((TIM_TypeDef *) TIM11_BASE) +#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) +#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) +#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) +#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) +#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) +#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) +#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) +#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE) +#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE) +#define CRC ((CRC_TypeDef *) CRC_BASE) +#define RCC ((RCC_TypeDef *) RCC_BASE) +#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) +#define DMA1 ((DMA_TypeDef *) DMA1_BASE) +#define DMA1_Stream0 ((DMA_Stream_TypeDef *) DMA1_Stream0_BASE) +#define DMA1_Stream1 ((DMA_Stream_TypeDef *) DMA1_Stream1_BASE) +#define DMA1_Stream2 ((DMA_Stream_TypeDef *) DMA1_Stream2_BASE) +#define DMA1_Stream3 ((DMA_Stream_TypeDef *) DMA1_Stream3_BASE) +#define DMA1_Stream4 ((DMA_Stream_TypeDef *) DMA1_Stream4_BASE) +#define DMA1_Stream5 ((DMA_Stream_TypeDef *) DMA1_Stream5_BASE) +#define DMA1_Stream6 ((DMA_Stream_TypeDef *) DMA1_Stream6_BASE) +#define DMA1_Stream7 ((DMA_Stream_TypeDef *) DMA1_Stream7_BASE) +#define DMA2 ((DMA_TypeDef *) DMA2_BASE) +#define DMA2_Stream0 ((DMA_Stream_TypeDef *) DMA2_Stream0_BASE) +#define DMA2_Stream1 ((DMA_Stream_TypeDef *) DMA2_Stream1_BASE) +#define DMA2_Stream2 ((DMA_Stream_TypeDef *) DMA2_Stream2_BASE) +#define DMA2_Stream3 ((DMA_Stream_TypeDef *) DMA2_Stream3_BASE) +#define DMA2_Stream4 ((DMA_Stream_TypeDef *) DMA2_Stream4_BASE) +#define DMA2_Stream5 ((DMA_Stream_TypeDef *) DMA2_Stream5_BASE) +#define DMA2_Stream6 ((DMA_Stream_TypeDef *) DMA2_Stream6_BASE) +#define DMA2_Stream7 ((DMA_Stream_TypeDef *) DMA2_Stream7_BASE) +#define ETH ((ETH_TypeDef *) ETH_BASE) +#define DCMI ((DCMI_TypeDef *) DCMI_BASE) +#define RNG ((RNG_TypeDef *) RNG_BASE) +#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) +#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) +#define FSMC_Bank2_3 ((FSMC_Bank2_3_TypeDef *) FSMC_Bank2_3_R_BASE) +#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) +#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) +#define USB_OTG_FS ((USB_OTG_GlobalTypeDef *) USB_OTG_FS_PERIPH_BASE) +#define USB_OTG_HS ((USB_OTG_GlobalTypeDef *) USB_OTG_HS_PERIPH_BASE) + +/** + * @} + */ + +/** @addtogroup Exported_constants + * @{ + */ + +/** @addtogroup Hardware_Constant_Definition + * @{ + */ +#define LSI_STARTUP_TIME 40U /*!< LSI Maximum startup time in us */ +/** + * @} + */ + +/** @addtogroup Peripheral_Registers_Bits_Definition +* @{ +*/ + +/******************************************************************************/ +/* Peripheral Registers_Bits_Definition */ +/******************************************************************************/ + +/******************************************************************************/ +/* */ +/* Analog to Digital Converter */ +/* */ +/******************************************************************************/ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 series) + */ +#define ADC_MULTIMODE_SUPPORT /*!> SCB_CCSIDR_ASSOCIATIVITY_Pos) +#define CCSIDR_SETS(x) (((x) & SCB_CCSIDR_NUMSETS_Msk ) >> SCB_CCSIDR_NUMSETS_Pos ) + +#ifndef __SCB_DCACHE_LINE_SIZE +#define __SCB_DCACHE_LINE_SIZE 32U /*!< Cortex-M7 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ +#endif + +#ifndef __SCB_ICACHE_LINE_SIZE +#define __SCB_ICACHE_LINE_SIZE 32U /*!< Cortex-M7 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ +#endif + +/** + \brief Enable I-Cache + \details Turns on I-Cache + */ +__STATIC_FORCEINLINE void SCB_EnableICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + if (SCB->CCR & SCB_CCR_IC_Msk) return; /* return if ICache is already enabled */ + + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ + __DSB(); + __ISB(); + SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; /* enable I-Cache */ + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Disable I-Cache + \details Turns off I-Cache + */ +__STATIC_FORCEINLINE void SCB_DisableICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk; /* disable I-Cache */ + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Invalidate I-Cache + \details Invalidates I-Cache + */ +__STATIC_FORCEINLINE void SCB_InvalidateICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; + __DSB(); + __ISB(); + #endif +} + + +/** + \brief I-Cache Invalidate by address + \details Invalidates I-Cache for the given address. + I-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. + I-Cache memory blocks which are part of given address + given size are invalidated. + \param[in] addr address + \param[in] isize size of memory block (in number of bytes) +*/ +__STATIC_FORCEINLINE void SCB_InvalidateICache_by_Addr (volatile void *addr, int32_t isize) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + if ( isize > 0 ) { + int32_t op_size = isize + (((uint32_t)addr) & (__SCB_ICACHE_LINE_SIZE - 1U)); + uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_ICACHE_LINE_SIZE - 1U) */; + + __DSB(); + + do { + SCB->ICIMVAU = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ + op_addr += __SCB_ICACHE_LINE_SIZE; + op_size -= __SCB_ICACHE_LINE_SIZE; + } while ( op_size > 0 ); + + __DSB(); + __ISB(); + } + #endif +} + + +/** + \brief Enable D-Cache + \details Turns on D-Cache + */ +__STATIC_FORCEINLINE void SCB_EnableDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + if (SCB->CCR & SCB_CCR_DC_Msk) return; /* return if DCache is already enabled */ + + SCB->CSSELR = 0U; /* select Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | + ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + __DSB(); + + SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; /* enable D-Cache */ + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Disable D-Cache + \details Turns off D-Cache + */ +__STATIC_FORCEINLINE void SCB_DisableDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /* select Level 1 data cache */ + __DSB(); + + SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk; /* disable D-Cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean & invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | + ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Invalidate D-Cache + \details Invalidates D-Cache + */ +__STATIC_FORCEINLINE void SCB_InvalidateDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /* select Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | + ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Clean D-Cache + \details Cleans D-Cache + */ +__STATIC_FORCEINLINE void SCB_CleanDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /* select Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) | + ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Clean & Invalidate D-Cache + \details Cleans and Invalidates D-Cache + */ +__STATIC_FORCEINLINE void SCB_CleanInvalidateDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /* select Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean & invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | + ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief D-Cache Invalidate by address + \details Invalidates D-Cache for the given address. + D-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. + D-Cache memory blocks which are part of given address + given size are invalidated. + \param[in] addr address + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_FORCEINLINE void SCB_InvalidateDCache_by_Addr (volatile void *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + if ( dsize > 0 ) { + int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); + uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; + + __DSB(); + + do { + SCB->DCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ + op_addr += __SCB_DCACHE_LINE_SIZE; + op_size -= __SCB_DCACHE_LINE_SIZE; + } while ( op_size > 0 ); + + __DSB(); + __ISB(); + } + #endif +} + + +/** + \brief D-Cache Clean by address + \details Cleans D-Cache for the given address + D-Cache is cleaned starting from a 32 byte aligned address in 32 byte granularity. + D-Cache memory blocks which are part of given address + given size are cleaned. + \param[in] addr address + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_FORCEINLINE void SCB_CleanDCache_by_Addr (volatile void *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + if ( dsize > 0 ) { + int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); + uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; + + __DSB(); + + do { + SCB->DCCMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ + op_addr += __SCB_DCACHE_LINE_SIZE; + op_size -= __SCB_DCACHE_LINE_SIZE; + } while ( op_size > 0 ); + + __DSB(); + __ISB(); + } + #endif +} + + +/** + \brief D-Cache Clean and Invalidate by address + \details Cleans and invalidates D_Cache for the given address + D-Cache is cleaned and invalidated starting from a 32 byte aligned address in 32 byte granularity. + D-Cache memory blocks which are part of given address + given size are cleaned and invalidated. + \param[in] addr address (aligned to 32-byte boundary) + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_FORCEINLINE void SCB_CleanInvalidateDCache_by_Addr (volatile void *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + if ( dsize > 0 ) { + int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); + uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; + + __DSB(); + + do { + SCB->DCCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ + op_addr += __SCB_DCACHE_LINE_SIZE; + op_size -= __SCB_DCACHE_LINE_SIZE; + } while ( op_size > 0 ); + + __DSB(); + __ISB(); + } + #endif +} + +/*@} end of CMSIS_Core_CacheFunctions */ + +#endif /* ARM_CACHEL1_ARMV7_H */ diff --git a/Drivers/CMSIS/Include/cmsis_armcc.h b/Drivers/CMSIS/Include/cmsis_armcc.h new file mode 100644 index 0000000..a955d47 --- /dev/null +++ b/Drivers/CMSIS/Include/cmsis_armcc.h @@ -0,0 +1,888 @@ +/**************************************************************************//** + * @file cmsis_armcc.h + * @brief CMSIS compiler ARMCC (Arm Compiler 5) header file + * @version V5.3.2 + * @date 27. May 2021 + ******************************************************************************/ +/* + * Copyright (c) 2009-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_ARMCC_H +#define __CMSIS_ARMCC_H + + +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) + #error "Please use Arm Compiler Toolchain V4.0.677 or later!" +#endif + +/* CMSIS compiler control architecture macros */ +#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \ + (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) ) + #define __ARM_ARCH_6M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1)) + #define __ARM_ARCH_7M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1)) + #define __ARM_ARCH_7EM__ 1 +#endif + + /* __ARM_ARCH_8M_BASE__ not applicable */ + /* __ARM_ARCH_8M_MAIN__ not applicable */ + /* __ARM_ARCH_8_1M_MAIN__ not applicable */ + +/* CMSIS compiler control DSP macros */ +#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + #define __ARM_FEATURE_DSP 1 +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE static __forceinline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __declspec(noreturn) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed)) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT __packed struct +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION __packed union +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x))) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr))) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __memory_changed() +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ + +#ifndef __PROGRAM_START +#define __PROGRAM_START __main +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __Vectors +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section("RESET"))) +#endif + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __nop + + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() __isb(0xF) + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __dsb(0xF) + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __dmb(0xF) + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} +#endif + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value) +{ + revsh r0, r0 + bx lr +} +#endif + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +#define __ROR __ror + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __breakpoint(value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + #define __RBIT __rbit +#else +__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ + return result; +} +#endif + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) +#else + #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) +#else + #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) +#else + #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXB(value, ptr) __strex(value, ptr) +#else + #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXH(value, ptr) __strex(value, ptr) +#else + #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXW(value, ptr) __strex(value, ptr) +#else + #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __clrex + + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) +{ + rrx r0, r0 + bx lr +} +#endif + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr)) + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRBT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRHT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRT(value, ptr) __strt(value, ptr) + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing special-purpose register PRIMASK. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting special-purpose register PRIMASK. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); */ + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; + __ISB(); +} + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_INLINE uint32_t __get_IPSR(void) +{ + register uint32_t __regIPSR __ASM("ipsr"); + return(__regIPSR); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_INLINE uint32_t __get_APSR(void) +{ + register uint32_t __regAPSR __ASM("apsr"); + return(__regAPSR); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_INLINE uint32_t __get_xPSR(void) +{ + register uint32_t __regXPSR __ASM("xpsr"); + return(__regXPSR); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + return(__regProcessStackPointer); +} + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + __regProcessStackPointer = topOfProcStack; +} + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + return(__regMainStackPointer); +} + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + __regMainStackPointer = topOfMainStack; +} + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing special-purpose register FAULTMASK. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting special-purpose register FAULTMASK. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xFFU); +} + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + register uint32_t __regBasePriMax __ASM("basepri_max"); + __regBasePriMax = (basePri & 0xFFU); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & (uint32_t)1U); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#else + (void)fpscr; +#endif +} + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +#define __SADD8 __sadd8 +#define __QADD8 __qadd8 +#define __SHADD8 __shadd8 +#define __UADD8 __uadd8 +#define __UQADD8 __uqadd8 +#define __UHADD8 __uhadd8 +#define __SSUB8 __ssub8 +#define __QSUB8 __qsub8 +#define __SHSUB8 __shsub8 +#define __USUB8 __usub8 +#define __UQSUB8 __uqsub8 +#define __UHSUB8 __uhsub8 +#define __SADD16 __sadd16 +#define __QADD16 __qadd16 +#define __SHADD16 __shadd16 +#define __UADD16 __uadd16 +#define __UQADD16 __uqadd16 +#define __UHADD16 __uhadd16 +#define __SSUB16 __ssub16 +#define __QSUB16 __qsub16 +#define __SHSUB16 __shsub16 +#define __USUB16 __usub16 +#define __UQSUB16 __uqsub16 +#define __UHSUB16 __uhsub16 +#define __SASX __sasx +#define __QASX __qasx +#define __SHASX __shasx +#define __UASX __uasx +#define __UQASX __uqasx +#define __UHASX __uhasx +#define __SSAX __ssax +#define __QSAX __qsax +#define __SHSAX __shsax +#define __USAX __usax +#define __UQSAX __uqsax +#define __UHSAX __uhsax +#define __USAD8 __usad8 +#define __USADA8 __usada8 +#define __SSAT16 __ssat16 +#define __USAT16 __usat16 +#define __UXTB16 __uxtb16 +#define __UXTAB16 __uxtab16 +#define __SXTB16 __sxtb16 +#define __SXTAB16 __sxtab16 +#define __SMUAD __smuad +#define __SMUADX __smuadx +#define __SMLAD __smlad +#define __SMLADX __smladx +#define __SMLALD __smlald +#define __SMLALDX __smlaldx +#define __SMUSD __smusd +#define __SMUSDX __smusdx +#define __SMLSD __smlsd +#define __SMLSDX __smlsdx +#define __SMLSLD __smlsld +#define __SMLSLDX __smlsldx +#define __SEL __sel +#define __QADD __qadd +#define __QSUB __qsub + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ + ((int64_t)(ARG3) << 32U) ) >> 32U)) + +#define __SXTB16_RORn(ARG1, ARG2) __SXTB16(__ROR(ARG1, ARG2)) + +#define __SXTAB16_RORn(ARG1, ARG2, ARG3) __SXTAB16(ARG1, __ROR(ARG2, ARG3)) + +#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCC_H */ diff --git a/Drivers/CMSIS/Include/cmsis_armclang.h b/Drivers/CMSIS/Include/cmsis_armclang.h new file mode 100644 index 0000000..6911417 --- /dev/null +++ b/Drivers/CMSIS/Include/cmsis_armclang.h @@ -0,0 +1,1503 @@ +/**************************************************************************//** + * @file cmsis_armclang.h + * @brief CMSIS compiler armclang (Arm Compiler 6) header file + * @version V5.4.3 + * @date 27. May 2021 + ******************************************************************************/ +/* + * Copyright (c) 2009-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ + +#ifndef __CMSIS_ARMCLANG_H +#define __CMSIS_ARMCLANG_H + +#pragma clang system_header /* treat file as system include file */ + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ + +#ifndef __PROGRAM_START +#define __PROGRAM_START __main +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __Vectors +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section("RESET"))) +#endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +#ifndef __STACK_SEAL +#define __STACK_SEAL Image$$STACKSEAL$$ZI$$Base +#endif + +#ifndef __TZ_STACK_SEAL_SIZE +#define __TZ_STACK_SEAL_SIZE 8U +#endif + +#ifndef __TZ_STACK_SEAL_VALUE +#define __TZ_STACK_SEAL_VALUE 0xFEF5EDA5FEF5EDA5ULL +#endif + + +__STATIC_FORCEINLINE void __TZ_set_STACKSEAL_S (uint32_t* stackTop) { + *((uint64_t *)stackTop) = __TZ_STACK_SEAL_VALUE; +} +#endif + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_RW_REG(r) "+l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_RW_REG(r) "+r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __builtin_arm_nop + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __builtin_arm_wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __builtin_arm_wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __builtin_arm_sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() __builtin_arm_isb(0xF) + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __builtin_arm_dsb(0xF) + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __builtin_arm_dmb(0xF) + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV(value) __builtin_bswap32(value) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV16(value) __ROR(__REV(value), 16) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REVSH(value) (int16_t)__builtin_bswap16(value) + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __builtin_arm_rbit + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) +{ + /* Even though __builtin_clz produces a CLZ instruction on ARM, formally + __builtin_clz(0) is undefined behaviour, so handle this case specially. + This guarantees ARM-compatible results if happening to compile on a non-ARM + target, and ensures the compiler doesn't decide to activate any + optimisations using the logic "value was passed to __builtin_clz, so it + is non-zero". + ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a + single CLZ instruction. + */ + if (value == 0U) + { + return 32U; + } + return __builtin_clz(value); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ + (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) + +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB (uint8_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH (uint16_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW (uint32_t)__builtin_arm_ldrex + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW (uint32_t)__builtin_arm_strex + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __builtin_arm_clrex + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ + (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __builtin_arm_ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __builtin_arm_usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ + (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) + +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDAEXB (uint8_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDAEXH (uint16_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDAEX (uint32_t)__builtin_arm_ldaex + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXB (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXH (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEX (uint32_t)__builtin_arm_stlex + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ + (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing special-purpose register PRIMASK. + Can only be executed in Privileged modes. + */ +#ifndef __ARM_COMPAT_H +__STATIC_FORCEINLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} +#endif + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting special-purpose register PRIMASK. + Can only be executed in Privileged modes. + */ +#ifndef __ARM_COMPAT_H +__STATIC_FORCEINLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i" : : : "memory"); +} +#endif + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); + __ISB(); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); + __ISB(); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing special-purpose register FAULTMASK. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f" : : : "memory"); +} + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting special-purpose register FAULTMASK. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f" : : : "memory"); +} + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ + (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) ) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) ) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) ) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) ) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ + (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr +#else +#define __get_FPSCR() ((uint32_t)0U) +#endif + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __set_FPSCR __builtin_arm_set_fpscr +#else +#define __set_FPSCR(x) ((void)(x)) +#endif + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +#define __SADD8 __builtin_arm_sadd8 +#define __QADD8 __builtin_arm_qadd8 +#define __SHADD8 __builtin_arm_shadd8 +#define __UADD8 __builtin_arm_uadd8 +#define __UQADD8 __builtin_arm_uqadd8 +#define __UHADD8 __builtin_arm_uhadd8 +#define __SSUB8 __builtin_arm_ssub8 +#define __QSUB8 __builtin_arm_qsub8 +#define __SHSUB8 __builtin_arm_shsub8 +#define __USUB8 __builtin_arm_usub8 +#define __UQSUB8 __builtin_arm_uqsub8 +#define __UHSUB8 __builtin_arm_uhsub8 +#define __SADD16 __builtin_arm_sadd16 +#define __QADD16 __builtin_arm_qadd16 +#define __SHADD16 __builtin_arm_shadd16 +#define __UADD16 __builtin_arm_uadd16 +#define __UQADD16 __builtin_arm_uqadd16 +#define __UHADD16 __builtin_arm_uhadd16 +#define __SSUB16 __builtin_arm_ssub16 +#define __QSUB16 __builtin_arm_qsub16 +#define __SHSUB16 __builtin_arm_shsub16 +#define __USUB16 __builtin_arm_usub16 +#define __UQSUB16 __builtin_arm_uqsub16 +#define __UHSUB16 __builtin_arm_uhsub16 +#define __SASX __builtin_arm_sasx +#define __QASX __builtin_arm_qasx +#define __SHASX __builtin_arm_shasx +#define __UASX __builtin_arm_uasx +#define __UQASX __builtin_arm_uqasx +#define __UHASX __builtin_arm_uhasx +#define __SSAX __builtin_arm_ssax +#define __QSAX __builtin_arm_qsax +#define __SHSAX __builtin_arm_shsax +#define __USAX __builtin_arm_usax +#define __UQSAX __builtin_arm_uqsax +#define __UHSAX __builtin_arm_uhsax +#define __USAD8 __builtin_arm_usad8 +#define __USADA8 __builtin_arm_usada8 +#define __SSAT16 __builtin_arm_ssat16 +#define __USAT16 __builtin_arm_usat16 +#define __UXTB16 __builtin_arm_uxtb16 +#define __UXTAB16 __builtin_arm_uxtab16 +#define __SXTB16 __builtin_arm_sxtb16 +#define __SXTAB16 __builtin_arm_sxtab16 +#define __SMUAD __builtin_arm_smuad +#define __SMUADX __builtin_arm_smuadx +#define __SMLAD __builtin_arm_smlad +#define __SMLADX __builtin_arm_smladx +#define __SMLALD __builtin_arm_smlald +#define __SMLALDX __builtin_arm_smlaldx +#define __SMUSD __builtin_arm_smusd +#define __SMUSDX __builtin_arm_smusdx +#define __SMLSD __builtin_arm_smlsd +#define __SMLSDX __builtin_arm_smlsdx +#define __SMLSLD __builtin_arm_smlsld +#define __SMLSLDX __builtin_arm_smlsldx +#define __SEL __builtin_arm_sel +#define __QADD __builtin_arm_qadd +#define __QSUB __builtin_arm_qsub + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +#define __SXTB16_RORn(ARG1, ARG2) __SXTB16(__ROR(ARG1, ARG2)) + +#define __SXTAB16_RORn(ARG1, ARG2, ARG3) __SXTAB16(ARG1, __ROR(ARG2, ARG3)) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCLANG_H */ diff --git a/Drivers/CMSIS/Include/cmsis_armclang_ltm.h b/Drivers/CMSIS/Include/cmsis_armclang_ltm.h new file mode 100644 index 0000000..1e255d5 --- /dev/null +++ b/Drivers/CMSIS/Include/cmsis_armclang_ltm.h @@ -0,0 +1,1928 @@ +/**************************************************************************//** + * @file cmsis_armclang_ltm.h + * @brief CMSIS compiler armclang (Arm Compiler 6) header file + * @version V1.5.3 + * @date 27. May 2021 + ******************************************************************************/ +/* + * Copyright (c) 2018-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ + +#ifndef __CMSIS_ARMCLANG_H +#define __CMSIS_ARMCLANG_H + +#pragma clang system_header /* treat file as system include file */ + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ + +#ifndef __PROGRAM_START +#define __PROGRAM_START __main +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __Vectors +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section("RESET"))) +#endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +#ifndef __STACK_SEAL +#define __STACK_SEAL Image$$STACKSEAL$$ZI$$Base +#endif + +#ifndef __TZ_STACK_SEAL_SIZE +#define __TZ_STACK_SEAL_SIZE 8U +#endif + +#ifndef __TZ_STACK_SEAL_VALUE +#define __TZ_STACK_SEAL_VALUE 0xFEF5EDA5FEF5EDA5ULL +#endif + + +__STATIC_FORCEINLINE void __TZ_set_STACKSEAL_S (uint32_t* stackTop) { + *((uint64_t *)stackTop) = __TZ_STACK_SEAL_VALUE; +} +#endif + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __builtin_arm_nop + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __builtin_arm_wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __builtin_arm_wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __builtin_arm_sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() __builtin_arm_isb(0xF) + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __builtin_arm_dsb(0xF) + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __builtin_arm_dmb(0xF) + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV(value) __builtin_bswap32(value) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV16(value) __ROR(__REV(value), 16) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REVSH(value) (int16_t)__builtin_bswap16(value) + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __builtin_arm_rbit + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) +{ + /* Even though __builtin_clz produces a CLZ instruction on ARM, formally + __builtin_clz(0) is undefined behaviour, so handle this case specially. + This guarantees ARM-compatible results if happening to compile on a non-ARM + target, and ensures the compiler doesn't decide to activate any + optimisations using the logic "value was passed to __builtin_clz, so it + is non-zero". + ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a + single CLZ instruction. + */ + if (value == 0U) + { + return 32U; + } + return __builtin_clz(value); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB (uint8_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH (uint16_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW (uint32_t)__builtin_arm_ldrex + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW (uint32_t)__builtin_arm_strex + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __builtin_arm_clrex + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __builtin_arm_ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __builtin_arm_usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDAEXB (uint8_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDAEXH (uint16_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDAEX (uint32_t)__builtin_arm_ldaex + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXB (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXH (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEX (uint32_t)__builtin_arm_stlex + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing special-purpose register PRIMASK. + Can only be executed in Privileged modes. + */ +#ifndef __ARM_COMPAT_H +__STATIC_FORCEINLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} +#endif + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting special-purpose register PRIMASK. + Can only be executed in Privileged modes. + */ +#ifndef __ARM_COMPAT_H +__STATIC_FORCEINLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i" : : : "memory"); +} +#endif + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); + __ISB(); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); + __ISB(); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing special-purpose register FAULTMASK. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f" : : : "memory"); +} + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting special-purpose register FAULTMASK. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f" : : : "memory"); +} + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr +#else +#define __get_FPSCR() ((uint32_t)0U) +#endif + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __set_FPSCR __builtin_arm_set_fpscr +#else +#define __set_FPSCR(x) ((void)(x)) +#endif + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +#define __SXTB16_RORn(ARG1, ARG2) __SXTB16(__ROR(ARG1, ARG2)) + +#define __SXTAB16_RORn(ARG1, ARG2, ARG3) __SXTAB16(ARG1, __ROR(ARG2, ARG3)) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCLANG_H */ diff --git a/Drivers/CMSIS/Include/cmsis_compiler.h b/Drivers/CMSIS/Include/cmsis_compiler.h new file mode 100644 index 0000000..adbf296 --- /dev/null +++ b/Drivers/CMSIS/Include/cmsis_compiler.h @@ -0,0 +1,283 @@ +/**************************************************************************//** + * @file cmsis_compiler.h + * @brief CMSIS compiler generic header file + * @version V5.1.0 + * @date 09. October 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_COMPILER_H +#define __CMSIS_COMPILER_H + +#include + +/* + * Arm Compiler 4/5 + */ +#if defined ( __CC_ARM ) + #include "cmsis_armcc.h" + + +/* + * Arm Compiler 6.6 LTM (armclang) + */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) + #include "cmsis_armclang_ltm.h" + + /* + * Arm Compiler above 6.10.1 (armclang) + */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) + #include "cmsis_armclang.h" + + +/* + * GNU Compiler + */ +#elif defined ( __GNUC__ ) + #include "cmsis_gcc.h" + + +/* + * IAR Compiler + */ +#elif defined ( __ICCARM__ ) + #include + + +/* + * TI Arm Compiler + */ +#elif defined ( __TI_ARM__ ) + #include + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __attribute__((packed)) + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed)) + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed)) + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) + #endif + #ifndef __RESTRICT + #define __RESTRICT __restrict + #endif + #ifndef __COMPILER_BARRIER + #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. + #define __COMPILER_BARRIER() (void)0 + #endif + + +/* + * TASKING Compiler + */ +#elif defined ( __TASKING__ ) + /* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __packed__ + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __packed__ + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __packed__ + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __packed__ T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __align(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + #ifndef __COMPILER_BARRIER + #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. + #define __COMPILER_BARRIER() (void)0 + #endif + + +/* + * COSMIC Compiler + */ +#elif defined ( __CSMC__ ) + #include + + #ifndef __ASM + #define __ASM _asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + // NO RETURN is automatically detected hence no warning here + #define __NO_RETURN + #endif + #ifndef __USED + #warning No compiler specific solution for __USED. __USED is ignored. + #define __USED + #endif + #ifndef __WEAK + #define __WEAK __weak + #endif + #ifndef __PACKED + #define __PACKED @packed + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT @packed struct + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION @packed union + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + @packed struct T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. + #define __ALIGNED(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + #ifndef __COMPILER_BARRIER + #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. + #define __COMPILER_BARRIER() (void)0 + #endif + + +#else + #error Unknown compiler. +#endif + + +#endif /* __CMSIS_COMPILER_H */ + diff --git a/Drivers/CMSIS/Include/cmsis_gcc.h b/Drivers/CMSIS/Include/cmsis_gcc.h new file mode 100644 index 0000000..67bda4e --- /dev/null +++ b/Drivers/CMSIS/Include/cmsis_gcc.h @@ -0,0 +1,2211 @@ +/**************************************************************************//** + * @file cmsis_gcc.h + * @brief CMSIS compiler GCC header file + * @version V5.4.1 + * @date 27. May 2021 + ******************************************************************************/ +/* + * Copyright (c) 2009-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_GCC_H +#define __CMSIS_GCC_H + +/* ignore some GCC warnings */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" + +/* Fallback for __has_builtin */ +#ifndef __has_builtin + #define __has_builtin(x) (0) +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ + +#ifndef __PROGRAM_START + +/** + \brief Initializes data and bss sections + \details This default implementations initialized all data and additional bss + sections relying on .copy.table and .zero.table specified properly + in the used linker script. + + */ +__STATIC_FORCEINLINE __NO_RETURN void __cmsis_start(void) +{ + extern void _start(void) __NO_RETURN; + + typedef struct { + uint32_t const* src; + uint32_t* dest; + uint32_t wlen; + } __copy_table_t; + + typedef struct { + uint32_t* dest; + uint32_t wlen; + } __zero_table_t; + + extern const __copy_table_t __copy_table_start__; + extern const __copy_table_t __copy_table_end__; + extern const __zero_table_t __zero_table_start__; + extern const __zero_table_t __zero_table_end__; + + for (__copy_table_t const* pTable = &__copy_table_start__; pTable < &__copy_table_end__; ++pTable) { + for(uint32_t i=0u; iwlen; ++i) { + pTable->dest[i] = pTable->src[i]; + } + } + + for (__zero_table_t const* pTable = &__zero_table_start__; pTable < &__zero_table_end__; ++pTable) { + for(uint32_t i=0u; iwlen; ++i) { + pTable->dest[i] = 0u; + } + } + + _start(); +} + +#define __PROGRAM_START __cmsis_start +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP __StackTop +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT __StackLimit +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __Vectors +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section(".vectors"))) +#endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +#ifndef __STACK_SEAL +#define __STACK_SEAL __StackSeal +#endif + +#ifndef __TZ_STACK_SEAL_SIZE +#define __TZ_STACK_SEAL_SIZE 8U +#endif + +#ifndef __TZ_STACK_SEAL_VALUE +#define __TZ_STACK_SEAL_VALUE 0xFEF5EDA5FEF5EDA5ULL +#endif + + +__STATIC_FORCEINLINE void __TZ_set_STACKSEAL_S (uint32_t* stackTop) { + *((uint64_t *)stackTop) = __TZ_STACK_SEAL_VALUE; +} +#endif + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_RW_REG(r) "+l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_RW_REG(r) "+r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP() __ASM volatile ("nop") + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI() __ASM volatile ("wfi":::"memory") + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE() __ASM volatile ("wfe":::"memory") + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV() __ASM volatile ("sev") + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +__STATIC_FORCEINLINE void __ISB(void) +{ + __ASM volatile ("isb 0xF":::"memory"); +} + + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__STATIC_FORCEINLINE void __DSB(void) +{ + __ASM volatile ("dsb 0xF":::"memory"); +} + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__STATIC_FORCEINLINE void __DMB(void) +{ + __ASM volatile ("dmb 0xF":::"memory"); +} + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV(uint32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + return __builtin_bswap32(value); +#else + uint32_t result; + + __ASM ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE int16_t __REVSH(int16_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + return (int16_t)__builtin_bswap16(value); +#else + int16_t result; + + __ASM ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + __ASM ("rbit %0, %1" : "=r" (result) : "r" (value) ); +#else + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ +#endif + return result; +} + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) +{ + /* Even though __builtin_clz produces a CLZ instruction on ARM, formally + __builtin_clz(0) is undefined behaviour, so handle this case specially. + This guarantees ARM-compatible results if happening to compile on a non-ARM + target, and ensures the compiler doesn't decide to activate any + optimisations using the logic "value was passed to __builtin_clz, so it + is non-zero". + ARM GCC 7.3 and possibly earlier will optimise this test away, leaving a + single CLZ instruction. + */ + if (value == 0U) + { + return 32U; + } + return __builtin_clz(value); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); + return(result); +} + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +__STATIC_FORCEINLINE void __CLREX(void) +{ + __ASM volatile ("clrex" ::: "memory"); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1, ARG2) \ +__extension__ \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM volatile ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ + __RES; \ + }) + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1, ARG2) \ +__extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM volatile ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ + __RES; \ + }) + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAEXB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexb %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAEXH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexh %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDAEX(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaex %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); + return(result); +} + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexb %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); + return(result); +} + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexh %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); + return(result); +} + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlex %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); + return(result); +} + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing special-purpose register PRIMASK. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting special-purpose register PRIMASK. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i" : : : "memory"); +} + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); + __ISB(); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); + __ISB(); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing special-purpose register FAULTMASK. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f" : : : "memory"); +} + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting special-purpose register FAULTMASK. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f" : : : "memory"); +} + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_FORCEINLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_get_fpscr) +// Re-enable using built-in when GCC has been fixed +// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + return __builtin_arm_get_fpscr(); +#else + uint32_t result; + + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + return(result); +#endif +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_set_fpscr) +// Re-enable using built-in when GCC has been fixed +// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + __builtin_arm_set_fpscr(fpscr); +#else + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); +#endif +#else + (void)fpscr; +#endif +} + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1, ARG2) \ +__extension__ \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM volatile ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ + __RES; \ + }) + +#define __USAT16(ARG1, ARG2) \ +__extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM volatile ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) : "cc" ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16_RORn(uint32_t op1, uint32_t rotate) +{ + uint32_t result; + if (__builtin_constant_p(rotate) && ((rotate == 8U) || (rotate == 16U) || (rotate == 24U))) { + __ASM volatile ("sxtb16 %0, %1, ROR %2" : "=r" (result) : "r" (op1), "i" (rotate) ); + } else { + result = __SXTB16(__ROR(op1, rotate)) ; + } + return result; +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16_RORn(uint32_t op1, uint32_t op2, uint32_t rotate) +{ + uint32_t result; + if (__builtin_constant_p(rotate) && ((rotate == 8U) || (rotate == 16U) || (rotate == 24U))) { + __ASM volatile ("sxtab16 %0, %1, %2, ROR %3" : "=r" (result) : "r" (op1) , "r" (op2) , "i" (rotate)); + } else { + result = __SXTAB16(op1, __ROR(op2, rotate)); + } + return result; +} + + +__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +#define __PKHBT(ARG1,ARG2,ARG3) \ +__extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +#define __PKHTB(ARG1,ARG2,ARG3) \ +__extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#pragma GCC diagnostic pop + +#endif /* __CMSIS_GCC_H */ diff --git a/Drivers/CMSIS/Include/cmsis_iccarm.h b/Drivers/CMSIS/Include/cmsis_iccarm.h new file mode 100644 index 0000000..65b824b --- /dev/null +++ b/Drivers/CMSIS/Include/cmsis_iccarm.h @@ -0,0 +1,1002 @@ +/**************************************************************************//** + * @file cmsis_iccarm.h + * @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file + * @version V5.3.0 + * @date 14. April 2021 + ******************************************************************************/ + +//------------------------------------------------------------------------------ +// +// Copyright (c) 2017-2021 IAR Systems +// Copyright (c) 2017-2021 Arm Limited. All rights reserved. +// +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License") +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//------------------------------------------------------------------------------ + + +#ifndef __CMSIS_ICCARM_H__ +#define __CMSIS_ICCARM_H__ + +#ifndef __ICCARM__ + #error This file should only be compiled by ICCARM +#endif + +#pragma system_include + +#define __IAR_FT _Pragma("inline=forced") __intrinsic + +#if (__VER__ >= 8000000) + #define __ICCARM_V8 1 +#else + #define __ICCARM_V8 0 +#endif + +#ifndef __ALIGNED + #if __ICCARM_V8 + #define __ALIGNED(x) __attribute__((aligned(x))) + #elif (__VER__ >= 7080000) + /* Needs IAR language extensions */ + #define __ALIGNED(x) __attribute__((aligned(x))) + #else + #warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored. + #define __ALIGNED(x) + #endif +#endif + + +/* Define compiler macros for CPU architecture, used in CMSIS 5. + */ +#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ || __ARM_ARCH_8M_BASE__ || __ARM_ARCH_8M_MAIN__ +/* Macros already defined */ +#else + #if defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM_ARCH_PROFILE) && __ARM_ARCH_PROFILE == 'M' + #if __ARM_ARCH == 6 + #define __ARM_ARCH_6M__ 1 + #elif __ARM_ARCH == 7 + #if __ARM_FEATURE_DSP + #define __ARM_ARCH_7EM__ 1 + #else + #define __ARM_ARCH_7M__ 1 + #endif + #endif /* __ARM_ARCH */ + #endif /* __ARM_ARCH_PROFILE == 'M' */ +#endif + +/* Alternativ core deduction for older ICCARM's */ +#if !defined(__ARM_ARCH_6M__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__) && \ + !defined(__ARM_ARCH_8M_BASE__) && !defined(__ARM_ARCH_8M_MAIN__) + #if defined(__ARM6M__) && (__CORE__ == __ARM6M__) + #define __ARM_ARCH_6M__ 1 + #elif defined(__ARM7M__) && (__CORE__ == __ARM7M__) + #define __ARM_ARCH_7M__ 1 + #elif defined(__ARM7EM__) && (__CORE__ == __ARM7EM__) + #define __ARM_ARCH_7EM__ 1 + #elif defined(__ARM8M_BASELINE__) && (__CORE == __ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM8M_MAINLINE__) && (__CORE == __ARM8M_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8EM_MAINLINE__) && (__CORE == __ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #else + #error "Unknown target." + #endif +#endif + + + +#if defined(__ARM_ARCH_6M__) && __ARM_ARCH_6M__==1 + #define __IAR_M0_FAMILY 1 +#elif defined(__ARM_ARCH_8M_BASE__) && __ARM_ARCH_8M_BASE__==1 + #define __IAR_M0_FAMILY 1 +#else + #define __IAR_M0_FAMILY 0 +#endif + + +#ifndef __ASM + #define __ASM __asm +#endif + +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#endif + +#ifndef __INLINE + #define __INLINE inline +#endif + +#ifndef __NO_RETURN + #if __ICCARM_V8 + #define __NO_RETURN __attribute__((__noreturn__)) + #else + #define __NO_RETURN _Pragma("object_attribute=__noreturn") + #endif +#endif + +#ifndef __PACKED + #if __ICCARM_V8 + #define __PACKED __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED __packed + #endif +#endif + +#ifndef __PACKED_STRUCT + #if __ICCARM_V8 + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_STRUCT __packed struct + #endif +#endif + +#ifndef __PACKED_UNION + #if __ICCARM_V8 + #define __PACKED_UNION union __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_UNION __packed union + #endif +#endif + +#ifndef __RESTRICT + #if __ICCARM_V8 + #define __RESTRICT __restrict + #else + /* Needs IAR language extensions */ + #define __RESTRICT restrict + #endif +#endif + +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif + +#ifndef __FORCEINLINE + #define __FORCEINLINE _Pragma("inline=forced") +#endif + +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __FORCEINLINE __STATIC_INLINE +#endif + +#ifndef __UNALIGNED_UINT16_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint16_t __iar_uint16_read(void const *ptr) +{ + return *(__packed uint16_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR) +#endif + + +#ifndef __UNALIGNED_UINT16_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val) +{ + *(__packed uint16_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint32_t __iar_uint32_read(void const *ptr) +{ + return *(__packed uint32_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR) +#endif + +#ifndef __UNALIGNED_UINT32_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val) +{ + *(__packed uint32_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32 /* deprecated */ +#pragma language=save +#pragma language=extended +__packed struct __iar_u32 { uint32_t v; }; +#pragma language=restore +#define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v) +#endif + +#ifndef __USED + #if __ICCARM_V8 + #define __USED __attribute__((used)) + #else + #define __USED _Pragma("__root") + #endif +#endif + +#undef __WEAK /* undo the definition from DLib_Defaults.h */ +#ifndef __WEAK + #if __ICCARM_V8 + #define __WEAK __attribute__((weak)) + #else + #define __WEAK _Pragma("__weak") + #endif +#endif + +#ifndef __PROGRAM_START +#define __PROGRAM_START __iar_program_start +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP CSTACK$$Limit +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT CSTACK$$Base +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __vector_table +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE @".intvec" +#endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +#ifndef __STACK_SEAL +#define __STACK_SEAL STACKSEAL$$Base +#endif + +#ifndef __TZ_STACK_SEAL_SIZE +#define __TZ_STACK_SEAL_SIZE 8U +#endif + +#ifndef __TZ_STACK_SEAL_VALUE +#define __TZ_STACK_SEAL_VALUE 0xFEF5EDA5FEF5EDA5ULL +#endif + +__STATIC_FORCEINLINE void __TZ_set_STACKSEAL_S (uint32_t* stackTop) { + *((uint64_t *)stackTop) = __TZ_STACK_SEAL_VALUE; +} +#endif + +#ifndef __ICCARM_INTRINSICS_VERSION__ + #define __ICCARM_INTRINSICS_VERSION__ 0 +#endif + +#if __ICCARM_INTRINSICS_VERSION__ == 2 + + #if defined(__CLZ) + #undef __CLZ + #endif + #if defined(__REVSH) + #undef __REVSH + #endif + #if defined(__RBIT) + #undef __RBIT + #endif + #if defined(__SSAT) + #undef __SSAT + #endif + #if defined(__USAT) + #undef __USAT + #endif + + #include "iccarm_builtin.h" + + #define __disable_fault_irq __iar_builtin_disable_fiq + #define __disable_irq __iar_builtin_disable_interrupt + #define __enable_fault_irq __iar_builtin_enable_fiq + #define __enable_irq __iar_builtin_enable_interrupt + #define __arm_rsr __iar_builtin_rsr + #define __arm_wsr __iar_builtin_wsr + + + #define __get_APSR() (__arm_rsr("APSR")) + #define __get_BASEPRI() (__arm_rsr("BASEPRI")) + #define __get_CONTROL() (__arm_rsr("CONTROL")) + #define __get_FAULTMASK() (__arm_rsr("FAULTMASK")) + + #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + #define __get_FPSCR() (__arm_rsr("FPSCR")) + #define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", (VALUE))) + #else + #define __get_FPSCR() ( 0 ) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #define __get_IPSR() (__arm_rsr("IPSR")) + #define __get_MSP() (__arm_rsr("MSP")) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __get_MSPLIM() (0U) + #else + #define __get_MSPLIM() (__arm_rsr("MSPLIM")) + #endif + #define __get_PRIMASK() (__arm_rsr("PRIMASK")) + #define __get_PSP() (__arm_rsr("PSP")) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __get_PSPLIM() (0U) + #else + #define __get_PSPLIM() (__arm_rsr("PSPLIM")) + #endif + + #define __get_xPSR() (__arm_rsr("xPSR")) + + #define __set_BASEPRI(VALUE) (__arm_wsr("BASEPRI", (VALUE))) + #define __set_BASEPRI_MAX(VALUE) (__arm_wsr("BASEPRI_MAX", (VALUE))) + +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __arm_wsr("CONTROL", control); + __iar_builtin_ISB(); +} + + #define __set_FAULTMASK(VALUE) (__arm_wsr("FAULTMASK", (VALUE))) + #define __set_MSP(VALUE) (__arm_wsr("MSP", (VALUE))) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __set_MSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_MSPLIM(VALUE) (__arm_wsr("MSPLIM", (VALUE))) + #endif + #define __set_PRIMASK(VALUE) (__arm_wsr("PRIMASK", (VALUE))) + #define __set_PSP(VALUE) (__arm_wsr("PSP", (VALUE))) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __set_PSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_PSPLIM(VALUE) (__arm_wsr("PSPLIM", (VALUE))) + #endif + + #define __TZ_get_CONTROL_NS() (__arm_rsr("CONTROL_NS")) + +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __arm_wsr("CONTROL_NS", control); + __iar_builtin_ISB(); +} + + #define __TZ_get_PSP_NS() (__arm_rsr("PSP_NS")) + #define __TZ_set_PSP_NS(VALUE) (__arm_wsr("PSP_NS", (VALUE))) + #define __TZ_get_MSP_NS() (__arm_rsr("MSP_NS")) + #define __TZ_set_MSP_NS(VALUE) (__arm_wsr("MSP_NS", (VALUE))) + #define __TZ_get_SP_NS() (__arm_rsr("SP_NS")) + #define __TZ_set_SP_NS(VALUE) (__arm_wsr("SP_NS", (VALUE))) + #define __TZ_get_PRIMASK_NS() (__arm_rsr("PRIMASK_NS")) + #define __TZ_set_PRIMASK_NS(VALUE) (__arm_wsr("PRIMASK_NS", (VALUE))) + #define __TZ_get_BASEPRI_NS() (__arm_rsr("BASEPRI_NS")) + #define __TZ_set_BASEPRI_NS(VALUE) (__arm_wsr("BASEPRI_NS", (VALUE))) + #define __TZ_get_FAULTMASK_NS() (__arm_rsr("FAULTMASK_NS")) + #define __TZ_set_FAULTMASK_NS(VALUE)(__arm_wsr("FAULTMASK_NS", (VALUE))) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __TZ_get_PSPLIM_NS() (0U) + #define __TZ_set_PSPLIM_NS(VALUE) ((void)(VALUE)) + #else + #define __TZ_get_PSPLIM_NS() (__arm_rsr("PSPLIM_NS")) + #define __TZ_set_PSPLIM_NS(VALUE) (__arm_wsr("PSPLIM_NS", (VALUE))) + #endif + + #define __TZ_get_MSPLIM_NS() (__arm_rsr("MSPLIM_NS")) + #define __TZ_set_MSPLIM_NS(VALUE) (__arm_wsr("MSPLIM_NS", (VALUE))) + + #define __NOP __iar_builtin_no_operation + + #define __CLZ __iar_builtin_CLZ + #define __CLREX __iar_builtin_CLREX + + #define __DMB __iar_builtin_DMB + #define __DSB __iar_builtin_DSB + #define __ISB __iar_builtin_ISB + + #define __LDREXB __iar_builtin_LDREXB + #define __LDREXH __iar_builtin_LDREXH + #define __LDREXW __iar_builtin_LDREX + + #define __RBIT __iar_builtin_RBIT + #define __REV __iar_builtin_REV + #define __REV16 __iar_builtin_REV16 + + __IAR_FT int16_t __REVSH(int16_t val) + { + return (int16_t) __iar_builtin_REVSH(val); + } + + #define __ROR __iar_builtin_ROR + #define __RRX __iar_builtin_RRX + + #define __SEV __iar_builtin_SEV + + #if !__IAR_M0_FAMILY + #define __SSAT __iar_builtin_SSAT + #endif + + #define __STREXB __iar_builtin_STREXB + #define __STREXH __iar_builtin_STREXH + #define __STREXW __iar_builtin_STREX + + #if !__IAR_M0_FAMILY + #define __USAT __iar_builtin_USAT + #endif + + #define __WFE __iar_builtin_WFE + #define __WFI __iar_builtin_WFI + + #if __ARM_MEDIA__ + #define __SADD8 __iar_builtin_SADD8 + #define __QADD8 __iar_builtin_QADD8 + #define __SHADD8 __iar_builtin_SHADD8 + #define __UADD8 __iar_builtin_UADD8 + #define __UQADD8 __iar_builtin_UQADD8 + #define __UHADD8 __iar_builtin_UHADD8 + #define __SSUB8 __iar_builtin_SSUB8 + #define __QSUB8 __iar_builtin_QSUB8 + #define __SHSUB8 __iar_builtin_SHSUB8 + #define __USUB8 __iar_builtin_USUB8 + #define __UQSUB8 __iar_builtin_UQSUB8 + #define __UHSUB8 __iar_builtin_UHSUB8 + #define __SADD16 __iar_builtin_SADD16 + #define __QADD16 __iar_builtin_QADD16 + #define __SHADD16 __iar_builtin_SHADD16 + #define __UADD16 __iar_builtin_UADD16 + #define __UQADD16 __iar_builtin_UQADD16 + #define __UHADD16 __iar_builtin_UHADD16 + #define __SSUB16 __iar_builtin_SSUB16 + #define __QSUB16 __iar_builtin_QSUB16 + #define __SHSUB16 __iar_builtin_SHSUB16 + #define __USUB16 __iar_builtin_USUB16 + #define __UQSUB16 __iar_builtin_UQSUB16 + #define __UHSUB16 __iar_builtin_UHSUB16 + #define __SASX __iar_builtin_SASX + #define __QASX __iar_builtin_QASX + #define __SHASX __iar_builtin_SHASX + #define __UASX __iar_builtin_UASX + #define __UQASX __iar_builtin_UQASX + #define __UHASX __iar_builtin_UHASX + #define __SSAX __iar_builtin_SSAX + #define __QSAX __iar_builtin_QSAX + #define __SHSAX __iar_builtin_SHSAX + #define __USAX __iar_builtin_USAX + #define __UQSAX __iar_builtin_UQSAX + #define __UHSAX __iar_builtin_UHSAX + #define __USAD8 __iar_builtin_USAD8 + #define __USADA8 __iar_builtin_USADA8 + #define __SSAT16 __iar_builtin_SSAT16 + #define __USAT16 __iar_builtin_USAT16 + #define __UXTB16 __iar_builtin_UXTB16 + #define __UXTAB16 __iar_builtin_UXTAB16 + #define __SXTB16 __iar_builtin_SXTB16 + #define __SXTAB16 __iar_builtin_SXTAB16 + #define __SMUAD __iar_builtin_SMUAD + #define __SMUADX __iar_builtin_SMUADX + #define __SMMLA __iar_builtin_SMMLA + #define __SMLAD __iar_builtin_SMLAD + #define __SMLADX __iar_builtin_SMLADX + #define __SMLALD __iar_builtin_SMLALD + #define __SMLALDX __iar_builtin_SMLALDX + #define __SMUSD __iar_builtin_SMUSD + #define __SMUSDX __iar_builtin_SMUSDX + #define __SMLSD __iar_builtin_SMLSD + #define __SMLSDX __iar_builtin_SMLSDX + #define __SMLSLD __iar_builtin_SMLSLD + #define __SMLSLDX __iar_builtin_SMLSLDX + #define __SEL __iar_builtin_SEL + #define __QADD __iar_builtin_QADD + #define __QSUB __iar_builtin_QSUB + #define __PKHBT __iar_builtin_PKHBT + #define __PKHTB __iar_builtin_PKHTB + #endif + +#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #define __CLZ __cmsis_iar_clz_not_active + #define __SSAT __cmsis_iar_ssat_not_active + #define __USAT __cmsis_iar_usat_not_active + #define __RBIT __cmsis_iar_rbit_not_active + #define __get_APSR __cmsis_iar_get_APSR_not_active + #endif + + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #define __get_FPSCR __cmsis_iar_get_FPSR_not_active + #define __set_FPSCR __cmsis_iar_set_FPSR_not_active + #endif + + #ifdef __INTRINSICS_INCLUDED + #error intrinsics.h is already included previously! + #endif + + #include + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #undef __CLZ + #undef __SSAT + #undef __USAT + #undef __RBIT + #undef __get_APSR + + __STATIC_INLINE uint8_t __CLZ(uint32_t data) + { + if (data == 0U) { return 32U; } + + uint32_t count = 0U; + uint32_t mask = 0x80000000U; + + while ((data & mask) == 0U) + { + count += 1U; + mask = mask >> 1U; + } + return count; + } + + __STATIC_INLINE uint32_t __RBIT(uint32_t v) + { + uint8_t sc = 31U; + uint32_t r = v; + for (v >>= 1U; v; v >>= 1U) + { + r <<= 1U; + r |= v & 1U; + sc--; + } + return (r << sc); + } + + __STATIC_INLINE uint32_t __get_APSR(void) + { + uint32_t res; + __asm("MRS %0,APSR" : "=r" (res)); + return res; + } + + #endif + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #undef __get_FPSCR + #undef __set_FPSCR + #define __get_FPSCR() (0) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #pragma diag_suppress=Pe940 + #pragma diag_suppress=Pe177 + + #define __enable_irq __enable_interrupt + #define __disable_irq __disable_interrupt + #define __NOP __no_operation + + #define __get_xPSR __get_PSR + + #if (!defined(__ARM_ARCH_6M__) || __ARM_ARCH_6M__==0) + + __IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr) + { + return __LDREX((unsigned long *)ptr); + } + + __IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr) + { + return __STREX(value, (unsigned long *)ptr); + } + #endif + + + /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + #if (__CORTEX_M >= 0x03) + + __IAR_FT uint32_t __RRX(uint32_t value) + { + uint32_t result; + __ASM volatile("RRX %0, %1" : "=r"(result) : "r" (value)); + return(result); + } + + __IAR_FT void __set_BASEPRI_MAX(uint32_t value) + { + __asm volatile("MSR BASEPRI_MAX,%0"::"r" (value)); + } + + + #define __enable_fault_irq __enable_fiq + #define __disable_fault_irq __disable_fiq + + + #endif /* (__CORTEX_M >= 0x03) */ + + __IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2) + { + return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2)); + } + + #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + __IAR_FT uint32_t __get_MSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,MSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_MSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR MSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __get_PSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,PSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_PSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR PSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __TZ_get_CONTROL_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,CONTROL_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_CONTROL_NS(uint32_t value) + { + __asm volatile("MSR CONTROL_NS,%0" :: "r" (value)); + __iar_builtin_ISB(); + } + + __IAR_FT uint32_t __TZ_get_PSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PSP_NS(uint32_t value) + { + __asm volatile("MSR PSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_MSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSP_NS(uint32_t value) + { + __asm volatile("MSR MSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_SP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,SP_NS" : "=r" (res)); + return res; + } + __IAR_FT void __TZ_set_SP_NS(uint32_t value) + { + __asm volatile("MSR SP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PRIMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PRIMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PRIMASK_NS(uint32_t value) + { + __asm volatile("MSR PRIMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_BASEPRI_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,BASEPRI_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_BASEPRI_NS(uint32_t value) + { + __asm volatile("MSR BASEPRI_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_FAULTMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,FAULTMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_FAULTMASK_NS(uint32_t value) + { + __asm volatile("MSR FAULTMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSPLIM_NS(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,PSPLIM_NS" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __TZ_set_PSPLIM_NS(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR PSPLIM_NS,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __TZ_get_MSPLIM_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSPLIM_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSPLIM_NS(uint32_t value) + { + __asm volatile("MSR MSPLIM_NS,%0" :: "r" (value)); + } + + #endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + +#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value)) + +#if __IAR_M0_FAMILY + __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) + { + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; + } + + __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) + { + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; + } +#endif + +#if (__CORTEX_M >= 0x03) /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + + __IAR_FT uint8_t __LDRBT(volatile uint8_t *addr) + { + uint32_t res; + __ASM volatile ("LDRBT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDRHT(volatile uint16_t *addr) + { + uint32_t res; + __ASM volatile ("LDRHT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDRT(volatile uint32_t *addr) + { + uint32_t res; + __ASM volatile ("LDRT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return res; + } + + __IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr) + { + __ASM volatile ("STRBT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr) + { + __ASM volatile ("STRHT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr) + { + __ASM volatile ("STRT %1, [%0]" : : "r" (addr), "r" (value) : "memory"); + } + +#endif /* (__CORTEX_M >= 0x03) */ + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + + __IAR_FT uint8_t __LDAB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDA(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDA %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return res; + } + + __IAR_FT void __STLB(uint8_t value, volatile uint8_t *ptr) + { + __ASM volatile ("STLB %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STLH(uint16_t value, volatile uint16_t *ptr) + { + __ASM volatile ("STLH %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STL(uint32_t value, volatile uint32_t *ptr) + { + __ASM volatile ("STL %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT uint8_t __LDAEXB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAEXH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDAEX(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEX %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXB %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXH %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEX %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + +#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#undef __IAR_FT +#undef __IAR_M0_FAMILY +#undef __ICCARM_V8 + +#pragma diag_default=Pe940 +#pragma diag_default=Pe177 + +#define __SXTB16_RORn(ARG1, ARG2) __SXTB16(__ROR(ARG1, ARG2)) + +#define __SXTAB16_RORn(ARG1, ARG2, ARG3) __SXTAB16(ARG1, __ROR(ARG2, ARG3)) + +#endif /* __CMSIS_ICCARM_H__ */ diff --git a/Drivers/CMSIS/Include/cmsis_version.h b/Drivers/CMSIS/Include/cmsis_version.h new file mode 100644 index 0000000..8b4765f --- /dev/null +++ b/Drivers/CMSIS/Include/cmsis_version.h @@ -0,0 +1,39 @@ +/**************************************************************************//** + * @file cmsis_version.h + * @brief CMSIS Core(M) Version definitions + * @version V5.0.5 + * @date 02. February 2022 + ******************************************************************************/ +/* + * Copyright (c) 2009-2022 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CMSIS_VERSION_H +#define __CMSIS_VERSION_H + +/* CMSIS Version definitions */ +#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */ +#define __CM_CMSIS_VERSION_SUB ( 6U) /*!< [15:0] CMSIS Core(M) sub version */ +#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \ + __CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */ +#endif diff --git a/Drivers/CMSIS/Include/core_armv81mml.h b/Drivers/CMSIS/Include/core_armv81mml.h new file mode 100644 index 0000000..94128a1 --- /dev/null +++ b/Drivers/CMSIS/Include/core_armv81mml.h @@ -0,0 +1,4228 @@ +/**************************************************************************//** + * @file core_armv81mml.h + * @brief CMSIS Armv8.1-M Mainline Core Peripheral Access Layer Header File + * @version V1.4.2 + * @date 13. October 2021 + ******************************************************************************/ +/* + * Copyright (c) 2018-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#elif defined ( __GNUC__ ) + #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ +#endif + +#ifndef __CORE_ARMV81MML_H_GENERIC +#define __CORE_ARMV81MML_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_ARMV81MML + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS ARMV81MML definitions */ +#define __ARMv81MML_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __ARMv81MML_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __ARMv81MML_CMSIS_VERSION ((__ARMv81MML_CMSIS_VERSION_MAIN << 16U) | \ + __ARMv81MML_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (81U) /*!< Cortex-M Core */ + +#if defined ( __CC_ARM ) + #error Legacy Arm Compiler does not support Armv8.1-M target architecture. +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV81MML_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_ARMV81MML_H_DEPENDANT +#define __CORE_ARMV81MML_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __ARMv81MML_REV + #define __ARMv81MML_REV 0x0000U + #warning "__ARMv81MML_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #if __FPU_PRESENT != 0U + #ifndef __FPU_DP + #define __FPU_DP 0U + #warning "__FPU_DP not defined in device header file; using default!" + #endif + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __ICACHE_PRESENT + #define __ICACHE_PRESENT 0U + #warning "__ICACHE_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DCACHE_PRESENT + #define __DCACHE_PRESENT 0U + #warning "__DCACHE_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __PMU_PRESENT + #define __PMU_PRESENT 0U + #warning "__PMU_PRESENT not defined in device header file; using default!" + #endif + + #if __PMU_PRESENT != 0U + #ifndef __PMU_NUM_EVENTCNT + #define __PMU_NUM_EVENTCNT 2U + #warning "__PMU_NUM_EVENTCNT not defined in device header file; using default!" + #elif (__PMU_NUM_EVENTCNT > 31 || __PMU_NUM_EVENTCNT < 2) + #error "__PMU_NUM_EVENTCNT is out of range in device header file!" */ + #endif + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 1U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group ARMv81MML */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED7[21U]; + __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ + uint32_t RESERVED3[69U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + __IOM uint32_t RFSR; /*!< Offset: 0x204 (R/W) RAS Fault Status Register */ + uint32_t RESERVED4[14U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_IESB_Pos 5U /*!< SCB AIRCR: Implicit ESB Enable Position */ +#define SCB_AIRCR_IESB_Msk (1UL << SCB_AIRCR_IESB_Pos) /*!< SCB AIRCR: Implicit ESB Enable Mask */ + +#define SCB_AIRCR_DIT_Pos 4U /*!< SCB AIRCR: Data Independent Timing Position */ +#define SCB_AIRCR_DIT_Msk (1UL << SCB_AIRCR_DIT_Pos) /*!< SCB AIRCR: Data Independent Timing Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_TRD_Pos 20U /*!< SCB CCR: TRD Position */ +#define SCB_CCR_TRD_Msk (1UL << SCB_CCR_TRD_Pos) /*!< SCB CCR: TRD Mask */ + +#define SCB_CCR_LOB_Pos 19U /*!< SCB CCR: LOB Position */ +#define SCB_CCR_LOB_Msk (1UL << SCB_CCR_LOB_Pos) /*!< SCB CCR: LOB Mask */ + +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_PMU_Pos 5U /*!< SCB DFSR: PMU Position */ +#define SCB_DFSR_PMU_Msk (1UL << SCB_DFSR_PMU_Pos) /*!< SCB DFSR: PMU Mask */ + +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CP7_Pos 7U /*!< SCB NSACR: CP7 Position */ +#define SCB_NSACR_CP7_Msk (1UL << SCB_NSACR_CP7_Pos) /*!< SCB NSACR: CP7 Mask */ + +#define SCB_NSACR_CP6_Pos 6U /*!< SCB NSACR: CP6 Position */ +#define SCB_NSACR_CP6_Msk (1UL << SCB_NSACR_CP6_Pos) /*!< SCB NSACR: CP6 Mask */ + +#define SCB_NSACR_CP5_Pos 5U /*!< SCB NSACR: CP5 Position */ +#define SCB_NSACR_CP5_Msk (1UL << SCB_NSACR_CP5_Pos) /*!< SCB NSACR: CP5 Mask */ + +#define SCB_NSACR_CP4_Pos 4U /*!< SCB NSACR: CP4 Position */ +#define SCB_NSACR_CP4_Msk (1UL << SCB_NSACR_CP4_Pos) /*!< SCB NSACR: CP4 Mask */ + +#define SCB_NSACR_CP3_Pos 3U /*!< SCB NSACR: CP3 Position */ +#define SCB_NSACR_CP3_Msk (1UL << SCB_NSACR_CP3_Pos) /*!< SCB NSACR: CP3 Mask */ + +#define SCB_NSACR_CP2_Pos 2U /*!< SCB NSACR: CP2 Position */ +#define SCB_NSACR_CP2_Msk (1UL << SCB_NSACR_CP2_Pos) /*!< SCB NSACR: CP2 Mask */ + +#define SCB_NSACR_CP1_Pos 1U /*!< SCB NSACR: CP1 Position */ +#define SCB_NSACR_CP1_Msk (1UL << SCB_NSACR_CP1_Pos) /*!< SCB NSACR: CP1 Mask */ + +#define SCB_NSACR_CP0_Pos 0U /*!< SCB NSACR: CP0 Position */ +#define SCB_NSACR_CP0_Msk (1UL /*<< SCB_NSACR_CP0_Pos*/) /*!< SCB NSACR: CP0 Mask */ + +/* SCB Debug Feature Register 0 Definitions */ +#define SCB_ID_DFR_UDE_Pos 28U /*!< SCB ID_DFR: UDE Position */ +#define SCB_ID_DFR_UDE_Msk (0xFUL << SCB_ID_DFR_UDE_Pos) /*!< SCB ID_DFR: UDE Mask */ + +#define SCB_ID_DFR_MProfDbg_Pos 20U /*!< SCB ID_DFR: MProfDbg Position */ +#define SCB_ID_DFR_MProfDbg_Msk (0xFUL << SCB_ID_DFR_MProfDbg_Pos) /*!< SCB ID_DFR: MProfDbg Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB RAS Fault Status Register Definitions */ +#define SCB_RFSR_V_Pos 31U /*!< SCB RFSR: V Position */ +#define SCB_RFSR_V_Msk (1UL << SCB_RFSR_V_Pos) /*!< SCB RFSR: V Mask */ + +#define SCB_RFSR_IS_Pos 16U /*!< SCB RFSR: IS Position */ +#define SCB_RFSR_IS_Msk (0x7FFFUL << SCB_RFSR_IS_Pos) /*!< SCB RFSR: IS Mask */ + +#define SCB_RFSR_UET_Pos 0U /*!< SCB RFSR: UET Position */ +#define SCB_RFSR_UET_Msk (3UL /*<< SCB_RFSR_UET_Pos*/) /*!< SCB RFSR: UET Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[32U]; + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[3U]; + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) ITM Device Type Register */ + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ +#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ + +#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[809U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ + uint32_t RESERVED4[4U]; + __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ +#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFmt_Pos 0U /*!< TPI FFCR: EnFmt Position */ +#define TPI_FFCR_EnFmt_Msk (0x3UL << /*TPI_FFCR_EnFmt_Pos*/) /*!< TPI FFCR: EnFmt Mask */ + +/* TPI Periodic Synchronization Control Register Definitions */ +#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ +#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ + +/* TPI Software Lock Status Register Definitions */ +#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ +#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ + +#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ +#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ + +#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ +#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + +#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_PMU Performance Monitoring Unit (PMU) + \brief Type definitions for the Performance Monitoring Unit (PMU) + @{ + */ + +/** + \brief Structure type to access the Performance Monitoring Unit (PMU). + */ +typedef struct +{ + __IOM uint32_t EVCNTR[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x0 (R/W) PMU Event Counter Registers */ +#if __PMU_NUM_EVENTCNT<31 + uint32_t RESERVED0[31U-__PMU_NUM_EVENTCNT]; +#endif + __IOM uint32_t CCNTR; /*!< Offset: 0x7C (R/W) PMU Cycle Counter Register */ + uint32_t RESERVED1[224]; + __IOM uint32_t EVTYPER[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x400 (R/W) PMU Event Type and Filter Registers */ +#if __PMU_NUM_EVENTCNT<31 + uint32_t RESERVED2[31U-__PMU_NUM_EVENTCNT]; +#endif + __IOM uint32_t CCFILTR; /*!< Offset: 0x47C (R/W) PMU Cycle Counter Filter Register */ + uint32_t RESERVED3[480]; + __IOM uint32_t CNTENSET; /*!< Offset: 0xC00 (R/W) PMU Count Enable Set Register */ + uint32_t RESERVED4[7]; + __IOM uint32_t CNTENCLR; /*!< Offset: 0xC20 (R/W) PMU Count Enable Clear Register */ + uint32_t RESERVED5[7]; + __IOM uint32_t INTENSET; /*!< Offset: 0xC40 (R/W) PMU Interrupt Enable Set Register */ + uint32_t RESERVED6[7]; + __IOM uint32_t INTENCLR; /*!< Offset: 0xC60 (R/W) PMU Interrupt Enable Clear Register */ + uint32_t RESERVED7[7]; + __IOM uint32_t OVSCLR; /*!< Offset: 0xC80 (R/W) PMU Overflow Flag Status Clear Register */ + uint32_t RESERVED8[7]; + __IOM uint32_t SWINC; /*!< Offset: 0xCA0 (R/W) PMU Software Increment Register */ + uint32_t RESERVED9[7]; + __IOM uint32_t OVSSET; /*!< Offset: 0xCC0 (R/W) PMU Overflow Flag Status Set Register */ + uint32_t RESERVED10[79]; + __IOM uint32_t TYPE; /*!< Offset: 0xE00 (R/W) PMU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0xE04 (R/W) PMU Control Register */ + uint32_t RESERVED11[108]; + __IOM uint32_t AUTHSTATUS; /*!< Offset: 0xFB8 (R/W) PMU Authentication Status Register */ + __IOM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/W) PMU Device Architecture Register */ + uint32_t RESERVED12[3]; + __IOM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/W) PMU Device Type Register */ + __IOM uint32_t PIDR4; /*!< Offset: 0xFD0 (R/W) PMU Peripheral Identification Register 4 */ + uint32_t RESERVED13[3]; + __IOM uint32_t PIDR0; /*!< Offset: 0xFE0 (R/W) PMU Peripheral Identification Register 0 */ + __IOM uint32_t PIDR1; /*!< Offset: 0xFE4 (R/W) PMU Peripheral Identification Register 1 */ + __IOM uint32_t PIDR2; /*!< Offset: 0xFE8 (R/W) PMU Peripheral Identification Register 2 */ + __IOM uint32_t PIDR3; /*!< Offset: 0xFEC (R/W) PMU Peripheral Identification Register 3 */ + __IOM uint32_t CIDR0; /*!< Offset: 0xFF0 (R/W) PMU Component Identification Register 0 */ + __IOM uint32_t CIDR1; /*!< Offset: 0xFF4 (R/W) PMU Component Identification Register 1 */ + __IOM uint32_t CIDR2; /*!< Offset: 0xFF8 (R/W) PMU Component Identification Register 2 */ + __IOM uint32_t CIDR3; /*!< Offset: 0xFFC (R/W) PMU Component Identification Register 3 */ +} PMU_Type; + +/** \brief PMU Event Counter Registers (0-30) Definitions */ + +#define PMU_EVCNTR_CNT_Pos 0U /*!< PMU EVCNTR: Counter Position */ +#define PMU_EVCNTR_CNT_Msk (0xFFFFUL /*<< PMU_EVCNTRx_CNT_Pos*/) /*!< PMU EVCNTR: Counter Mask */ + +/** \brief PMU Event Type and Filter Registers (0-30) Definitions */ + +#define PMU_EVTYPER_EVENTTOCNT_Pos 0U /*!< PMU EVTYPER: Event to Count Position */ +#define PMU_EVTYPER_EVENTTOCNT_Msk (0xFFFFUL /*<< EVTYPERx_EVENTTOCNT_Pos*/) /*!< PMU EVTYPER: Event to Count Mask */ + +/** \brief PMU Count Enable Set Register Definitions */ + +#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENSET: Event Counter 0 Enable Set Position */ +#define PMU_CNTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENSET_CNT0_ENABLE_Pos*/) /*!< PMU CNTENSET: Event Counter 0 Enable Set Mask */ + +#define PMU_CNTENSET_CNT1_ENABLE_Pos 1U /*!< PMU CNTENSET: Event Counter 1 Enable Set Position */ +#define PMU_CNTENSET_CNT1_ENABLE_Msk (1UL << PMU_CNTENSET_CNT1_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 1 Enable Set Mask */ + +#define PMU_CNTENSET_CNT2_ENABLE_Pos 2U /*!< PMU CNTENSET: Event Counter 2 Enable Set Position */ +#define PMU_CNTENSET_CNT2_ENABLE_Msk (1UL << PMU_CNTENSET_CNT2_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 2 Enable Set Mask */ + +#define PMU_CNTENSET_CNT3_ENABLE_Pos 3U /*!< PMU CNTENSET: Event Counter 3 Enable Set Position */ +#define PMU_CNTENSET_CNT3_ENABLE_Msk (1UL << PMU_CNTENSET_CNT3_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 3 Enable Set Mask */ + +#define PMU_CNTENSET_CNT4_ENABLE_Pos 4U /*!< PMU CNTENSET: Event Counter 4 Enable Set Position */ +#define PMU_CNTENSET_CNT4_ENABLE_Msk (1UL << PMU_CNTENSET_CNT4_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 4 Enable Set Mask */ + +#define PMU_CNTENSET_CNT5_ENABLE_Pos 5U /*!< PMU CNTENSET: Event Counter 5 Enable Set Position */ +#define PMU_CNTENSET_CNT5_ENABLE_Msk (1UL << PMU_CNTENSET_CNT5_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 5 Enable Set Mask */ + +#define PMU_CNTENSET_CNT6_ENABLE_Pos 6U /*!< PMU CNTENSET: Event Counter 6 Enable Set Position */ +#define PMU_CNTENSET_CNT6_ENABLE_Msk (1UL << PMU_CNTENSET_CNT6_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 6 Enable Set Mask */ + +#define PMU_CNTENSET_CNT7_ENABLE_Pos 7U /*!< PMU CNTENSET: Event Counter 7 Enable Set Position */ +#define PMU_CNTENSET_CNT7_ENABLE_Msk (1UL << PMU_CNTENSET_CNT7_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 7 Enable Set Mask */ + +#define PMU_CNTENSET_CNT8_ENABLE_Pos 8U /*!< PMU CNTENSET: Event Counter 8 Enable Set Position */ +#define PMU_CNTENSET_CNT8_ENABLE_Msk (1UL << PMU_CNTENSET_CNT8_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 8 Enable Set Mask */ + +#define PMU_CNTENSET_CNT9_ENABLE_Pos 9U /*!< PMU CNTENSET: Event Counter 9 Enable Set Position */ +#define PMU_CNTENSET_CNT9_ENABLE_Msk (1UL << PMU_CNTENSET_CNT9_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 9 Enable Set Mask */ + +#define PMU_CNTENSET_CNT10_ENABLE_Pos 10U /*!< PMU CNTENSET: Event Counter 10 Enable Set Position */ +#define PMU_CNTENSET_CNT10_ENABLE_Msk (1UL << PMU_CNTENSET_CNT10_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 10 Enable Set Mask */ + +#define PMU_CNTENSET_CNT11_ENABLE_Pos 11U /*!< PMU CNTENSET: Event Counter 11 Enable Set Position */ +#define PMU_CNTENSET_CNT11_ENABLE_Msk (1UL << PMU_CNTENSET_CNT11_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 11 Enable Set Mask */ + +#define PMU_CNTENSET_CNT12_ENABLE_Pos 12U /*!< PMU CNTENSET: Event Counter 12 Enable Set Position */ +#define PMU_CNTENSET_CNT12_ENABLE_Msk (1UL << PMU_CNTENSET_CNT12_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 12 Enable Set Mask */ + +#define PMU_CNTENSET_CNT13_ENABLE_Pos 13U /*!< PMU CNTENSET: Event Counter 13 Enable Set Position */ +#define PMU_CNTENSET_CNT13_ENABLE_Msk (1UL << PMU_CNTENSET_CNT13_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 13 Enable Set Mask */ + +#define PMU_CNTENSET_CNT14_ENABLE_Pos 14U /*!< PMU CNTENSET: Event Counter 14 Enable Set Position */ +#define PMU_CNTENSET_CNT14_ENABLE_Msk (1UL << PMU_CNTENSET_CNT14_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 14 Enable Set Mask */ + +#define PMU_CNTENSET_CNT15_ENABLE_Pos 15U /*!< PMU CNTENSET: Event Counter 15 Enable Set Position */ +#define PMU_CNTENSET_CNT15_ENABLE_Msk (1UL << PMU_CNTENSET_CNT15_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 15 Enable Set Mask */ + +#define PMU_CNTENSET_CNT16_ENABLE_Pos 16U /*!< PMU CNTENSET: Event Counter 16 Enable Set Position */ +#define PMU_CNTENSET_CNT16_ENABLE_Msk (1UL << PMU_CNTENSET_CNT16_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 16 Enable Set Mask */ + +#define PMU_CNTENSET_CNT17_ENABLE_Pos 17U /*!< PMU CNTENSET: Event Counter 17 Enable Set Position */ +#define PMU_CNTENSET_CNT17_ENABLE_Msk (1UL << PMU_CNTENSET_CNT17_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 17 Enable Set Mask */ + +#define PMU_CNTENSET_CNT18_ENABLE_Pos 18U /*!< PMU CNTENSET: Event Counter 18 Enable Set Position */ +#define PMU_CNTENSET_CNT18_ENABLE_Msk (1UL << PMU_CNTENSET_CNT18_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 18 Enable Set Mask */ + +#define PMU_CNTENSET_CNT19_ENABLE_Pos 19U /*!< PMU CNTENSET: Event Counter 19 Enable Set Position */ +#define PMU_CNTENSET_CNT19_ENABLE_Msk (1UL << PMU_CNTENSET_CNT19_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 19 Enable Set Mask */ + +#define PMU_CNTENSET_CNT20_ENABLE_Pos 20U /*!< PMU CNTENSET: Event Counter 20 Enable Set Position */ +#define PMU_CNTENSET_CNT20_ENABLE_Msk (1UL << PMU_CNTENSET_CNT20_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 20 Enable Set Mask */ + +#define PMU_CNTENSET_CNT21_ENABLE_Pos 21U /*!< PMU CNTENSET: Event Counter 21 Enable Set Position */ +#define PMU_CNTENSET_CNT21_ENABLE_Msk (1UL << PMU_CNTENSET_CNT21_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 21 Enable Set Mask */ + +#define PMU_CNTENSET_CNT22_ENABLE_Pos 22U /*!< PMU CNTENSET: Event Counter 22 Enable Set Position */ +#define PMU_CNTENSET_CNT22_ENABLE_Msk (1UL << PMU_CNTENSET_CNT22_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 22 Enable Set Mask */ + +#define PMU_CNTENSET_CNT23_ENABLE_Pos 23U /*!< PMU CNTENSET: Event Counter 23 Enable Set Position */ +#define PMU_CNTENSET_CNT23_ENABLE_Msk (1UL << PMU_CNTENSET_CNT23_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 23 Enable Set Mask */ + +#define PMU_CNTENSET_CNT24_ENABLE_Pos 24U /*!< PMU CNTENSET: Event Counter 24 Enable Set Position */ +#define PMU_CNTENSET_CNT24_ENABLE_Msk (1UL << PMU_CNTENSET_CNT24_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 24 Enable Set Mask */ + +#define PMU_CNTENSET_CNT25_ENABLE_Pos 25U /*!< PMU CNTENSET: Event Counter 25 Enable Set Position */ +#define PMU_CNTENSET_CNT25_ENABLE_Msk (1UL << PMU_CNTENSET_CNT25_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 25 Enable Set Mask */ + +#define PMU_CNTENSET_CNT26_ENABLE_Pos 26U /*!< PMU CNTENSET: Event Counter 26 Enable Set Position */ +#define PMU_CNTENSET_CNT26_ENABLE_Msk (1UL << PMU_CNTENSET_CNT26_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 26 Enable Set Mask */ + +#define PMU_CNTENSET_CNT27_ENABLE_Pos 27U /*!< PMU CNTENSET: Event Counter 27 Enable Set Position */ +#define PMU_CNTENSET_CNT27_ENABLE_Msk (1UL << PMU_CNTENSET_CNT27_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 27 Enable Set Mask */ + +#define PMU_CNTENSET_CNT28_ENABLE_Pos 28U /*!< PMU CNTENSET: Event Counter 28 Enable Set Position */ +#define PMU_CNTENSET_CNT28_ENABLE_Msk (1UL << PMU_CNTENSET_CNT28_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 28 Enable Set Mask */ + +#define PMU_CNTENSET_CNT29_ENABLE_Pos 29U /*!< PMU CNTENSET: Event Counter 29 Enable Set Position */ +#define PMU_CNTENSET_CNT29_ENABLE_Msk (1UL << PMU_CNTENSET_CNT29_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 29 Enable Set Mask */ + +#define PMU_CNTENSET_CNT30_ENABLE_Pos 30U /*!< PMU CNTENSET: Event Counter 30 Enable Set Position */ +#define PMU_CNTENSET_CNT30_ENABLE_Msk (1UL << PMU_CNTENSET_CNT30_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 30 Enable Set Mask */ + +#define PMU_CNTENSET_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENSET: Cycle Counter Enable Set Position */ +#define PMU_CNTENSET_CCNTR_ENABLE_Msk (1UL << PMU_CNTENSET_CCNTR_ENABLE_Pos) /*!< PMU CNTENSET: Cycle Counter Enable Set Mask */ + +/** \brief PMU Count Enable Clear Register Definitions */ + +#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Position */ +#define PMU_CNTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU CNTENCLR: Event Counter 1 Enable Clear Position */ +#define PMU_CNTENCLR_CNT1_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT1_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 1 Enable Clear */ + +#define PMU_CNTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Position */ +#define PMU_CNTENCLR_CNT2_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT2_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Position */ +#define PMU_CNTENCLR_CNT3_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT3_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Position */ +#define PMU_CNTENCLR_CNT4_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT4_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Position */ +#define PMU_CNTENCLR_CNT5_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT5_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Position */ +#define PMU_CNTENCLR_CNT6_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT6_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Position */ +#define PMU_CNTENCLR_CNT7_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT7_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Position */ +#define PMU_CNTENCLR_CNT8_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT8_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Position */ +#define PMU_CNTENCLR_CNT9_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT9_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Position */ +#define PMU_CNTENCLR_CNT10_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT10_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Position */ +#define PMU_CNTENCLR_CNT11_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT11_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Position */ +#define PMU_CNTENCLR_CNT12_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT12_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Position */ +#define PMU_CNTENCLR_CNT13_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT13_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Position */ +#define PMU_CNTENCLR_CNT14_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT14_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Position */ +#define PMU_CNTENCLR_CNT15_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT15_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Position */ +#define PMU_CNTENCLR_CNT16_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT16_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Position */ +#define PMU_CNTENCLR_CNT17_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT17_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Position */ +#define PMU_CNTENCLR_CNT18_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT18_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Position */ +#define PMU_CNTENCLR_CNT19_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT19_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Position */ +#define PMU_CNTENCLR_CNT20_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT20_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Position */ +#define PMU_CNTENCLR_CNT21_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT21_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Position */ +#define PMU_CNTENCLR_CNT22_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT22_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Position */ +#define PMU_CNTENCLR_CNT23_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT23_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Position */ +#define PMU_CNTENCLR_CNT24_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT24_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Position */ +#define PMU_CNTENCLR_CNT25_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT25_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Position */ +#define PMU_CNTENCLR_CNT26_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT26_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Position */ +#define PMU_CNTENCLR_CNT27_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT27_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Position */ +#define PMU_CNTENCLR_CNT28_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT28_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Position */ +#define PMU_CNTENCLR_CNT29_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT29_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Position */ +#define PMU_CNTENCLR_CNT30_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT30_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Mask */ + +#define PMU_CNTENCLR_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENCLR: Cycle Counter Enable Clear Position */ +#define PMU_CNTENCLR_CCNTR_ENABLE_Msk (1UL << PMU_CNTENCLR_CCNTR_ENABLE_Pos) /*!< PMU CNTENCLR: Cycle Counter Enable Clear Mask */ + +/** \brief PMU Interrupt Enable Set Register Definitions */ + +#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENSET_CNT0_ENABLE_Pos*/) /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT1_ENABLE_Pos 1U /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT1_ENABLE_Msk (1UL << PMU_INTENSET_CNT1_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT2_ENABLE_Pos 2U /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT2_ENABLE_Msk (1UL << PMU_INTENSET_CNT2_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT3_ENABLE_Pos 3U /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT3_ENABLE_Msk (1UL << PMU_INTENSET_CNT3_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT4_ENABLE_Pos 4U /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT4_ENABLE_Msk (1UL << PMU_INTENSET_CNT4_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT5_ENABLE_Pos 5U /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT5_ENABLE_Msk (1UL << PMU_INTENSET_CNT5_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT6_ENABLE_Pos 6U /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT6_ENABLE_Msk (1UL << PMU_INTENSET_CNT6_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT7_ENABLE_Pos 7U /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT7_ENABLE_Msk (1UL << PMU_INTENSET_CNT7_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT8_ENABLE_Pos 8U /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT8_ENABLE_Msk (1UL << PMU_INTENSET_CNT8_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT9_ENABLE_Pos 9U /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT9_ENABLE_Msk (1UL << PMU_INTENSET_CNT9_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT10_ENABLE_Pos 10U /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT10_ENABLE_Msk (1UL << PMU_INTENSET_CNT10_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT11_ENABLE_Pos 11U /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT11_ENABLE_Msk (1UL << PMU_INTENSET_CNT11_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT12_ENABLE_Pos 12U /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT12_ENABLE_Msk (1UL << PMU_INTENSET_CNT12_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT13_ENABLE_Pos 13U /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT13_ENABLE_Msk (1UL << PMU_INTENSET_CNT13_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT14_ENABLE_Pos 14U /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT14_ENABLE_Msk (1UL << PMU_INTENSET_CNT14_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT15_ENABLE_Pos 15U /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT15_ENABLE_Msk (1UL << PMU_INTENSET_CNT15_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT16_ENABLE_Pos 16U /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT16_ENABLE_Msk (1UL << PMU_INTENSET_CNT16_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT17_ENABLE_Pos 17U /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT17_ENABLE_Msk (1UL << PMU_INTENSET_CNT17_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT18_ENABLE_Pos 18U /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT18_ENABLE_Msk (1UL << PMU_INTENSET_CNT18_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT19_ENABLE_Pos 19U /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT19_ENABLE_Msk (1UL << PMU_INTENSET_CNT19_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT20_ENABLE_Pos 20U /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT20_ENABLE_Msk (1UL << PMU_INTENSET_CNT20_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT21_ENABLE_Pos 21U /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT21_ENABLE_Msk (1UL << PMU_INTENSET_CNT21_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT22_ENABLE_Pos 22U /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT22_ENABLE_Msk (1UL << PMU_INTENSET_CNT22_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT23_ENABLE_Pos 23U /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT23_ENABLE_Msk (1UL << PMU_INTENSET_CNT23_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT24_ENABLE_Pos 24U /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT24_ENABLE_Msk (1UL << PMU_INTENSET_CNT24_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT25_ENABLE_Pos 25U /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT25_ENABLE_Msk (1UL << PMU_INTENSET_CNT25_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT26_ENABLE_Pos 26U /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT26_ENABLE_Msk (1UL << PMU_INTENSET_CNT26_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT27_ENABLE_Pos 27U /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT27_ENABLE_Msk (1UL << PMU_INTENSET_CNT27_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT28_ENABLE_Pos 28U /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT28_ENABLE_Msk (1UL << PMU_INTENSET_CNT28_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT29_ENABLE_Pos 29U /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT29_ENABLE_Msk (1UL << PMU_INTENSET_CNT29_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT30_ENABLE_Pos 30U /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT30_ENABLE_Msk (1UL << PMU_INTENSET_CNT30_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Position */ +#define PMU_INTENSET_CCYCNT_ENABLE_Msk (1UL << PMU_INTENSET_CYCCNT_ENABLE_Pos) /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Mask */ + +/** \brief PMU Interrupt Enable Clear Register Definitions */ + +#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT1_ENABLE_Msk (1UL << PMU_INTENCLR_CNT1_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear */ + +#define PMU_INTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT2_ENABLE_Msk (1UL << PMU_INTENCLR_CNT2_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT3_ENABLE_Msk (1UL << PMU_INTENCLR_CNT3_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT4_ENABLE_Msk (1UL << PMU_INTENCLR_CNT4_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT5_ENABLE_Msk (1UL << PMU_INTENCLR_CNT5_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT6_ENABLE_Msk (1UL << PMU_INTENCLR_CNT6_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT7_ENABLE_Msk (1UL << PMU_INTENCLR_CNT7_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT8_ENABLE_Msk (1UL << PMU_INTENCLR_CNT8_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT9_ENABLE_Msk (1UL << PMU_INTENCLR_CNT9_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT10_ENABLE_Msk (1UL << PMU_INTENCLR_CNT10_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT11_ENABLE_Msk (1UL << PMU_INTENCLR_CNT11_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT12_ENABLE_Msk (1UL << PMU_INTENCLR_CNT12_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT13_ENABLE_Msk (1UL << PMU_INTENCLR_CNT13_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT14_ENABLE_Msk (1UL << PMU_INTENCLR_CNT14_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT15_ENABLE_Msk (1UL << PMU_INTENCLR_CNT15_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT16_ENABLE_Msk (1UL << PMU_INTENCLR_CNT16_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT17_ENABLE_Msk (1UL << PMU_INTENCLR_CNT17_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT18_ENABLE_Msk (1UL << PMU_INTENCLR_CNT18_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT19_ENABLE_Msk (1UL << PMU_INTENCLR_CNT19_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT20_ENABLE_Msk (1UL << PMU_INTENCLR_CNT20_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT21_ENABLE_Msk (1UL << PMU_INTENCLR_CNT21_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT22_ENABLE_Msk (1UL << PMU_INTENCLR_CNT22_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT23_ENABLE_Msk (1UL << PMU_INTENCLR_CNT23_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT24_ENABLE_Msk (1UL << PMU_INTENCLR_CNT24_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT25_ENABLE_Msk (1UL << PMU_INTENCLR_CNT25_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT26_ENABLE_Msk (1UL << PMU_INTENCLR_CNT26_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT27_ENABLE_Msk (1UL << PMU_INTENCLR_CNT27_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT28_ENABLE_Msk (1UL << PMU_INTENCLR_CNT28_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT29_ENABLE_Msk (1UL << PMU_INTENCLR_CNT29_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT30_ENABLE_Msk (1UL << PMU_INTENCLR_CNT30_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CYCCNT_ENABLE_Msk (1UL << PMU_INTENCLR_CYCCNT_ENABLE_Pos) /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Mask */ + +/** \brief PMU Overflow Flag Status Set Register Definitions */ + +#define PMU_OVSSET_CNT0_STATUS_Pos 0U /*!< PMU OVSSET: Event Counter 0 Overflow Set Position */ +#define PMU_OVSSET_CNT0_STATUS_Msk (1UL /*<< PMU_OVSSET_CNT0_STATUS_Pos*/) /*!< PMU OVSSET: Event Counter 0 Overflow Set Mask */ + +#define PMU_OVSSET_CNT1_STATUS_Pos 1U /*!< PMU OVSSET: Event Counter 1 Overflow Set Position */ +#define PMU_OVSSET_CNT1_STATUS_Msk (1UL << PMU_OVSSET_CNT1_STATUS_Pos) /*!< PMU OVSSET: Event Counter 1 Overflow Set Mask */ + +#define PMU_OVSSET_CNT2_STATUS_Pos 2U /*!< PMU OVSSET: Event Counter 2 Overflow Set Position */ +#define PMU_OVSSET_CNT2_STATUS_Msk (1UL << PMU_OVSSET_CNT2_STATUS_Pos) /*!< PMU OVSSET: Event Counter 2 Overflow Set Mask */ + +#define PMU_OVSSET_CNT3_STATUS_Pos 3U /*!< PMU OVSSET: Event Counter 3 Overflow Set Position */ +#define PMU_OVSSET_CNT3_STATUS_Msk (1UL << PMU_OVSSET_CNT3_STATUS_Pos) /*!< PMU OVSSET: Event Counter 3 Overflow Set Mask */ + +#define PMU_OVSSET_CNT4_STATUS_Pos 4U /*!< PMU OVSSET: Event Counter 4 Overflow Set Position */ +#define PMU_OVSSET_CNT4_STATUS_Msk (1UL << PMU_OVSSET_CNT4_STATUS_Pos) /*!< PMU OVSSET: Event Counter 4 Overflow Set Mask */ + +#define PMU_OVSSET_CNT5_STATUS_Pos 5U /*!< PMU OVSSET: Event Counter 5 Overflow Set Position */ +#define PMU_OVSSET_CNT5_STATUS_Msk (1UL << PMU_OVSSET_CNT5_STATUS_Pos) /*!< PMU OVSSET: Event Counter 5 Overflow Set Mask */ + +#define PMU_OVSSET_CNT6_STATUS_Pos 6U /*!< PMU OVSSET: Event Counter 6 Overflow Set Position */ +#define PMU_OVSSET_CNT6_STATUS_Msk (1UL << PMU_OVSSET_CNT6_STATUS_Pos) /*!< PMU OVSSET: Event Counter 6 Overflow Set Mask */ + +#define PMU_OVSSET_CNT7_STATUS_Pos 7U /*!< PMU OVSSET: Event Counter 7 Overflow Set Position */ +#define PMU_OVSSET_CNT7_STATUS_Msk (1UL << PMU_OVSSET_CNT7_STATUS_Pos) /*!< PMU OVSSET: Event Counter 7 Overflow Set Mask */ + +#define PMU_OVSSET_CNT8_STATUS_Pos 8U /*!< PMU OVSSET: Event Counter 8 Overflow Set Position */ +#define PMU_OVSSET_CNT8_STATUS_Msk (1UL << PMU_OVSSET_CNT8_STATUS_Pos) /*!< PMU OVSSET: Event Counter 8 Overflow Set Mask */ + +#define PMU_OVSSET_CNT9_STATUS_Pos 9U /*!< PMU OVSSET: Event Counter 9 Overflow Set Position */ +#define PMU_OVSSET_CNT9_STATUS_Msk (1UL << PMU_OVSSET_CNT9_STATUS_Pos) /*!< PMU OVSSET: Event Counter 9 Overflow Set Mask */ + +#define PMU_OVSSET_CNT10_STATUS_Pos 10U /*!< PMU OVSSET: Event Counter 10 Overflow Set Position */ +#define PMU_OVSSET_CNT10_STATUS_Msk (1UL << PMU_OVSSET_CNT10_STATUS_Pos) /*!< PMU OVSSET: Event Counter 10 Overflow Set Mask */ + +#define PMU_OVSSET_CNT11_STATUS_Pos 11U /*!< PMU OVSSET: Event Counter 11 Overflow Set Position */ +#define PMU_OVSSET_CNT11_STATUS_Msk (1UL << PMU_OVSSET_CNT11_STATUS_Pos) /*!< PMU OVSSET: Event Counter 11 Overflow Set Mask */ + +#define PMU_OVSSET_CNT12_STATUS_Pos 12U /*!< PMU OVSSET: Event Counter 12 Overflow Set Position */ +#define PMU_OVSSET_CNT12_STATUS_Msk (1UL << PMU_OVSSET_CNT12_STATUS_Pos) /*!< PMU OVSSET: Event Counter 12 Overflow Set Mask */ + +#define PMU_OVSSET_CNT13_STATUS_Pos 13U /*!< PMU OVSSET: Event Counter 13 Overflow Set Position */ +#define PMU_OVSSET_CNT13_STATUS_Msk (1UL << PMU_OVSSET_CNT13_STATUS_Pos) /*!< PMU OVSSET: Event Counter 13 Overflow Set Mask */ + +#define PMU_OVSSET_CNT14_STATUS_Pos 14U /*!< PMU OVSSET: Event Counter 14 Overflow Set Position */ +#define PMU_OVSSET_CNT14_STATUS_Msk (1UL << PMU_OVSSET_CNT14_STATUS_Pos) /*!< PMU OVSSET: Event Counter 14 Overflow Set Mask */ + +#define PMU_OVSSET_CNT15_STATUS_Pos 15U /*!< PMU OVSSET: Event Counter 15 Overflow Set Position */ +#define PMU_OVSSET_CNT15_STATUS_Msk (1UL << PMU_OVSSET_CNT15_STATUS_Pos) /*!< PMU OVSSET: Event Counter 15 Overflow Set Mask */ + +#define PMU_OVSSET_CNT16_STATUS_Pos 16U /*!< PMU OVSSET: Event Counter 16 Overflow Set Position */ +#define PMU_OVSSET_CNT16_STATUS_Msk (1UL << PMU_OVSSET_CNT16_STATUS_Pos) /*!< PMU OVSSET: Event Counter 16 Overflow Set Mask */ + +#define PMU_OVSSET_CNT17_STATUS_Pos 17U /*!< PMU OVSSET: Event Counter 17 Overflow Set Position */ +#define PMU_OVSSET_CNT17_STATUS_Msk (1UL << PMU_OVSSET_CNT17_STATUS_Pos) /*!< PMU OVSSET: Event Counter 17 Overflow Set Mask */ + +#define PMU_OVSSET_CNT18_STATUS_Pos 18U /*!< PMU OVSSET: Event Counter 18 Overflow Set Position */ +#define PMU_OVSSET_CNT18_STATUS_Msk (1UL << PMU_OVSSET_CNT18_STATUS_Pos) /*!< PMU OVSSET: Event Counter 18 Overflow Set Mask */ + +#define PMU_OVSSET_CNT19_STATUS_Pos 19U /*!< PMU OVSSET: Event Counter 19 Overflow Set Position */ +#define PMU_OVSSET_CNT19_STATUS_Msk (1UL << PMU_OVSSET_CNT19_STATUS_Pos) /*!< PMU OVSSET: Event Counter 19 Overflow Set Mask */ + +#define PMU_OVSSET_CNT20_STATUS_Pos 20U /*!< PMU OVSSET: Event Counter 20 Overflow Set Position */ +#define PMU_OVSSET_CNT20_STATUS_Msk (1UL << PMU_OVSSET_CNT20_STATUS_Pos) /*!< PMU OVSSET: Event Counter 20 Overflow Set Mask */ + +#define PMU_OVSSET_CNT21_STATUS_Pos 21U /*!< PMU OVSSET: Event Counter 21 Overflow Set Position */ +#define PMU_OVSSET_CNT21_STATUS_Msk (1UL << PMU_OVSSET_CNT21_STATUS_Pos) /*!< PMU OVSSET: Event Counter 21 Overflow Set Mask */ + +#define PMU_OVSSET_CNT22_STATUS_Pos 22U /*!< PMU OVSSET: Event Counter 22 Overflow Set Position */ +#define PMU_OVSSET_CNT22_STATUS_Msk (1UL << PMU_OVSSET_CNT22_STATUS_Pos) /*!< PMU OVSSET: Event Counter 22 Overflow Set Mask */ + +#define PMU_OVSSET_CNT23_STATUS_Pos 23U /*!< PMU OVSSET: Event Counter 23 Overflow Set Position */ +#define PMU_OVSSET_CNT23_STATUS_Msk (1UL << PMU_OVSSET_CNT23_STATUS_Pos) /*!< PMU OVSSET: Event Counter 23 Overflow Set Mask */ + +#define PMU_OVSSET_CNT24_STATUS_Pos 24U /*!< PMU OVSSET: Event Counter 24 Overflow Set Position */ +#define PMU_OVSSET_CNT24_STATUS_Msk (1UL << PMU_OVSSET_CNT24_STATUS_Pos) /*!< PMU OVSSET: Event Counter 24 Overflow Set Mask */ + +#define PMU_OVSSET_CNT25_STATUS_Pos 25U /*!< PMU OVSSET: Event Counter 25 Overflow Set Position */ +#define PMU_OVSSET_CNT25_STATUS_Msk (1UL << PMU_OVSSET_CNT25_STATUS_Pos) /*!< PMU OVSSET: Event Counter 25 Overflow Set Mask */ + +#define PMU_OVSSET_CNT26_STATUS_Pos 26U /*!< PMU OVSSET: Event Counter 26 Overflow Set Position */ +#define PMU_OVSSET_CNT26_STATUS_Msk (1UL << PMU_OVSSET_CNT26_STATUS_Pos) /*!< PMU OVSSET: Event Counter 26 Overflow Set Mask */ + +#define PMU_OVSSET_CNT27_STATUS_Pos 27U /*!< PMU OVSSET: Event Counter 27 Overflow Set Position */ +#define PMU_OVSSET_CNT27_STATUS_Msk (1UL << PMU_OVSSET_CNT27_STATUS_Pos) /*!< PMU OVSSET: Event Counter 27 Overflow Set Mask */ + +#define PMU_OVSSET_CNT28_STATUS_Pos 28U /*!< PMU OVSSET: Event Counter 28 Overflow Set Position */ +#define PMU_OVSSET_CNT28_STATUS_Msk (1UL << PMU_OVSSET_CNT28_STATUS_Pos) /*!< PMU OVSSET: Event Counter 28 Overflow Set Mask */ + +#define PMU_OVSSET_CNT29_STATUS_Pos 29U /*!< PMU OVSSET: Event Counter 29 Overflow Set Position */ +#define PMU_OVSSET_CNT29_STATUS_Msk (1UL << PMU_OVSSET_CNT29_STATUS_Pos) /*!< PMU OVSSET: Event Counter 29 Overflow Set Mask */ + +#define PMU_OVSSET_CNT30_STATUS_Pos 30U /*!< PMU OVSSET: Event Counter 30 Overflow Set Position */ +#define PMU_OVSSET_CNT30_STATUS_Msk (1UL << PMU_OVSSET_CNT30_STATUS_Pos) /*!< PMU OVSSET: Event Counter 30 Overflow Set Mask */ + +#define PMU_OVSSET_CYCCNT_STATUS_Pos 31U /*!< PMU OVSSET: Cycle Counter Overflow Set Position */ +#define PMU_OVSSET_CYCCNT_STATUS_Msk (1UL << PMU_OVSSET_CYCCNT_STATUS_Pos) /*!< PMU OVSSET: Cycle Counter Overflow Set Mask */ + +/** \brief PMU Overflow Flag Status Clear Register Definitions */ + +#define PMU_OVSCLR_CNT0_STATUS_Pos 0U /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Position */ +#define PMU_OVSCLR_CNT0_STATUS_Msk (1UL /*<< PMU_OVSCLR_CNT0_STATUS_Pos*/) /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT1_STATUS_Pos 1U /*!< PMU OVSCLR: Event Counter 1 Overflow Clear Position */ +#define PMU_OVSCLR_CNT1_STATUS_Msk (1UL << PMU_OVSCLR_CNT1_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 1 Overflow Clear */ + +#define PMU_OVSCLR_CNT2_STATUS_Pos 2U /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Position */ +#define PMU_OVSCLR_CNT2_STATUS_Msk (1UL << PMU_OVSCLR_CNT2_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT3_STATUS_Pos 3U /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Position */ +#define PMU_OVSCLR_CNT3_STATUS_Msk (1UL << PMU_OVSCLR_CNT3_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT4_STATUS_Pos 4U /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Position */ +#define PMU_OVSCLR_CNT4_STATUS_Msk (1UL << PMU_OVSCLR_CNT4_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT5_STATUS_Pos 5U /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Position */ +#define PMU_OVSCLR_CNT5_STATUS_Msk (1UL << PMU_OVSCLR_CNT5_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT6_STATUS_Pos 6U /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Position */ +#define PMU_OVSCLR_CNT6_STATUS_Msk (1UL << PMU_OVSCLR_CNT6_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT7_STATUS_Pos 7U /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Position */ +#define PMU_OVSCLR_CNT7_STATUS_Msk (1UL << PMU_OVSCLR_CNT7_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT8_STATUS_Pos 8U /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Position */ +#define PMU_OVSCLR_CNT8_STATUS_Msk (1UL << PMU_OVSCLR_CNT8_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT9_STATUS_Pos 9U /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Position */ +#define PMU_OVSCLR_CNT9_STATUS_Msk (1UL << PMU_OVSCLR_CNT9_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT10_STATUS_Pos 10U /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Position */ +#define PMU_OVSCLR_CNT10_STATUS_Msk (1UL << PMU_OVSCLR_CNT10_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT11_STATUS_Pos 11U /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Position */ +#define PMU_OVSCLR_CNT11_STATUS_Msk (1UL << PMU_OVSCLR_CNT11_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT12_STATUS_Pos 12U /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Position */ +#define PMU_OVSCLR_CNT12_STATUS_Msk (1UL << PMU_OVSCLR_CNT12_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT13_STATUS_Pos 13U /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Position */ +#define PMU_OVSCLR_CNT13_STATUS_Msk (1UL << PMU_OVSCLR_CNT13_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT14_STATUS_Pos 14U /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Position */ +#define PMU_OVSCLR_CNT14_STATUS_Msk (1UL << PMU_OVSCLR_CNT14_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT15_STATUS_Pos 15U /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Position */ +#define PMU_OVSCLR_CNT15_STATUS_Msk (1UL << PMU_OVSCLR_CNT15_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT16_STATUS_Pos 16U /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Position */ +#define PMU_OVSCLR_CNT16_STATUS_Msk (1UL << PMU_OVSCLR_CNT16_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT17_STATUS_Pos 17U /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Position */ +#define PMU_OVSCLR_CNT17_STATUS_Msk (1UL << PMU_OVSCLR_CNT17_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT18_STATUS_Pos 18U /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Position */ +#define PMU_OVSCLR_CNT18_STATUS_Msk (1UL << PMU_OVSCLR_CNT18_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT19_STATUS_Pos 19U /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Position */ +#define PMU_OVSCLR_CNT19_STATUS_Msk (1UL << PMU_OVSCLR_CNT19_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT20_STATUS_Pos 20U /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Position */ +#define PMU_OVSCLR_CNT20_STATUS_Msk (1UL << PMU_OVSCLR_CNT20_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT21_STATUS_Pos 21U /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Position */ +#define PMU_OVSCLR_CNT21_STATUS_Msk (1UL << PMU_OVSCLR_CNT21_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT22_STATUS_Pos 22U /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Position */ +#define PMU_OVSCLR_CNT22_STATUS_Msk (1UL << PMU_OVSCLR_CNT22_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT23_STATUS_Pos 23U /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Position */ +#define PMU_OVSCLR_CNT23_STATUS_Msk (1UL << PMU_OVSCLR_CNT23_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT24_STATUS_Pos 24U /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Position */ +#define PMU_OVSCLR_CNT24_STATUS_Msk (1UL << PMU_OVSCLR_CNT24_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT25_STATUS_Pos 25U /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Position */ +#define PMU_OVSCLR_CNT25_STATUS_Msk (1UL << PMU_OVSCLR_CNT25_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT26_STATUS_Pos 26U /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Position */ +#define PMU_OVSCLR_CNT26_STATUS_Msk (1UL << PMU_OVSCLR_CNT26_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT27_STATUS_Pos 27U /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Position */ +#define PMU_OVSCLR_CNT27_STATUS_Msk (1UL << PMU_OVSCLR_CNT27_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT28_STATUS_Pos 28U /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Position */ +#define PMU_OVSCLR_CNT28_STATUS_Msk (1UL << PMU_OVSCLR_CNT28_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT29_STATUS_Pos 29U /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Position */ +#define PMU_OVSCLR_CNT29_STATUS_Msk (1UL << PMU_OVSCLR_CNT29_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT30_STATUS_Pos 30U /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Position */ +#define PMU_OVSCLR_CNT30_STATUS_Msk (1UL << PMU_OVSCLR_CNT30_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Mask */ + +#define PMU_OVSCLR_CYCCNT_STATUS_Pos 31U /*!< PMU OVSCLR: Cycle Counter Overflow Clear Position */ +#define PMU_OVSCLR_CYCCNT_STATUS_Msk (1UL << PMU_OVSCLR_CYCCNT_STATUS_Pos) /*!< PMU OVSCLR: Cycle Counter Overflow Clear Mask */ + +/** \brief PMU Software Increment Counter */ + +#define PMU_SWINC_CNT0_Pos 0U /*!< PMU SWINC: Event Counter 0 Software Increment Position */ +#define PMU_SWINC_CNT0_Msk (1UL /*<< PMU_SWINC_CNT0_Pos */) /*!< PMU SWINC: Event Counter 0 Software Increment Mask */ + +#define PMU_SWINC_CNT1_Pos 1U /*!< PMU SWINC: Event Counter 1 Software Increment Position */ +#define PMU_SWINC_CNT1_Msk (1UL << PMU_SWINC_CNT1_Pos) /*!< PMU SWINC: Event Counter 1 Software Increment Mask */ + +#define PMU_SWINC_CNT2_Pos 2U /*!< PMU SWINC: Event Counter 2 Software Increment Position */ +#define PMU_SWINC_CNT2_Msk (1UL << PMU_SWINC_CNT2_Pos) /*!< PMU SWINC: Event Counter 2 Software Increment Mask */ + +#define PMU_SWINC_CNT3_Pos 3U /*!< PMU SWINC: Event Counter 3 Software Increment Position */ +#define PMU_SWINC_CNT3_Msk (1UL << PMU_SWINC_CNT3_Pos) /*!< PMU SWINC: Event Counter 3 Software Increment Mask */ + +#define PMU_SWINC_CNT4_Pos 4U /*!< PMU SWINC: Event Counter 4 Software Increment Position */ +#define PMU_SWINC_CNT4_Msk (1UL << PMU_SWINC_CNT4_Pos) /*!< PMU SWINC: Event Counter 4 Software Increment Mask */ + +#define PMU_SWINC_CNT5_Pos 5U /*!< PMU SWINC: Event Counter 5 Software Increment Position */ +#define PMU_SWINC_CNT5_Msk (1UL << PMU_SWINC_CNT5_Pos) /*!< PMU SWINC: Event Counter 5 Software Increment Mask */ + +#define PMU_SWINC_CNT6_Pos 6U /*!< PMU SWINC: Event Counter 6 Software Increment Position */ +#define PMU_SWINC_CNT6_Msk (1UL << PMU_SWINC_CNT6_Pos) /*!< PMU SWINC: Event Counter 6 Software Increment Mask */ + +#define PMU_SWINC_CNT7_Pos 7U /*!< PMU SWINC: Event Counter 7 Software Increment Position */ +#define PMU_SWINC_CNT7_Msk (1UL << PMU_SWINC_CNT7_Pos) /*!< PMU SWINC: Event Counter 7 Software Increment Mask */ + +#define PMU_SWINC_CNT8_Pos 8U /*!< PMU SWINC: Event Counter 8 Software Increment Position */ +#define PMU_SWINC_CNT8_Msk (1UL << PMU_SWINC_CNT8_Pos) /*!< PMU SWINC: Event Counter 8 Software Increment Mask */ + +#define PMU_SWINC_CNT9_Pos 9U /*!< PMU SWINC: Event Counter 9 Software Increment Position */ +#define PMU_SWINC_CNT9_Msk (1UL << PMU_SWINC_CNT9_Pos) /*!< PMU SWINC: Event Counter 9 Software Increment Mask */ + +#define PMU_SWINC_CNT10_Pos 10U /*!< PMU SWINC: Event Counter 10 Software Increment Position */ +#define PMU_SWINC_CNT10_Msk (1UL << PMU_SWINC_CNT10_Pos) /*!< PMU SWINC: Event Counter 10 Software Increment Mask */ + +#define PMU_SWINC_CNT11_Pos 11U /*!< PMU SWINC: Event Counter 11 Software Increment Position */ +#define PMU_SWINC_CNT11_Msk (1UL << PMU_SWINC_CNT11_Pos) /*!< PMU SWINC: Event Counter 11 Software Increment Mask */ + +#define PMU_SWINC_CNT12_Pos 12U /*!< PMU SWINC: Event Counter 12 Software Increment Position */ +#define PMU_SWINC_CNT12_Msk (1UL << PMU_SWINC_CNT12_Pos) /*!< PMU SWINC: Event Counter 12 Software Increment Mask */ + +#define PMU_SWINC_CNT13_Pos 13U /*!< PMU SWINC: Event Counter 13 Software Increment Position */ +#define PMU_SWINC_CNT13_Msk (1UL << PMU_SWINC_CNT13_Pos) /*!< PMU SWINC: Event Counter 13 Software Increment Mask */ + +#define PMU_SWINC_CNT14_Pos 14U /*!< PMU SWINC: Event Counter 14 Software Increment Position */ +#define PMU_SWINC_CNT14_Msk (1UL << PMU_SWINC_CNT14_Pos) /*!< PMU SWINC: Event Counter 14 Software Increment Mask */ + +#define PMU_SWINC_CNT15_Pos 15U /*!< PMU SWINC: Event Counter 15 Software Increment Position */ +#define PMU_SWINC_CNT15_Msk (1UL << PMU_SWINC_CNT15_Pos) /*!< PMU SWINC: Event Counter 15 Software Increment Mask */ + +#define PMU_SWINC_CNT16_Pos 16U /*!< PMU SWINC: Event Counter 16 Software Increment Position */ +#define PMU_SWINC_CNT16_Msk (1UL << PMU_SWINC_CNT16_Pos) /*!< PMU SWINC: Event Counter 16 Software Increment Mask */ + +#define PMU_SWINC_CNT17_Pos 17U /*!< PMU SWINC: Event Counter 17 Software Increment Position */ +#define PMU_SWINC_CNT17_Msk (1UL << PMU_SWINC_CNT17_Pos) /*!< PMU SWINC: Event Counter 17 Software Increment Mask */ + +#define PMU_SWINC_CNT18_Pos 18U /*!< PMU SWINC: Event Counter 18 Software Increment Position */ +#define PMU_SWINC_CNT18_Msk (1UL << PMU_SWINC_CNT18_Pos) /*!< PMU SWINC: Event Counter 18 Software Increment Mask */ + +#define PMU_SWINC_CNT19_Pos 19U /*!< PMU SWINC: Event Counter 19 Software Increment Position */ +#define PMU_SWINC_CNT19_Msk (1UL << PMU_SWINC_CNT19_Pos) /*!< PMU SWINC: Event Counter 19 Software Increment Mask */ + +#define PMU_SWINC_CNT20_Pos 20U /*!< PMU SWINC: Event Counter 20 Software Increment Position */ +#define PMU_SWINC_CNT20_Msk (1UL << PMU_SWINC_CNT20_Pos) /*!< PMU SWINC: Event Counter 20 Software Increment Mask */ + +#define PMU_SWINC_CNT21_Pos 21U /*!< PMU SWINC: Event Counter 21 Software Increment Position */ +#define PMU_SWINC_CNT21_Msk (1UL << PMU_SWINC_CNT21_Pos) /*!< PMU SWINC: Event Counter 21 Software Increment Mask */ + +#define PMU_SWINC_CNT22_Pos 22U /*!< PMU SWINC: Event Counter 22 Software Increment Position */ +#define PMU_SWINC_CNT22_Msk (1UL << PMU_SWINC_CNT22_Pos) /*!< PMU SWINC: Event Counter 22 Software Increment Mask */ + +#define PMU_SWINC_CNT23_Pos 23U /*!< PMU SWINC: Event Counter 23 Software Increment Position */ +#define PMU_SWINC_CNT23_Msk (1UL << PMU_SWINC_CNT23_Pos) /*!< PMU SWINC: Event Counter 23 Software Increment Mask */ + +#define PMU_SWINC_CNT24_Pos 24U /*!< PMU SWINC: Event Counter 24 Software Increment Position */ +#define PMU_SWINC_CNT24_Msk (1UL << PMU_SWINC_CNT24_Pos) /*!< PMU SWINC: Event Counter 24 Software Increment Mask */ + +#define PMU_SWINC_CNT25_Pos 25U /*!< PMU SWINC: Event Counter 25 Software Increment Position */ +#define PMU_SWINC_CNT25_Msk (1UL << PMU_SWINC_CNT25_Pos) /*!< PMU SWINC: Event Counter 25 Software Increment Mask */ + +#define PMU_SWINC_CNT26_Pos 26U /*!< PMU SWINC: Event Counter 26 Software Increment Position */ +#define PMU_SWINC_CNT26_Msk (1UL << PMU_SWINC_CNT26_Pos) /*!< PMU SWINC: Event Counter 26 Software Increment Mask */ + +#define PMU_SWINC_CNT27_Pos 27U /*!< PMU SWINC: Event Counter 27 Software Increment Position */ +#define PMU_SWINC_CNT27_Msk (1UL << PMU_SWINC_CNT27_Pos) /*!< PMU SWINC: Event Counter 27 Software Increment Mask */ + +#define PMU_SWINC_CNT28_Pos 28U /*!< PMU SWINC: Event Counter 28 Software Increment Position */ +#define PMU_SWINC_CNT28_Msk (1UL << PMU_SWINC_CNT28_Pos) /*!< PMU SWINC: Event Counter 28 Software Increment Mask */ + +#define PMU_SWINC_CNT29_Pos 29U /*!< PMU SWINC: Event Counter 29 Software Increment Position */ +#define PMU_SWINC_CNT29_Msk (1UL << PMU_SWINC_CNT29_Pos) /*!< PMU SWINC: Event Counter 29 Software Increment Mask */ + +#define PMU_SWINC_CNT30_Pos 30U /*!< PMU SWINC: Event Counter 30 Software Increment Position */ +#define PMU_SWINC_CNT30_Msk (1UL << PMU_SWINC_CNT30_Pos) /*!< PMU SWINC: Event Counter 30 Software Increment Mask */ + +/** \brief PMU Control Register Definitions */ + +#define PMU_CTRL_ENABLE_Pos 0U /*!< PMU CTRL: ENABLE Position */ +#define PMU_CTRL_ENABLE_Msk (1UL /*<< PMU_CTRL_ENABLE_Pos*/) /*!< PMU CTRL: ENABLE Mask */ + +#define PMU_CTRL_EVENTCNT_RESET_Pos 1U /*!< PMU CTRL: Event Counter Reset Position */ +#define PMU_CTRL_EVENTCNT_RESET_Msk (1UL << PMU_CTRL_EVENTCNT_RESET_Pos) /*!< PMU CTRL: Event Counter Reset Mask */ + +#define PMU_CTRL_CYCCNT_RESET_Pos 2U /*!< PMU CTRL: Cycle Counter Reset Position */ +#define PMU_CTRL_CYCCNT_RESET_Msk (1UL << PMU_CTRL_CYCCNT_RESET_Pos) /*!< PMU CTRL: Cycle Counter Reset Mask */ + +#define PMU_CTRL_CYCCNT_DISABLE_Pos 5U /*!< PMU CTRL: Disable Cycle Counter Position */ +#define PMU_CTRL_CYCCNT_DISABLE_Msk (1UL << PMU_CTRL_CYCCNT_DISABLE_Pos) /*!< PMU CTRL: Disable Cycle Counter Mask */ + +#define PMU_CTRL_FRZ_ON_OV_Pos 9U /*!< PMU CTRL: Freeze-on-overflow Position */ +#define PMU_CTRL_FRZ_ON_OV_Msk (1UL << PMU_CTRL_FRZ_ON_OVERFLOW_Pos) /*!< PMU CTRL: Freeze-on-overflow Mask */ + +#define PMU_CTRL_TRACE_ON_OV_Pos 11U /*!< PMU CTRL: Trace-on-overflow Position */ +#define PMU_CTRL_TRACE_ON_OV_Msk (1UL << PMU_CTRL_TRACE_ON_OVERFLOW_Pos) /*!< PMU CTRL: Trace-on-overflow Mask */ + +/** \brief PMU Type Register Definitions */ + +#define PMU_TYPE_NUM_CNTS_Pos 0U /*!< PMU TYPE: Number of Counters Position */ +#define PMU_TYPE_NUM_CNTS_Msk (0xFFUL /*<< PMU_TYPE_NUM_CNTS_Pos*/) /*!< PMU TYPE: Number of Counters Mask */ + +#define PMU_TYPE_SIZE_CNTS_Pos 8U /*!< PMU TYPE: Size of Counters Position */ +#define PMU_TYPE_SIZE_CNTS_Msk (0x3FUL << PMU_TYPE_SIZE_CNTS_Pos) /*!< PMU TYPE: Size of Counters Mask */ + +#define PMU_TYPE_CYCCNT_PRESENT_Pos 14U /*!< PMU TYPE: Cycle Counter Present Position */ +#define PMU_TYPE_CYCCNT_PRESENT_Msk (1UL << PMU_TYPE_CYCCNT_PRESENT_Pos) /*!< PMU TYPE: Cycle Counter Present Mask */ + +#define PMU_TYPE_FRZ_OV_SUPPORT_Pos 21U /*!< PMU TYPE: Freeze-on-overflow Support Position */ +#define PMU_TYPE_FRZ_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Freeze-on-overflow Support Mask */ + +#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Pos 23U /*!< PMU TYPE: Trace-on-overflow Support Position */ +#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Trace-on-overflow Support Mask */ + +/** \brief PMU Authentication Status Register Definitions */ + +#define PMU_AUTHSTATUS_NSID_Pos 0U /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Position */ +#define PMU_AUTHSTATUS_NSID_Msk (0x3UL /*<< PMU_AUTHSTATUS_NSID_Pos*/) /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Mask */ + +#define PMU_AUTHSTATUS_NSNID_Pos 2U /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Position */ +#define PMU_AUTHSTATUS_NSNID_Msk (0x3UL << PMU_AUTHSTATUS_NSNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Mask */ + +#define PMU_AUTHSTATUS_SID_Pos 4U /*!< PMU AUTHSTATUS: Secure Invasive Debug Position */ +#define PMU_AUTHSTATUS_SID_Msk (0x3UL << PMU_AUTHSTATUS_SID_Pos) /*!< PMU AUTHSTATUS: Secure Invasive Debug Mask */ + +#define PMU_AUTHSTATUS_SNID_Pos 6U /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Position */ +#define PMU_AUTHSTATUS_SNID_Msk (0x3UL << PMU_AUTHSTATUS_SNID_Pos) /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Mask */ + +#define PMU_AUTHSTATUS_NSUID_Pos 16U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Position */ +#define PMU_AUTHSTATUS_NSUID_Msk (0x3UL << PMU_AUTHSTATUS_NSUID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Mask */ + +#define PMU_AUTHSTATUS_NSUNID_Pos 18U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Position */ +#define PMU_AUTHSTATUS_NSUNID_Msk (0x3UL << PMU_AUTHSTATUS_NSUNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Mask */ + +#define PMU_AUTHSTATUS_SUID_Pos 20U /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Position */ +#define PMU_AUTHSTATUS_SUID_Msk (0x3UL << PMU_AUTHSTATUS_SUID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Mask */ + +#define PMU_AUTHSTATUS_SUNID_Pos 22U /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Position */ +#define PMU_AUTHSTATUS_SUNID_Msk (0x3UL << PMU_AUTHSTATUS_SUNID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Mask */ + +/*@} end of group CMSIS_PMU */ +#endif + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_PXN_Pos 4U /*!< MPU RLAR: PXN Position */ +#define MPU_RLAR_PXN_Msk (1UL << MPU_RLAR_PXN_Pos) /*!< MPU RLAR: PXN Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +#define FPU_FPDSCR_FZ16_Pos 19U /*!< FPDSCR: FZ16 bit Position */ +#define FPU_FPDSCR_FZ16_Msk (1UL << FPU_FPDSCR_FZ16_Pos) /*!< FPDSCR: FZ16 bit Mask */ + +#define FPU_FPDSCR_LTPSIZE_Pos 16U /*!< FPDSCR: LTPSIZE bit Position */ +#define FPU_FPDSCR_LTPSIZE_Msk (7UL << FPU_FPDSCR_LTPSIZE_Pos) /*!< FPDSCR: LTPSIZE bit Mask */ + +/* Media and VFP Feature Register 0 Definitions */ +#define FPU_MVFR0_FPRound_Pos 28U /*!< MVFR0: FPRound bits Position */ +#define FPU_MVFR0_FPRound_Msk (0xFUL << FPU_MVFR0_FPRound_Pos) /*!< MVFR0: FPRound bits Mask */ + +#define FPU_MVFR0_FPSqrt_Pos 20U /*!< MVFR0: FPSqrt bits Position */ +#define FPU_MVFR0_FPSqrt_Msk (0xFUL << FPU_MVFR0_FPSqrt_Pos) /*!< MVFR0: FPSqrt bits Mask */ + +#define FPU_MVFR0_FPDivide_Pos 16U /*!< MVFR0: FPDivide bits Position */ +#define FPU_MVFR0_FPDivide_Msk (0xFUL << FPU_MVFR0_FPDivide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FPDP_Pos 8U /*!< MVFR0: FPDP bits Position */ +#define FPU_MVFR0_FPDP_Msk (0xFUL << FPU_MVFR0_FPDP_Pos) /*!< MVFR0: FPDP bits Mask */ + +#define FPU_MVFR0_FPSP_Pos 4U /*!< MVFR0: FPSP bits Position */ +#define FPU_MVFR0_FPSP_Msk (0xFUL << FPU_MVFR0_FPSP_Pos) /*!< MVFR0: FPSP bits Mask */ + +#define FPU_MVFR0_SIMDReg_Pos 0U /*!< MVFR0: SIMDReg bits Position */ +#define FPU_MVFR0_SIMDReg_Msk (0xFUL /*<< FPU_MVFR0_SIMDReg_Pos*/) /*!< MVFR0: SIMDReg bits Mask */ + +/* Media and VFP Feature Register 1 Definitions */ +#define FPU_MVFR1_FMAC_Pos 28U /*!< MVFR1: FMAC bits Position */ +#define FPU_MVFR1_FMAC_Msk (0xFUL << FPU_MVFR1_FMAC_Pos) /*!< MVFR1: FMAC bits Mask */ + +#define FPU_MVFR1_FPHP_Pos 24U /*!< MVFR1: FPHP bits Position */ +#define FPU_MVFR1_FPHP_Msk (0xFUL << FPU_MVFR1_FPHP_Pos) /*!< MVFR1: FPHP bits Mask */ + +#define FPU_MVFR1_FP16_Pos 20U /*!< MVFR1: FP16 bits Position */ +#define FPU_MVFR1_FP16_Msk (0xFUL << FPU_MVFR1_FP16_Pos) /*!< MVFR1: FP16 bits Mask */ + +#define FPU_MVFR1_MVE_Pos 8U /*!< MVFR1: MVE bits Position */ +#define FPU_MVFR1_MVE_Msk (0xFUL << FPU_MVFR1_MVE_Pos) /*!< MVFR1: MVE bits Mask */ + +#define FPU_MVFR1_FPDNaN_Pos 4U /*!< MVFR1: FPDNaN bits Position */ +#define FPU_MVFR1_FPDNaN_Msk (0xFUL << FPU_MVFR1_FPDNaN_Pos) /*!< MVFR1: FPDNaN bits Mask */ + +#define FPU_MVFR1_FPFtZ_Pos 0U /*!< MVFR1: FPFtZ bits Position */ +#define FPU_MVFR1_FPFtZ_Msk (0xFUL /*<< FPU_MVFR1_FPFtZ_Pos*/) /*!< MVFR1: FPFtZ bits Mask */ + +/* Media and VFP Feature Register 2 Definitions */ +#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ +#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ + +/*@} end of group CMSIS_FPU */ + +/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_FPD_Pos 23U /*!< \deprecated CoreDebug DHCSR: S_FPD Position */ +#define CoreDebug_DHCSR_S_FPD_Msk (1UL << CoreDebug_DHCSR_S_FPD_Pos) /*!< \deprecated CoreDebug DHCSR: S_FPD Mask */ + +#define CoreDebug_DHCSR_S_SUIDE_Pos 22U /*!< \deprecated CoreDebug DHCSR: S_SUIDE Position */ +#define CoreDebug_DHCSR_S_SUIDE_Msk (1UL << CoreDebug_DHCSR_S_SUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SUIDE Mask */ + +#define CoreDebug_DHCSR_S_NSUIDE_Pos 21U /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Position */ +#define CoreDebug_DHCSR_S_NSUIDE_Msk (1UL << CoreDebug_DHCSR_S_NSUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Mask */ + +#define CoreDebug_DHCSR_S_SDE_Pos 20U /*!< \deprecated CoreDebug DHCSR: S_SDE Position */ +#define CoreDebug_DHCSR_S_SDE_Msk (1UL << CoreDebug_DHCSR_S_SDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SDE Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_PMOV_Pos 6U /*!< \deprecated CoreDebug DHCSR: C_PMOV Position */ +#define CoreDebug_DHCSR_C_PMOV_Msk (1UL << CoreDebug_DHCSR_C_PMOV_Pos) /*!< \deprecated CoreDebug DHCSR: C_PMOV Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Set Clear Exception and Monitor Control Register Definitions */ +#define CoreDebug_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Position */ +#define CoreDebug_DSCEMCR_CLR_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Mask */ + +#define CoreDebug_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Position */ +#define CoreDebug_DSCEMCR_CLR_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Mask */ + +#define CoreDebug_DSCEMCR_SET_MON_REQ_Pos 3U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Position */ +#define CoreDebug_DSCEMCR_SET_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Mask */ + +#define CoreDebug_DSCEMCR_SET_MON_PEND_Pos 1U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Position */ +#define CoreDebug_DSCEMCR_SET_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_UIDEN_Pos 10U /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Position */ +#define CoreDebug_DAUTHCTRL_UIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_UIDAPEN_Pos 9U /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Position */ +#define CoreDebug_DAUTHCTRL_UIDAPEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDAPEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Mask */ + +#define CoreDebug_DAUTHCTRL_FSDMA_Pos 8U /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Position */ +#define CoreDebug_DAUTHCTRL_FSDMA_Msk (1UL << CoreDebug_DAUTHCTRL_FSDMA_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DCB Debug Control Block + \brief Type definitions for the Debug Control Block Registers + @{ + */ + +/** + \brief Structure type to access the Debug Control Block Registers (DCB). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} DCB_Type; + +/* DHCSR, Debug Halting Control and Status Register Definitions */ +#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ +#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ + +#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ +#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ + +#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ +#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ + +#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ +#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ + +#define DCB_DHCSR_S_FPD_Pos 23U /*!< DCB DHCSR: Floating-point registers Debuggable Position */ +#define DCB_DHCSR_S_FPD_Msk (0x1UL << DCB_DHCSR_S_FPD_Pos) /*!< DCB DHCSR: Floating-point registers Debuggable Mask */ + +#define DCB_DHCSR_S_SUIDE_Pos 22U /*!< DCB DHCSR: Secure unprivileged halting debug enabled Position */ +#define DCB_DHCSR_S_SUIDE_Msk (0x1UL << DCB_DHCSR_S_SUIDE_Pos) /*!< DCB DHCSR: Secure unprivileged halting debug enabled Mask */ + +#define DCB_DHCSR_S_NSUIDE_Pos 21U /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Position */ +#define DCB_DHCSR_S_NSUIDE_Msk (0x1UL << DCB_DHCSR_S_NSUIDE_Pos) /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Mask */ + +#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ +#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ + +#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ +#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ + +#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ +#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ + +#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ +#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ + +#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ +#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ + +#define DCB_DHCSR_C_PMOV_Pos 6U /*!< DCB DHCSR: Halt on PMU overflow control Position */ +#define DCB_DHCSR_C_PMOV_Msk (0x1UL << DCB_DHCSR_C_PMOV_Pos) /*!< DCB DHCSR: Halt on PMU overflow control Mask */ + +#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ +#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ + +#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ +#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ + +#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ +#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ + +#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ +#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ + +#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ +#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ + +/* DCRSR, Debug Core Register Select Register Definitions */ +#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ +#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ + +#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ +#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ + +/* DCRDR, Debug Core Register Data Register Definitions */ +#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ +#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ + +/* DEMCR, Debug Exception and Monitor Control Register Definitions */ +#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ +#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ + +#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ +#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ + +#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ +#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ + +#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ +#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ + +#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ +#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ + +#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ +#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ + +#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ +#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ + +#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ +#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ + +#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ +#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ + +#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ +#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ + +#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ +#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ + +#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ +#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ + +#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ +#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ + +#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ +#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ + +#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ +#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ + +#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ +#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ + +#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ +#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ + +/* DSCEMCR, Debug Set Clear Exception and Monitor Control Register Definitions */ +#define DCB_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< DCB DSCEMCR: Clear monitor request Position */ +#define DCB_DSCEMCR_CLR_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_REQ_Pos) /*!< DCB DSCEMCR: Clear monitor request Mask */ + +#define DCB_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< DCB DSCEMCR: Clear monitor pend Position */ +#define DCB_DSCEMCR_CLR_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_PEND_Pos) /*!< DCB DSCEMCR: Clear monitor pend Mask */ + +#define DCB_DSCEMCR_SET_MON_REQ_Pos 3U /*!< DCB DSCEMCR: Set monitor request Position */ +#define DCB_DSCEMCR_SET_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_SET_MON_REQ_Pos) /*!< DCB DSCEMCR: Set monitor request Mask */ + +#define DCB_DSCEMCR_SET_MON_PEND_Pos 1U /*!< DCB DSCEMCR: Set monitor pend Position */ +#define DCB_DSCEMCR_SET_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_SET_MON_PEND_Pos) /*!< DCB DSCEMCR: Set monitor pend Mask */ + +/* DAUTHCTRL, Debug Authentication Control Register Definitions */ +#define DCB_DAUTHCTRL_UIDEN_Pos 10U /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Position */ +#define DCB_DAUTHCTRL_UIDEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Mask */ + +#define DCB_DAUTHCTRL_UIDAPEN_Pos 9U /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Position */ +#define DCB_DAUTHCTRL_UIDAPEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDAPEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Mask */ + +#define DCB_DAUTHCTRL_FSDMA_Pos 8U /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Position */ +#define DCB_DAUTHCTRL_FSDMA_Msk (0x1UL << DCB_DAUTHCTRL_FSDMA_Pos) /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Mask */ + +#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ +#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ + +#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ +#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ + +#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ +#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ + +#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ +#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ + +/* DSCSR, Debug Security Control and Status Register Definitions */ +#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ +#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ + +#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ +#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ + +#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ +#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ + +#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ +#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ + +/*@} end of group CMSIS_DCB */ + + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DIB Debug Identification Block + \brief Type definitions for the Debug Identification Block Registers + @{ + */ + +/** + \brief Structure type to access the Debug Identification Block Registers (DIB). + */ +typedef struct +{ + __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ + __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ + __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ + __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ + __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ +} DIB_Type; + +/* DLAR, SCS Software Lock Access Register Definitions */ +#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ +#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ + +/* DLSR, SCS Software Lock Status Register Definitions */ +#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ +#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ + +#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ +#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ + +#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ +#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ + +/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ +#define DIB_DAUTHSTATUS_SUNID_Pos 22U /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Position */ +#define DIB_DAUTHSTATUS_SUNID_Msk (0x3UL << DIB_DAUTHSTATUS_SUNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Mask */ + +#define DIB_DAUTHSTATUS_SUID_Pos 20U /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Position */ +#define DIB_DAUTHSTATUS_SUID_Msk (0x3UL << DIB_DAUTHSTATUS_SUID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Mask */ + +#define DIB_DAUTHSTATUS_NSUNID_Pos 18U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Position */ +#define DIB_DAUTHSTATUS_NSUNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Mask */ + +#define DIB_DAUTHSTATUS_NSUID_Pos 16U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Position */ +#define DIB_DAUTHSTATUS_NSUID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Mask */ + +#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ +#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ +#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ +#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ +#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ + +/* DDEVARCH, SCS Device Architecture Register Definitions */ +#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ +#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ + +#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ +#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ + +#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ +#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ + +#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ +#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ + +#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ +#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ + +/* DDEVTYPE, SCS Device Type Register Definitions */ +#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ +#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ + +#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ +#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ + + +/*@} end of group CMSIS_DIB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ + #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ + #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ + #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ + #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) + #define PMU_BASE (0xE0003000UL) /*!< PMU Base Address */ + #define PMU ((PMU_Type *) PMU_BASE ) /*!< PMU configuration struct */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ + #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ + #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ + #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ + #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_register_aliases Backwards Compatibility Aliases + \brief Register alias definitions for backwards compatibility. + @{ + */ +#define ID_ADR (ID_AFR) /*!< SCB Auxiliary Feature Register */ +/*@} */ + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## PMU functions and events #################################### */ + +#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) + +#include "pmu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + +/* ########################## MVE functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_MveFunctions MVE Functions + \brief Function that provides MVE type. + @{ + */ + +/** + \brief get MVE type + \details returns the MVE type + \returns + - \b 0: No Vector Extension (MVE) + - \b 1: Integer Vector Extension (MVE-I) + - \b 2: Floating-point Vector Extension (MVE-F) + */ +__STATIC_INLINE uint32_t SCB_GetMVEType(void) +{ + const uint32_t mvfr1 = FPU->MVFR1; + if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x2U << FPU_MVFR1_MVE_Pos)) + { + return 2U; + } + else if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x1U << FPU_MVFR1_MVE_Pos)) + { + return 1U; + } + else + { + return 0U; + } +} + + +/*@} end of CMSIS_Core_MveFunctions */ + + +/* ########################## Cache functions #################################### */ + +#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ + (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) +#include "cachel1_armv7.h" +#endif + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## Debug Control function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_DCBFunctions Debug Control Functions + \brief Functions that access the Debug Control Block. + @{ + */ + + +/** + \brief Set Debug Authentication Control Register + \details writes to Debug Authentication Control register. + \param [in] value value to be writen. + */ +__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) +{ + __DSB(); + __ISB(); + DCB->DAUTHCTRL = value; + __DSB(); + __ISB(); +} + + +/** + \brief Get Debug Authentication Control Register + \details Reads Debug Authentication Control register. + \return Debug Authentication Control Register. + */ +__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) +{ + return (DCB->DAUTHCTRL); +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Debug Authentication Control Register (non-secure) + \details writes to non-secure Debug Authentication Control register when in secure state. + \param [in] value value to be writen + */ +__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) +{ + __DSB(); + __ISB(); + DCB_NS->DAUTHCTRL = value; + __DSB(); + __ISB(); +} + + +/** + \brief Get Debug Authentication Control Register (non-secure) + \details Reads non-secure Debug Authentication Control register when in secure state. + \return Debug Authentication Control Register. + */ +__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) +{ + return (DCB_NS->DAUTHCTRL); +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_DCBFunctions */ + + + + +/* ################################## Debug Identification function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions + \brief Functions that access the Debug Identification Block. + @{ + */ + + +/** + \brief Get Debug Authentication Status Register + \details Reads Debug Authentication Status register. + \return Debug Authentication Status Register. + */ +__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) +{ + return (DIB->DAUTHSTATUS); +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Debug Authentication Status Register (non-secure) + \details Reads non-secure Debug Authentication Status register when in secure state. + \return Debug Authentication Status Register. + */ +__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) +{ + return (DIB_NS->DAUTHSTATUS); +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_DCBFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV81MML_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Include/core_armv8mbl.h b/Drivers/CMSIS/Include/core_armv8mbl.h new file mode 100644 index 0000000..932d3d1 --- /dev/null +++ b/Drivers/CMSIS/Include/core_armv8mbl.h @@ -0,0 +1,2222 @@ +/**************************************************************************//** + * @file core_armv8mbl.h + * @brief CMSIS Armv8-M Baseline Core Peripheral Access Layer Header File + * @version V5.1.0 + * @date 27. March 2020 + ******************************************************************************/ +/* + * Copyright (c) 2009-2020 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#elif defined ( __GNUC__ ) + #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ +#endif + +#ifndef __CORE_ARMV8MBL_H_GENERIC +#define __CORE_ARMV8MBL_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_ARMv8MBL + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS definitions */ +#define __ARMv8MBL_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __ARMv8MBL_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __ARMv8MBL_CMSIS_VERSION ((__ARMv8MBL_CMSIS_VERSION_MAIN << 16U) | \ + __ARMv8MBL_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (2U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MBL_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_ARMV8MBL_H_DEPENDANT +#define __CORE_ARMV8MBL_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __ARMv8MBL_REV + #define __ARMv8MBL_REV 0x0000U + #warning "__ARMv8MBL_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif + + #ifndef __ETM_PRESENT + #define __ETM_PRESENT 0U + #warning "__ETM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MTB_PRESENT + #define __MTB_PRESENT 0U + #warning "__MTB_PRESENT not defined in device header file; using default!" + #endif + +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group ARMv8MBL */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHPR[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + uint32_t RESERVED0[6U]; + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[809U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ + uint32_t RESERVED4[4U]; + __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ +#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI Periodic Synchronization Control Register Definitions */ +#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ +#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ + +/* TPI Software Lock Status Register Definitions */ +#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ +#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ + +#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ +#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ + +#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ +#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + uint32_t RESERVED0[7U]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 1U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#endif +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED0[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: DWTENA Position */ +#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< \deprecated CoreDebug DEMCR: DWTENA Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DCB Debug Control Block + \brief Type definitions for the Debug Control Block Registers + @{ + */ + +/** + \brief Structure type to access the Debug Control Block Registers (DCB). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED0[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} DCB_Type; + +/* DHCSR, Debug Halting Control and Status Register Definitions */ +#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ +#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ + +#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ +#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ + +#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ +#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ + +#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ +#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ + +#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ +#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ + +#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ +#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ + +#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ +#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ + +#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ +#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ + +#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ +#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ + +#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ +#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ + +#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ +#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ + +#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ +#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ + +#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ +#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ + +/* DCRSR, Debug Core Register Select Register Definitions */ +#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ +#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ + +#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ +#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ + +/* DCRDR, Debug Core Register Data Register Definitions */ +#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ +#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ + +/* DEMCR, Debug Exception and Monitor Control Register Definitions */ +#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ +#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ + +#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ +#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ + +#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ +#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ + +/* DAUTHCTRL, Debug Authentication Control Register Definitions */ +#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ +#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ + +#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ +#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ + +#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ +#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ + +#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ +#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ + +/* DSCSR, Debug Security Control and Status Register Definitions */ +#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ +#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ + +#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ +#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ + +#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ +#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ + +#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ +#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ + +/*@} end of group CMSIS_DCB */ + + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DIB Debug Identification Block + \brief Type definitions for the Debug Identification Block Registers + @{ + */ + +/** + \brief Structure type to access the Debug Identification Block Registers (DIB). + */ +typedef struct +{ + __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ + __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ + __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ + __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ + __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ +} DIB_Type; + +/* DLAR, SCS Software Lock Access Register Definitions */ +#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ +#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ + +/* DLSR, SCS Software Lock Status Register Definitions */ +#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ +#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ + +#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ +#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ + +#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ +#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ + +/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ +#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ +#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ +#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ +#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ +#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ + +/* DDEVARCH, SCS Device Architecture Register Definitions */ +#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ +#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ + +#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ +#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ + +#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ +#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ + +#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ +#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ + +#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ +#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ + +/* DDEVTYPE, SCS Device Type Register Definitions */ +#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ +#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ + +#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ +#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ + + +/*@} end of group CMSIS_DIB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ + #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ + #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ + #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ + #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ + #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ + #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ + #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ + #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## Debug Control function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_DCBFunctions Debug Control Functions + \brief Functions that access the Debug Control Block. + @{ + */ + + +/** + \brief Set Debug Authentication Control Register + \details writes to Debug Authentication Control register. + \param [in] value value to be writen. + */ +__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) +{ + __DSB(); + __ISB(); + DCB->DAUTHCTRL = value; + __DSB(); + __ISB(); +} + + +/** + \brief Get Debug Authentication Control Register + \details Reads Debug Authentication Control register. + \return Debug Authentication Control Register. + */ +__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) +{ + return (DCB->DAUTHCTRL); +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Debug Authentication Control Register (non-secure) + \details writes to non-secure Debug Authentication Control register when in secure state. + \param [in] value value to be writen + */ +__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) +{ + __DSB(); + __ISB(); + DCB_NS->DAUTHCTRL = value; + __DSB(); + __ISB(); +} + + +/** + \brief Get Debug Authentication Control Register (non-secure) + \details Reads non-secure Debug Authentication Control register when in secure state. + \return Debug Authentication Control Register. + */ +__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) +{ + return (DCB_NS->DAUTHCTRL); +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_DCBFunctions */ + + + + +/* ################################## Debug Identification function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions + \brief Functions that access the Debug Identification Block. + @{ + */ + + +/** + \brief Get Debug Authentication Status Register + \details Reads Debug Authentication Status register. + \return Debug Authentication Status Register. + */ +__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) +{ + return (DIB->DAUTHSTATUS); +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Debug Authentication Status Register (non-secure) + \details Reads non-secure Debug Authentication Status register when in secure state. + \return Debug Authentication Status Register. + */ +__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) +{ + return (DIB_NS->DAUTHSTATUS); +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_DCBFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MBL_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Include/core_armv8mml.h b/Drivers/CMSIS/Include/core_armv8mml.h new file mode 100644 index 0000000..c119fbf --- /dev/null +++ b/Drivers/CMSIS/Include/core_armv8mml.h @@ -0,0 +1,3209 @@ +/**************************************************************************//** + * @file core_armv8mml.h + * @brief CMSIS Armv8-M Mainline Core Peripheral Access Layer Header File + * @version V5.2.3 + * @date 13. October 2021 + ******************************************************************************/ +/* + * Copyright (c) 2009-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#elif defined ( __GNUC__ ) + #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ +#endif + +#ifndef __CORE_ARMV8MML_H_GENERIC +#define __CORE_ARMV8MML_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_ARMv8MML + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS Armv8MML definitions */ +#define __ARMv8MML_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __ARMv8MML_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __ARMv8MML_CMSIS_VERSION ((__ARMv8MML_CMSIS_VERSION_MAIN << 16U) | \ + __ARMv8MML_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (80U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MML_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_ARMV8MML_H_DEPENDANT +#define __CORE_ARMV8MML_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __ARMv8MML_REV + #define __ARMv8MML_REV 0x0000U + #warning "__ARMv8MML_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 1U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group ARMv8MML */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED7[21U]; + __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ + uint32_t RESERVED3[69U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[32U]; + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ +#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ + +#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[809U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ + uint32_t RESERVED4[4U]; + __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ +#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI Periodic Synchronization Control Register Definitions */ +#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ +#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ + +/* TPI Software Lock Status Register Definitions */ +#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ +#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ + +#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ +#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ + +#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ +#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and VFP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and VFP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/* Media and VFP Feature Register 2 Definitions */ +#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ +#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ + +/*@} end of group CMSIS_FPU */ + +/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED0[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DCB Debug Control Block + \brief Type definitions for the Debug Control Block Registers + @{ + */ + +/** + \brief Structure type to access the Debug Control Block Registers (DCB). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED0[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} DCB_Type; + +/* DHCSR, Debug Halting Control and Status Register Definitions */ +#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ +#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ + +#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ +#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ + +#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ +#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ + +#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ +#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ + +#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ +#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ + +#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ +#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ + +#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ +#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ + +#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ +#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ + +#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ +#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ + +#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ +#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ + +#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ +#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ + +#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ +#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ + +#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ +#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ + +#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ +#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ + +/* DCRSR, Debug Core Register Select Register Definitions */ +#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ +#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ + +#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ +#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ + +/* DCRDR, Debug Core Register Data Register Definitions */ +#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ +#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ + +/* DEMCR, Debug Exception and Monitor Control Register Definitions */ +#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ +#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ + +#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ +#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ + +#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ +#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ + +#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ +#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ + +#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ +#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ + +#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ +#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ + +#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ +#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ + +#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ +#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ + +#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ +#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ + +#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ +#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ + +#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ +#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ + +#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ +#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ + +#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ +#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ + +#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ +#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ + +#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ +#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ + +#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ +#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ + +#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ +#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ + +/* DAUTHCTRL, Debug Authentication Control Register Definitions */ +#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ +#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ + +#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ +#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ + +#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ +#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ + +#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ +#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ + +/* DSCSR, Debug Security Control and Status Register Definitions */ +#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ +#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ + +#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ +#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ + +#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ +#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ + +#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ +#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ + +/*@} end of group CMSIS_DCB */ + + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DIB Debug Identification Block + \brief Type definitions for the Debug Identification Block Registers + @{ + */ + +/** + \brief Structure type to access the Debug Identification Block Registers (DIB). + */ +typedef struct +{ + __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ + __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ + __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ + __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ + __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ +} DIB_Type; + +/* DLAR, SCS Software Lock Access Register Definitions */ +#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ +#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ + +/* DLSR, SCS Software Lock Status Register Definitions */ +#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ +#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ + +#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ +#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ + +#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ +#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ + +/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ +#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ +#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ +#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ +#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ +#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ + +/* DDEVARCH, SCS Device Architecture Register Definitions */ +#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ +#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ + +#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ +#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ + +#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ +#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ + +#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ +#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ + +#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ +#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ + +/* DDEVTYPE, SCS Device Type Register Definitions */ +#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ +#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ + +#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ +#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ + + +/*@} end of group CMSIS_DIB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ + #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ + #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ + #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ + #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ + #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ + #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ + #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ + #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_register_aliases Backwards Compatibility Aliases + \brief Register alias definitions for backwards compatibility. + @{ + */ +#define ID_ADR (ID_AFR) /*!< SCB Auxiliary Feature Register */ +/*@} */ + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + +/* ########################## Cache functions #################################### */ + +#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ + (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) +#include "cachel1_armv7.h" +#endif + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## Debug Control function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_DCBFunctions Debug Control Functions + \brief Functions that access the Debug Control Block. + @{ + */ + + +/** + \brief Set Debug Authentication Control Register + \details writes to Debug Authentication Control register. + \param [in] value value to be writen. + */ +__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) +{ + __DSB(); + __ISB(); + DCB->DAUTHCTRL = value; + __DSB(); + __ISB(); +} + + +/** + \brief Get Debug Authentication Control Register + \details Reads Debug Authentication Control register. + \return Debug Authentication Control Register. + */ +__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) +{ + return (DCB->DAUTHCTRL); +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Debug Authentication Control Register (non-secure) + \details writes to non-secure Debug Authentication Control register when in secure state. + \param [in] value value to be writen + */ +__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) +{ + __DSB(); + __ISB(); + DCB_NS->DAUTHCTRL = value; + __DSB(); + __ISB(); +} + + +/** + \brief Get Debug Authentication Control Register (non-secure) + \details Reads non-secure Debug Authentication Control register when in secure state. + \return Debug Authentication Control Register. + */ +__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) +{ + return (DCB_NS->DAUTHCTRL); +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_DCBFunctions */ + + + + +/* ################################## Debug Identification function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions + \brief Functions that access the Debug Identification Block. + @{ + */ + + +/** + \brief Get Debug Authentication Status Register + \details Reads Debug Authentication Status register. + \return Debug Authentication Status Register. + */ +__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) +{ + return (DIB->DAUTHSTATUS); +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Debug Authentication Status Register (non-secure) + \details Reads non-secure Debug Authentication Status register when in secure state. + \return Debug Authentication Status Register. + */ +__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) +{ + return (DIB_NS->DAUTHSTATUS); +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_DCBFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MML_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Include/core_cm0.h b/Drivers/CMSIS/Include/core_cm0.h new file mode 100644 index 0000000..6441ff3 --- /dev/null +++ b/Drivers/CMSIS/Include/core_cm0.h @@ -0,0 +1,952 @@ +/**************************************************************************//** + * @file core_cm0.h + * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File + * @version V5.0.8 + * @date 21. August 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM0_H_GENERIC +#define __CORE_CM0_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M0 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM0 definitions */ +#define __CM0_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM0_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16U) | \ + __CM0_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (0U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM0_H_DEPENDANT +#define __CORE_CM0_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM0_REV + #define __CM0_REV 0x0000U + #warning "__CM0_REV not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M0 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t _reserved0:1; /*!< bit: 0 Reserved */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RESERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + uint32_t RESERVED0; + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M0 header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0 */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + Address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)(NVIC_USER_IRQ_OFFSET << 2); /* point to 1st user interrupt */ + *(vectors + (int32_t)IRQn) = vector; /* use pointer arithmetic to access vector */ + /* ARM Application Note 321 states that the M0 does not require the architectural barrier */ +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)(NVIC_USER_IRQ_OFFSET << 2); /* point to 1st user interrupt */ + return *(vectors + (int32_t)IRQn); /* use pointer arithmetic to access vector */ +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Include/core_cm0plus.h b/Drivers/CMSIS/Include/core_cm0plus.h new file mode 100644 index 0000000..4e7179a --- /dev/null +++ b/Drivers/CMSIS/Include/core_cm0plus.h @@ -0,0 +1,1087 @@ +/**************************************************************************//** + * @file core_cm0plus.h + * @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File + * @version V5.0.9 + * @date 21. August 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM0PLUS_H_GENERIC +#define __CORE_CM0PLUS_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex-M0+ + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM0+ definitions */ +#define __CM0PLUS_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM0PLUS_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16U) | \ + __CM0PLUS_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (0U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0PLUS_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM0PLUS_H_DEPENDANT +#define __CORE_CM0PLUS_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM0PLUS_REV + #define __CM0PLUS_REV 0x0000U + #warning "__CM0PLUS_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex-M0+ */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RESERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Interrupt Control State Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 8U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 1U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M0+ Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M0+ header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0+ */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +#else + uint32_t *vectors = (uint32_t *)(NVIC_USER_IRQ_OFFSET << 2); /* point to 1st user interrupt */ + *(vectors + (int32_t)IRQn) = vector; /* use pointer arithmetic to access vector */ +#endif + /* ARM Application Note 321 states that the M0+ does not require the architectural barrier */ +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +#else + uint32_t *vectors = (uint32_t *)(NVIC_USER_IRQ_OFFSET << 2); /* point to 1st user interrupt */ + return *(vectors + (int32_t)IRQn); /* use pointer arithmetic to access vector */ +#endif +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0PLUS_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Include/core_cm1.h b/Drivers/CMSIS/Include/core_cm1.h new file mode 100644 index 0000000..76b4569 --- /dev/null +++ b/Drivers/CMSIS/Include/core_cm1.h @@ -0,0 +1,979 @@ +/**************************************************************************//** + * @file core_cm1.h + * @brief CMSIS Cortex-M1 Core Peripheral Access Layer Header File + * @version V1.0.1 + * @date 12. November 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM1_H_GENERIC +#define __CORE_CM1_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M1 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM1 definitions */ +#define __CM1_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM1_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM1_CMSIS_VERSION ((__CM1_CMSIS_VERSION_MAIN << 16U) | \ + __CM1_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (1U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM1_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM1_H_DEPENDANT +#define __CORE_CM1_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM1_REV + #define __CM1_REV 0x0100U + #warning "__CM1_REV not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M1 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t _reserved0:1; /*!< bit: 0 Reserved */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + uint32_t RESERVED0; + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_ITCMUAEN_Pos 4U /*!< ACTLR: Instruction TCM Upper Alias Enable Position */ +#define SCnSCB_ACTLR_ITCMUAEN_Msk (1UL << SCnSCB_ACTLR_ITCMUAEN_Pos) /*!< ACTLR: Instruction TCM Upper Alias Enable Mask */ + +#define SCnSCB_ACTLR_ITCMLAEN_Pos 3U /*!< ACTLR: Instruction TCM Lower Alias Enable Position */ +#define SCnSCB_ACTLR_ITCMLAEN_Msk (1UL << SCnSCB_ACTLR_ITCMLAEN_Pos) /*!< ACTLR: Instruction TCM Lower Alias Enable Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M1 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M1 header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M1 */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + Address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)0x0U; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + /* ARM Application Note 321 states that the M1 does not require the architectural barrier */ +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)0x0U; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM1_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Include/core_cm23.h b/Drivers/CMSIS/Include/core_cm23.h new file mode 100644 index 0000000..55fff99 --- /dev/null +++ b/Drivers/CMSIS/Include/core_cm23.h @@ -0,0 +1,2297 @@ +/**************************************************************************//** + * @file core_cm23.h + * @brief CMSIS Cortex-M23 Core Peripheral Access Layer Header File + * @version V5.1.0 + * @date 11. February 2020 + ******************************************************************************/ +/* + * Copyright (c) 2009-2020 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#elif defined ( __GNUC__ ) + #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ +#endif + +#ifndef __CORE_CM23_H_GENERIC +#define __CORE_CM23_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M23 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS definitions */ +#define __CM23_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM23_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM23_CMSIS_VERSION ((__CM23_CMSIS_VERSION_MAIN << 16U) | \ + __CM23_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (23U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM23_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM23_H_DEPENDANT +#define __CORE_CM23_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM23_REV + #define __CM23_REV 0x0000U + #warning "__CM23_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif + + #ifndef __ETM_PRESENT + #define __ETM_PRESENT 0U + #warning "__ETM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MTB_PRESENT + #define __MTB_PRESENT 0U + #warning "__MTB_PRESENT not defined in device header file; using default!" + #endif + +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M23 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHPR[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + uint32_t RESERVED0[6U]; + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ + __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ + __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration Test FIFO Test Data 0 Register Definitions */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ +#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ +#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ +#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ + +/* TPI Integration Test ATB Control Register 2 Register Definitions */ +#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ +#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ + +#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ +#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ + +#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ +#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ + +#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ +#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ + +/* TPI Integration Test FIFO Test Data 1 Register Definitions */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ +#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ +#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ +#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ + +/* TPI Integration Test ATB Control Register 0 Definitions */ +#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ +#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ + +#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ +#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ + +#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ +#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ + +#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ +#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + uint32_t RESERVED0[7U]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 1U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#endif +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED0[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register */ +#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: DWTENA Position */ +#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< \deprecated CoreDebug DEMCR: DWTENA Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DCB Debug Control Block + \brief Type definitions for the Debug Control Block Registers + @{ + */ + +/** + \brief Structure type to access the Debug Control Block Registers (DCB). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED0[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} DCB_Type; + +/* DHCSR, Debug Halting Control and Status Register Definitions */ +#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ +#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ + +#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ +#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ + +#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ +#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ + +#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ +#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ + +#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ +#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ + +#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ +#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ + +#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ +#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ + +#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ +#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ + +#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ +#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ + +#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ +#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ + +#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ +#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ + +#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ +#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ + +#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ +#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ + +/* DCRSR, Debug Core Register Select Register Definitions */ +#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ +#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ + +#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ +#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ + +/* DCRDR, Debug Core Register Data Register Definitions */ +#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ +#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ + +/* DEMCR, Debug Exception and Monitor Control Register Definitions */ +#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ +#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ + +#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ +#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ + +#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ +#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ + +/* DAUTHCTRL, Debug Authentication Control Register Definitions */ +#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ +#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ + +#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ +#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ + +#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ +#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ + +#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ +#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ + +/* DSCSR, Debug Security Control and Status Register Definitions */ +#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ +#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ + +#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ +#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ + +#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ +#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ + +#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ +#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ + +/*@} end of group CMSIS_DCB */ + + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DIB Debug Identification Block + \brief Type definitions for the Debug Identification Block Registers + @{ + */ + +/** + \brief Structure type to access the Debug Identification Block Registers (DIB). + */ +typedef struct +{ + __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ + __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ + __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ + __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ + __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ +} DIB_Type; + +/* DLAR, SCS Software Lock Access Register Definitions */ +#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ +#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ + +/* DLSR, SCS Software Lock Status Register Definitions */ +#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ +#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ + +#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ +#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ + +#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ +#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ + +/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ +#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ +#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ +#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ +#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ +#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ + +/* DDEVARCH, SCS Device Architecture Register Definitions */ +#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ +#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ + +#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ +#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ + +#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ +#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ + +#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ +#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ + +#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ +#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ + +/* DDEVTYPE, SCS Device Type Register Definitions */ +#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ +#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ + +#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ +#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ + + +/*@} end of group CMSIS_DIB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ + #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ + #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ + #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ + #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ + #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ + #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ + #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ + #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else +/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for Cortex-M23 */ +/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for Cortex-M23 */ + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## Debug Control function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_DCBFunctions Debug Control Functions + \brief Functions that access the Debug Control Block. + @{ + */ + + +/** + \brief Set Debug Authentication Control Register + \details writes to Debug Authentication Control register. + \param [in] value value to be writen. + */ +__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) +{ + __DSB(); + __ISB(); + DCB->DAUTHCTRL = value; + __DSB(); + __ISB(); +} + + +/** + \brief Get Debug Authentication Control Register + \details Reads Debug Authentication Control register. + \return Debug Authentication Control Register. + */ +__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) +{ + return (DCB->DAUTHCTRL); +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Debug Authentication Control Register (non-secure) + \details writes to non-secure Debug Authentication Control register when in secure state. + \param [in] value value to be writen + */ +__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) +{ + __DSB(); + __ISB(); + DCB_NS->DAUTHCTRL = value; + __DSB(); + __ISB(); +} + + +/** + \brief Get Debug Authentication Control Register (non-secure) + \details Reads non-secure Debug Authentication Control register when in secure state. + \return Debug Authentication Control Register. + */ +__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) +{ + return (DCB_NS->DAUTHCTRL); +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_DCBFunctions */ + + + + +/* ################################## Debug Identification function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions + \brief Functions that access the Debug Identification Block. + @{ + */ + + +/** + \brief Get Debug Authentication Status Register + \details Reads Debug Authentication Status register. + \return Debug Authentication Status Register. + */ +__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) +{ + return (DIB->DAUTHSTATUS); +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Debug Authentication Status Register (non-secure) + \details Reads non-secure Debug Authentication Status register when in secure state. + \return Debug Authentication Status Register. + */ +__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) +{ + return (DIB_NS->DAUTHSTATUS); +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_DCBFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM23_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Include/core_cm3.h b/Drivers/CMSIS/Include/core_cm3.h new file mode 100644 index 0000000..74fb87e --- /dev/null +++ b/Drivers/CMSIS/Include/core_cm3.h @@ -0,0 +1,1943 @@ +/**************************************************************************//** + * @file core_cm3.h + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File + * @version V5.1.2 + * @date 04. June 2021 + ******************************************************************************/ +/* + * Copyright (c) 2009-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM3_H_GENERIC +#define __CORE_CM3_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M3 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM3 definitions */ +#define __CM3_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM3_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16U) | \ + __CM3_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (3U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM3_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM3_H_DEPENDANT +#define __CORE_CM3_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM3_REV + #define __CM3_REV 0x0200U + #warning "__CM3_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 1U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M3 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RESERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#if defined (__CM3_REV) && (__CM3_REV < 0x0201U) /* core r2p1 */ +#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ +#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ + +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#else +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ +#if defined (__CM3_REV) && (__CM3_REV >= 0x200U) + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +#else + uint32_t RESERVED1[1U]; +#endif +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#if defined (__CM3_REV) && (__CM3_REV >= 0x200U) +#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */ +#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ + +#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */ +#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ +#endif + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[32U]; + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ +#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ + +#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ +#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ +#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ + +#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ +#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + /* ARM Application Note 321 states that the M3 does not require the architectural barrier */ +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM3_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Include/core_cm33.h b/Drivers/CMSIS/Include/core_cm33.h new file mode 100644 index 0000000..18a2e6f --- /dev/null +++ b/Drivers/CMSIS/Include/core_cm33.h @@ -0,0 +1,3277 @@ +/**************************************************************************//** + * @file core_cm33.h + * @brief CMSIS Cortex-M33 Core Peripheral Access Layer Header File + * @version V5.2.3 + * @date 13. October 2021 + ******************************************************************************/ +/* + * Copyright (c) 2009-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#elif defined ( __GNUC__ ) + #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ +#endif + +#ifndef __CORE_CM33_H_GENERIC +#define __CORE_CM33_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M33 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM33 definitions */ +#define __CM33_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM33_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM33_CMSIS_VERSION ((__CM33_CMSIS_VERSION_MAIN << 16U) | \ + __CM33_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (33U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined (__TARGET_FPU_VFP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined (__ARM_FP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined (__ARMVFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined (__TI_VFP_SUPPORT__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined (__FPU_VFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM33_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM33_H_DEPENDANT +#define __CORE_CM33_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM33_REV + #define __CM33_REV 0x0000U + #warning "__CM33_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 1U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M33 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED7[21U]; + __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ + uint32_t RESERVED3[69U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[32U]; + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ +#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ + +#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ + __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ + __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration Test FIFO Test Data 0 Register Definitions */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ +#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ +#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ +#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ + +/* TPI Integration Test ATB Control Register 2 Register Definitions */ +#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ +#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ + +#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ +#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ + +#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ +#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ + +#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ +#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ + +/* TPI Integration Test FIFO Test Data 1 Register Definitions */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ +#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ +#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ +#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ + +/* TPI Integration Test ATB Control Register 0 Definitions */ +#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ +#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ + +#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ +#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ + +#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ +#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ + +#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ +#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and VFP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and VFP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/* Media and VFP Feature Register 2 Definitions */ +#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ +#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ + +/*@} end of group CMSIS_FPU */ + +/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED0[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DCB Debug Control Block + \brief Type definitions for the Debug Control Block Registers + @{ + */ + +/** + \brief Structure type to access the Debug Control Block Registers (DCB). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED0[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} DCB_Type; + +/* DHCSR, Debug Halting Control and Status Register Definitions */ +#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ +#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ + +#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ +#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ + +#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ +#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ + +#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ +#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ + +#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ +#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ + +#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ +#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ + +#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ +#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ + +#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ +#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ + +#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ +#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ + +#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ +#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ + +#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ +#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ + +#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ +#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ + +#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ +#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ + +#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ +#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ + +/* DCRSR, Debug Core Register Select Register Definitions */ +#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ +#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ + +#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ +#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ + +/* DCRDR, Debug Core Register Data Register Definitions */ +#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ +#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ + +/* DEMCR, Debug Exception and Monitor Control Register Definitions */ +#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ +#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ + +#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ +#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ + +#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ +#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ + +#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ +#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ + +#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ +#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ + +#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ +#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ + +#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ +#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ + +#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ +#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ + +#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ +#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ + +#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ +#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ + +#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ +#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ + +#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ +#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ + +#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ +#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ + +#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ +#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ + +#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ +#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ + +#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ +#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ + +#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ +#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ + +/* DAUTHCTRL, Debug Authentication Control Register Definitions */ +#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ +#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ + +#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ +#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ + +#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ +#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ + +#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ +#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ + +/* DSCSR, Debug Security Control and Status Register Definitions */ +#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ +#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ + +#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ +#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ + +#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ +#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ + +#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ +#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ + +/*@} end of group CMSIS_DCB */ + + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DIB Debug Identification Block + \brief Type definitions for the Debug Identification Block Registers + @{ + */ + +/** + \brief Structure type to access the Debug Identification Block Registers (DIB). + */ +typedef struct +{ + __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ + __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ + __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ + __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ + __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ +} DIB_Type; + +/* DLAR, SCS Software Lock Access Register Definitions */ +#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ +#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ + +/* DLSR, SCS Software Lock Status Register Definitions */ +#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ +#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ + +#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ +#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ + +#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ +#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ + +/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ +#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ +#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ +#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ +#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ +#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ + +/* DDEVARCH, SCS Device Architecture Register Definitions */ +#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ +#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ + +#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ +#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ + +#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ +#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ + +#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ +#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ + +#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ +#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ + +/* DDEVTYPE, SCS Device Type Register Definitions */ +#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ +#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ + +#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ +#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ + + +/*@} end of group CMSIS_DIB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ + #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ + #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ + #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ + #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ + #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ + #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ + #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ + #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_register_aliases Backwards Compatibility Aliases + \brief Register alias definitions for backwards compatibility. + @{ + */ +#define ID_ADR (ID_AFR) /*!< SCB Auxiliary Feature Register */ +/*@} */ + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## Debug Control function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_DCBFunctions Debug Control Functions + \brief Functions that access the Debug Control Block. + @{ + */ + + +/** + \brief Set Debug Authentication Control Register + \details writes to Debug Authentication Control register. + \param [in] value value to be writen. + */ +__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) +{ + __DSB(); + __ISB(); + DCB->DAUTHCTRL = value; + __DSB(); + __ISB(); +} + + +/** + \brief Get Debug Authentication Control Register + \details Reads Debug Authentication Control register. + \return Debug Authentication Control Register. + */ +__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) +{ + return (DCB->DAUTHCTRL); +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Debug Authentication Control Register (non-secure) + \details writes to non-secure Debug Authentication Control register when in secure state. + \param [in] value value to be writen + */ +__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) +{ + __DSB(); + __ISB(); + DCB_NS->DAUTHCTRL = value; + __DSB(); + __ISB(); +} + + +/** + \brief Get Debug Authentication Control Register (non-secure) + \details Reads non-secure Debug Authentication Control register when in secure state. + \return Debug Authentication Control Register. + */ +__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) +{ + return (DCB_NS->DAUTHCTRL); +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_DCBFunctions */ + + + + +/* ################################## Debug Identification function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions + \brief Functions that access the Debug Identification Block. + @{ + */ + + +/** + \brief Get Debug Authentication Status Register + \details Reads Debug Authentication Status register. + \return Debug Authentication Status Register. + */ +__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) +{ + return (DIB->DAUTHSTATUS); +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Debug Authentication Status Register (non-secure) + \details Reads non-secure Debug Authentication Status register when in secure state. + \return Debug Authentication Status Register. + */ +__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) +{ + return (DIB_NS->DAUTHSTATUS); +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_DCBFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM33_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Include/core_cm35p.h b/Drivers/CMSIS/Include/core_cm35p.h new file mode 100644 index 0000000..3843d95 --- /dev/null +++ b/Drivers/CMSIS/Include/core_cm35p.h @@ -0,0 +1,3277 @@ +/**************************************************************************//** + * @file core_cm35p.h + * @brief CMSIS Cortex-M35P Core Peripheral Access Layer Header File + * @version V1.1.3 + * @date 13. October 2021 + ******************************************************************************/ +/* + * Copyright (c) 2018-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#elif defined ( __GNUC__ ) + #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ +#endif + +#ifndef __CORE_CM35P_H_GENERIC +#define __CORE_CM35P_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M35P + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM35P definitions */ +#define __CM35P_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM35P_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM35P_CMSIS_VERSION ((__CM35P_CMSIS_VERSION_MAIN << 16U) | \ + __CM35P_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (35U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined (__TARGET_FPU_VFP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined (__ARM_FP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined (__ARMVFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined (__TI_VFP_SUPPORT__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined (__FPU_VFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM35P_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM35P_H_DEPENDANT +#define __CORE_CM35P_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM35P_REV + #define __CM35P_REV 0x0000U + #warning "__CM35P_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 1U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M35P */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED7[21U]; + __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ + uint32_t RESERVED3[69U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[32U]; + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ +#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ + +#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ + __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ + __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration Test FIFO Test Data 0 Register Definitions */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ +#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ +#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ +#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ + +/* TPI Integration Test ATB Control Register 2 Register Definitions */ +#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ +#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ + +#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ +#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ + +#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ +#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ + +#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ +#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ + +/* TPI Integration Test FIFO Test Data 1 Register Definitions */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ +#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ +#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ +#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ + +/* TPI Integration Test ATB Control Register 0 Definitions */ +#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ +#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ + +#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ +#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ + +#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ +#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ + +#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ +#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and VFP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and VFP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/* Media and VFP Feature Register 2 Definitions */ +#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ +#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ + +/*@} end of group CMSIS_FPU */ + +/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED0[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DCB Debug Control Block + \brief Type definitions for the Debug Control Block Registers + @{ + */ + +/** + \brief Structure type to access the Debug Control Block Registers (DCB). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED0[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} DCB_Type; + +/* DHCSR, Debug Halting Control and Status Register Definitions */ +#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ +#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ + +#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ +#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ + +#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ +#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ + +#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ +#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ + +#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ +#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ + +#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ +#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ + +#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ +#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ + +#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ +#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ + +#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ +#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ + +#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ +#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ + +#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ +#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ + +#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ +#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ + +#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ +#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ + +#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ +#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ + +/* DCRSR, Debug Core Register Select Register Definitions */ +#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ +#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ + +#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ +#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ + +/* DCRDR, Debug Core Register Data Register Definitions */ +#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ +#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ + +/* DEMCR, Debug Exception and Monitor Control Register Definitions */ +#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ +#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ + +#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ +#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ + +#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ +#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ + +#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ +#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ + +#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ +#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ + +#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ +#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ + +#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ +#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ + +#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ +#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ + +#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ +#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ + +#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ +#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ + +#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ +#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ + +#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ +#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ + +#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ +#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ + +#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ +#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ + +#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ +#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ + +#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ +#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ + +#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ +#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ + +/* DAUTHCTRL, Debug Authentication Control Register Definitions */ +#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ +#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ + +#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ +#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ + +#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ +#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ + +#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ +#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ + +/* DSCSR, Debug Security Control and Status Register Definitions */ +#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ +#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ + +#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ +#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ + +#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ +#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ + +#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ +#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ + +/*@} end of group CMSIS_DCB */ + + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DIB Debug Identification Block + \brief Type definitions for the Debug Identification Block Registers + @{ + */ + +/** + \brief Structure type to access the Debug Identification Block Registers (DIB). + */ +typedef struct +{ + __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ + __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ + __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ + __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ + __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ +} DIB_Type; + +/* DLAR, SCS Software Lock Access Register Definitions */ +#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ +#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ + +/* DLSR, SCS Software Lock Status Register Definitions */ +#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ +#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ + +#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ +#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ + +#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ +#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ + +/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ +#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ +#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ +#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ +#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ +#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ + +/* DDEVARCH, SCS Device Architecture Register Definitions */ +#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ +#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ + +#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ +#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ + +#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ +#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ + +#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ +#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ + +#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ +#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ + +/* DDEVTYPE, SCS Device Type Register Definitions */ +#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ +#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ + +#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ +#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ + + +/*@} end of group CMSIS_DIB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ + #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ + #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ + #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ + #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ + #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ + #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ + #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ + #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_register_aliases Backwards Compatibility Aliases + \brief Register alias definitions for backwards compatibility. + @{ + */ +#define ID_ADR (ID_AFR) /*!< SCB Auxiliary Feature Register */ +/*@} */ + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## Debug Control function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_DCBFunctions Debug Control Functions + \brief Functions that access the Debug Control Block. + @{ + */ + + +/** + \brief Set Debug Authentication Control Register + \details writes to Debug Authentication Control register. + \param [in] value value to be writen. + */ +__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) +{ + __DSB(); + __ISB(); + DCB->DAUTHCTRL = value; + __DSB(); + __ISB(); +} + + +/** + \brief Get Debug Authentication Control Register + \details Reads Debug Authentication Control register. + \return Debug Authentication Control Register. + */ +__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) +{ + return (DCB->DAUTHCTRL); +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Debug Authentication Control Register (non-secure) + \details writes to non-secure Debug Authentication Control register when in secure state. + \param [in] value value to be writen + */ +__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) +{ + __DSB(); + __ISB(); + DCB_NS->DAUTHCTRL = value; + __DSB(); + __ISB(); +} + + +/** + \brief Get Debug Authentication Control Register (non-secure) + \details Reads non-secure Debug Authentication Control register when in secure state. + \return Debug Authentication Control Register. + */ +__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) +{ + return (DCB_NS->DAUTHCTRL); +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_DCBFunctions */ + + + + +/* ################################## Debug Identification function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions + \brief Functions that access the Debug Identification Block. + @{ + */ + + +/** + \brief Get Debug Authentication Status Register + \details Reads Debug Authentication Status register. + \return Debug Authentication Status Register. + */ +__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) +{ + return (DIB->DAUTHSTATUS); +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Debug Authentication Status Register (non-secure) + \details Reads non-secure Debug Authentication Status register when in secure state. + \return Debug Authentication Status Register. + */ +__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) +{ + return (DIB_NS->DAUTHSTATUS); +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_DCBFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM35P_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Include/core_cm4.h b/Drivers/CMSIS/Include/core_cm4.h new file mode 100644 index 0000000..e21cd14 --- /dev/null +++ b/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.1.2 + * @date 04. June 2021 + ******************************************************************************/ +/* + * Copyright (c) 2009-2020 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM4_H_GENERIC +#define __CORE_CM4_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M4 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM4 definitions */ +#define __CM4_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM4_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16U) | \ + __CM4_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (4U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM4_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM4_H_DEPENDANT +#define __CORE_CM4_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM4_REV + #define __CM4_REV 0x0000U + #warning "__CM4_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 1U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M4 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RESERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */ +#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ + +#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */ +#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[32U]; + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ +#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ + +#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ +#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ +#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ + +#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ +#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and FP Feature Register 2 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/* Media and FP Feature Register 2 Definitions */ + +#define FPU_MVFR2_VFP_Misc_Pos 4U /*!< MVFR2: VFP Misc bits Position */ +#define FPU_MVFR2_VFP_Misc_Msk (0xFUL << FPU_MVFR2_VFP_Misc_Pos) /*!< MVFR2: VFP Misc bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ +#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ +#define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after return, restore floating-point state */ + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + /* ARM Application Note 321 states that the M4 does not require the architectural barrier */ +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM4_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Include/core_cm55.h b/Drivers/CMSIS/Include/core_cm55.h new file mode 100644 index 0000000..faa30ce --- /dev/null +++ b/Drivers/CMSIS/Include/core_cm55.h @@ -0,0 +1,4817 @@ +/**************************************************************************//** + * @file core_cm55.h + * @brief CMSIS Cortex-M55 Core Peripheral Access Layer Header File + * @version V1.2.4 + * @date 21. April 2022 + ******************************************************************************/ +/* + * Copyright (c) 2018-2022 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#elif defined ( __GNUC__ ) + #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ +#endif + +#ifndef __CORE_CM55_H_GENERIC +#define __CORE_CM55_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M55 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM55 definitions */ +#define __CM55_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM55_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM55_CMSIS_VERSION ((__CM55_CMSIS_VERSION_MAIN << 16U) | \ + __CM55_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (55U) /*!< Cortex-M Core */ + +#if defined ( __CC_ARM ) + #error Legacy Arm Compiler does not support Armv8.1-M target architecture. +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM55_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM55_H_DEPENDANT +#define __CORE_CM55_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM55_REV + #define __CM55_REV 0x0000U + #warning "__CM55_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #if __FPU_PRESENT != 0U + #ifndef __FPU_DP + #define __FPU_DP 0U + #warning "__FPU_DP not defined in device header file; using default!" + #endif + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __ICACHE_PRESENT + #define __ICACHE_PRESENT 0U + #warning "__ICACHE_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DCACHE_PRESENT + #define __DCACHE_PRESENT 0U + #warning "__DCACHE_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 1U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __PMU_PRESENT + #define __PMU_PRESENT 0U + #warning "__PMU_PRESENT not defined in device header file; using default!" + #endif + + #if __PMU_PRESENT != 0U + #ifndef __PMU_NUM_EVENTCNT + #define __PMU_NUM_EVENTCNT 8U + #warning "__PMU_NUM_EVENTCNT not defined in device header file; using default!" + #elif (__PMU_NUM_EVENTCNT > 8 || __PMU_NUM_EVENTCNT < 2) + #error "__PMU_NUM_EVENTCNT is out of range in device header file!" */ + #endif + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M55 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core EWIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core PMU Register + - Core MPU Register + - Core SAU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED7[21U]; + __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ + uint32_t RESERVED3[69U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + __IOM uint32_t RFSR; /*!< Offset: 0x204 (R/W) RAS Fault Status Register */ + uint32_t RESERVED4[14U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_IESB_Pos 5U /*!< SCB AIRCR: Implicit ESB Enable Position */ +#define SCB_AIRCR_IESB_Msk (1UL << SCB_AIRCR_IESB_Pos) /*!< SCB AIRCR: Implicit ESB Enable Mask */ + +#define SCB_AIRCR_DIT_Pos 4U /*!< SCB AIRCR: Data Independent Timing Position */ +#define SCB_AIRCR_DIT_Msk (1UL << SCB_AIRCR_DIT_Pos) /*!< SCB AIRCR: Data Independent Timing Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_TRD_Pos 20U /*!< SCB CCR: TRD Position */ +#define SCB_CCR_TRD_Msk (1UL << SCB_CCR_TRD_Pos) /*!< SCB CCR: TRD Mask */ + +#define SCB_CCR_LOB_Pos 19U /*!< SCB CCR: LOB Position */ +#define SCB_CCR_LOB_Msk (1UL << SCB_CCR_LOB_Pos) /*!< SCB CCR: LOB Mask */ + +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_PMU_Pos 5U /*!< SCB DFSR: PMU Position */ +#define SCB_DFSR_PMU_Msk (1UL << SCB_DFSR_PMU_Pos) /*!< SCB DFSR: PMU Mask */ + +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CP7_Pos 7U /*!< SCB NSACR: CP7 Position */ +#define SCB_NSACR_CP7_Msk (1UL << SCB_NSACR_CP7_Pos) /*!< SCB NSACR: CP7 Mask */ + +#define SCB_NSACR_CP6_Pos 6U /*!< SCB NSACR: CP6 Position */ +#define SCB_NSACR_CP6_Msk (1UL << SCB_NSACR_CP6_Pos) /*!< SCB NSACR: CP6 Mask */ + +#define SCB_NSACR_CP5_Pos 5U /*!< SCB NSACR: CP5 Position */ +#define SCB_NSACR_CP5_Msk (1UL << SCB_NSACR_CP5_Pos) /*!< SCB NSACR: CP5 Mask */ + +#define SCB_NSACR_CP4_Pos 4U /*!< SCB NSACR: CP4 Position */ +#define SCB_NSACR_CP4_Msk (1UL << SCB_NSACR_CP4_Pos) /*!< SCB NSACR: CP4 Mask */ + +#define SCB_NSACR_CP3_Pos 3U /*!< SCB NSACR: CP3 Position */ +#define SCB_NSACR_CP3_Msk (1UL << SCB_NSACR_CP3_Pos) /*!< SCB NSACR: CP3 Mask */ + +#define SCB_NSACR_CP2_Pos 2U /*!< SCB NSACR: CP2 Position */ +#define SCB_NSACR_CP2_Msk (1UL << SCB_NSACR_CP2_Pos) /*!< SCB NSACR: CP2 Mask */ + +#define SCB_NSACR_CP1_Pos 1U /*!< SCB NSACR: CP1 Position */ +#define SCB_NSACR_CP1_Msk (1UL << SCB_NSACR_CP1_Pos) /*!< SCB NSACR: CP1 Mask */ + +#define SCB_NSACR_CP0_Pos 0U /*!< SCB NSACR: CP0 Position */ +#define SCB_NSACR_CP0_Msk (1UL /*<< SCB_NSACR_CP0_Pos*/) /*!< SCB NSACR: CP0 Mask */ + +/* SCB Debug Feature Register 0 Definitions */ +#define SCB_ID_DFR_UDE_Pos 28U /*!< SCB ID_DFR: UDE Position */ +#define SCB_ID_DFR_UDE_Msk (0xFUL << SCB_ID_DFR_UDE_Pos) /*!< SCB ID_DFR: UDE Mask */ + +#define SCB_ID_DFR_MProfDbg_Pos 20U /*!< SCB ID_DFR: MProfDbg Position */ +#define SCB_ID_DFR_MProfDbg_Msk (0xFUL << SCB_ID_DFR_MProfDbg_Pos) /*!< SCB ID_DFR: MProfDbg Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB RAS Fault Status Register Definitions */ +#define SCB_RFSR_V_Pos 31U /*!< SCB RFSR: V Position */ +#define SCB_RFSR_V_Msk (1UL << SCB_RFSR_V_Pos) /*!< SCB RFSR: V Mask */ + +#define SCB_RFSR_IS_Pos 16U /*!< SCB RFSR: IS Position */ +#define SCB_RFSR_IS_Msk (0x7FFFUL << SCB_RFSR_IS_Pos) /*!< SCB RFSR: IS Mask */ + +#define SCB_RFSR_UET_Pos 0U /*!< SCB RFSR: UET Position */ +#define SCB_RFSR_UET_Msk (3UL /*<< SCB_RFSR_UET_Pos*/) /*!< SCB RFSR: UET Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ICB Implementation Control Block register (ICB) + \brief Type definitions for the Implementation Control Block Register + @{ + */ + +/** + \brief Structure type to access the Implementation Control Block (ICB). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} ICB_Type; + +/* Auxiliary Control Register Definitions */ +#define ICB_ACTLR_DISCRITAXIRUW_Pos 27U /*!< ACTLR: DISCRITAXIRUW Position */ +#define ICB_ACTLR_DISCRITAXIRUW_Msk (1UL << ICB_ACTLR_DISCRITAXIRUW_Pos) /*!< ACTLR: DISCRITAXIRUW Mask */ + +#define ICB_ACTLR_DISDI_Pos 16U /*!< ACTLR: DISDI Position */ +#define ICB_ACTLR_DISDI_Msk (3UL << ICB_ACTLR_DISDI_Pos) /*!< ACTLR: DISDI Mask */ + +#define ICB_ACTLR_DISCRITAXIRUR_Pos 15U /*!< ACTLR: DISCRITAXIRUR Position */ +#define ICB_ACTLR_DISCRITAXIRUR_Msk (1UL << ICB_ACTLR_DISCRITAXIRUR_Pos) /*!< ACTLR: DISCRITAXIRUR Mask */ + +#define ICB_ACTLR_EVENTBUSEN_Pos 14U /*!< ACTLR: EVENTBUSEN Position */ +#define ICB_ACTLR_EVENTBUSEN_Msk (1UL << ICB_ACTLR_EVENTBUSEN_Pos) /*!< ACTLR: EVENTBUSEN Mask */ + +#define ICB_ACTLR_EVENTBUSEN_S_Pos 13U /*!< ACTLR: EVENTBUSEN_S Position */ +#define ICB_ACTLR_EVENTBUSEN_S_Msk (1UL << ICB_ACTLR_EVENTBUSEN_S_Pos) /*!< ACTLR: EVENTBUSEN_S Mask */ + +#define ICB_ACTLR_DISITMATBFLUSH_Pos 12U /*!< ACTLR: DISITMATBFLUSH Position */ +#define ICB_ACTLR_DISITMATBFLUSH_Msk (1UL << ICB_ACTLR_DISITMATBFLUSH_Pos) /*!< ACTLR: DISITMATBFLUSH Mask */ + +#define ICB_ACTLR_DISNWAMODE_Pos 11U /*!< ACTLR: DISNWAMODE Position */ +#define ICB_ACTLR_DISNWAMODE_Msk (1UL << ICB_ACTLR_DISNWAMODE_Pos) /*!< ACTLR: DISNWAMODE Mask */ + +#define ICB_ACTLR_FPEXCODIS_Pos 10U /*!< ACTLR: FPEXCODIS Position */ +#define ICB_ACTLR_FPEXCODIS_Msk (1UL << ICB_ACTLR_FPEXCODIS_Pos) /*!< ACTLR: FPEXCODIS Mask */ + +#define ICB_ACTLR_DISOLAP_Pos 7U /*!< ACTLR: DISOLAP Position */ +#define ICB_ACTLR_DISOLAP_Msk (1UL << ICB_ACTLR_DISOLAP_Pos) /*!< ACTLR: DISOLAP Mask */ + +#define ICB_ACTLR_DISOLAPS_Pos 6U /*!< ACTLR: DISOLAPS Position */ +#define ICB_ACTLR_DISOLAPS_Msk (1UL << ICB_ACTLR_DISOLAPS_Pos) /*!< ACTLR: DISOLAPS Mask */ + +#define ICB_ACTLR_DISLOBR_Pos 5U /*!< ACTLR: DISLOBR Position */ +#define ICB_ACTLR_DISLOBR_Msk (1UL << ICB_ACTLR_DISLOBR_Pos) /*!< ACTLR: DISLOBR Mask */ + +#define ICB_ACTLR_DISLO_Pos 4U /*!< ACTLR: DISLO Position */ +#define ICB_ACTLR_DISLO_Msk (1UL << ICB_ACTLR_DISLO_Pos) /*!< ACTLR: DISLO Mask */ + +#define ICB_ACTLR_DISLOLEP_Pos 3U /*!< ACTLR: DISLOLEP Position */ +#define ICB_ACTLR_DISLOLEP_Msk (1UL << ICB_ACTLR_DISLOLEP_Pos) /*!< ACTLR: DISLOLEP Mask */ + +#define ICB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define ICB_ACTLR_DISFOLD_Msk (1UL << ICB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +/* Interrupt Controller Type Register Definitions */ +#define ICB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define ICB_ICTR_INTLINESNUM_Msk (0xFUL /*<< ICB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_ICB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[32U]; + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[3U]; + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) ITM Device Type Register */ + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ +#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ + +#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup MemSysCtl_Type Memory System Control Registers (IMPLEMENTATION DEFINED) + \brief Type definitions for the Memory System Control Registers (MEMSYSCTL) + @{ + */ + +/** + \brief Structure type to access the Memory System Control Registers (MEMSYSCTL). + */ +typedef struct +{ + __IOM uint32_t MSCR; /*!< Offset: 0x000 (R/W) Memory System Control Register */ + __IOM uint32_t PFCR; /*!< Offset: 0x004 (R/W) Prefetcher Control Register */ + uint32_t RESERVED1[2U]; + __IOM uint32_t ITCMCR; /*!< Offset: 0x010 (R/W) ITCM Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x014 (R/W) DTCM Control Register */ + __IOM uint32_t PAHBCR; /*!< Offset: 0x018 (R/W) P-AHB Control Register */ + uint32_t RESERVED2[313U]; + __IOM uint32_t ITGU_CTRL; /*!< Offset: 0x500 (R/W) ITGU Control Register */ + __IOM uint32_t ITGU_CFG; /*!< Offset: 0x504 (R/W) ITGU Configuration Register */ + uint32_t RESERVED3[2U]; + __IOM uint32_t ITGU_LUT[16U]; /*!< Offset: 0x510 (R/W) ITGU Look Up Table Register */ + uint32_t RESERVED4[44U]; + __IOM uint32_t DTGU_CTRL; /*!< Offset: 0x600 (R/W) DTGU Control Registers */ + __IOM uint32_t DTGU_CFG; /*!< Offset: 0x604 (R/W) DTGU Configuration Register */ + uint32_t RESERVED5[2U]; + __IOM uint32_t DTGU_LUT[16U]; /*!< Offset: 0x610 (R/W) DTGU Look Up Table Register */ +} MemSysCtl_Type; + +/* MEMSYSCTL Memory System Control Register (MSCR) Register Definitions */ +#define MEMSYSCTL_MSCR_CPWRDN_Pos 17U /*!< MEMSYSCTL MSCR: CPWRDN Position */ +#define MEMSYSCTL_MSCR_CPWRDN_Msk (0x1UL << MEMSYSCTL_MSCR_CPWRDN_Pos) /*!< MEMSYSCTL MSCR: CPWRDN Mask */ + +#define MEMSYSCTL_MSCR_DCCLEAN_Pos 16U /*!< MEMSYSCTL MSCR: DCCLEAN Position */ +#define MEMSYSCTL_MSCR_DCCLEAN_Msk (0x1UL << MEMSYSCTL_MSCR_DCCLEAN_Pos) /*!< MEMSYSCTL MSCR: DCCLEAN Mask */ + +#define MEMSYSCTL_MSCR_ICACTIVE_Pos 13U /*!< MEMSYSCTL MSCR: ICACTIVE Position */ +#define MEMSYSCTL_MSCR_ICACTIVE_Msk (0x1UL << MEMSYSCTL_MSCR_ICACTIVE_Pos) /*!< MEMSYSCTL MSCR: ICACTIVE Mask */ + +#define MEMSYSCTL_MSCR_DCACTIVE_Pos 12U /*!< MEMSYSCTL MSCR: DCACTIVE Position */ +#define MEMSYSCTL_MSCR_DCACTIVE_Msk (0x1UL << MEMSYSCTL_MSCR_DCACTIVE_Pos) /*!< MEMSYSCTL MSCR: DCACTIVE Mask */ + +#define MEMSYSCTL_MSCR_TECCCHKDIS_Pos 4U /*!< MEMSYSCTL MSCR: TECCCHKDIS Position */ +#define MEMSYSCTL_MSCR_TECCCHKDIS_Msk (0x1UL << MEMSYSCTL_MSCR_TECCCHKDIS_Pos) /*!< MEMSYSCTL MSCR: TECCCHKDIS Mask */ + +#define MEMSYSCTL_MSCR_EVECCFAULT_Pos 3U /*!< MEMSYSCTL MSCR: EVECCFAULT Position */ +#define MEMSYSCTL_MSCR_EVECCFAULT_Msk (0x1UL << MEMSYSCTL_MSCR_EVECCFAULT_Pos) /*!< MEMSYSCTL MSCR: EVECCFAULT Mask */ + +#define MEMSYSCTL_MSCR_FORCEWT_Pos 2U /*!< MEMSYSCTL MSCR: FORCEWT Position */ +#define MEMSYSCTL_MSCR_FORCEWT_Msk (0x1UL << MEMSYSCTL_MSCR_FORCEWT_Pos) /*!< MEMSYSCTL MSCR: FORCEWT Mask */ + +#define MEMSYSCTL_MSCR_ECCEN_Pos 1U /*!< MEMSYSCTL MSCR: ECCEN Position */ +#define MEMSYSCTL_MSCR_ECCEN_Msk (0x1UL << MEMSYSCTL_MSCR_ECCEN_Pos) /*!< MEMSYSCTL MSCR: ECCEN Mask */ + +/* MEMSYSCTL Prefetcher Control Register (PFCR) Register Definitions */ +#define MEMSYSCTL_PFCR_MAX_OS_Pos 7U /*!< MEMSYSCTL PFCR: MAX_OS Position */ +#define MEMSYSCTL_PFCR_MAX_OS_Msk (0x7UL << MEMSYSCTL_PFCR_MAX_OS_Pos) /*!< MEMSYSCTL PFCR: MAX_OS Mask */ + +#define MEMSYSCTL_PFCR_MAX_LA_Pos 4U /*!< MEMSYSCTL PFCR: MAX_LA Position */ +#define MEMSYSCTL_PFCR_MAX_LA_Msk (0x7UL << MEMSYSCTL_PFCR_MAX_LA_Pos) /*!< MEMSYSCTL PFCR: MAX_LA Mask */ + +#define MEMSYSCTL_PFCR_MIN_LA_Pos 1U /*!< MEMSYSCTL PFCR: MIN_LA Position */ +#define MEMSYSCTL_PFCR_MIN_LA_Msk (0x7UL << MEMSYSCTL_PFCR_MIN_LA_Pos) /*!< MEMSYSCTL PFCR: MIN_LA Mask */ + +#define MEMSYSCTL_PFCR_ENABLE_Pos 0U /*!< MEMSYSCTL PFCR: ENABLE Position */ +#define MEMSYSCTL_PFCR_ENABLE_Msk (0x1UL /*<< MEMSYSCTL_PFCR_ENABLE_Pos*/) /*!< MEMSYSCTL PFCR: ENABLE Mask */ + +/* MEMSYSCTL ITCM Control Register (ITCMCR) Register Definitions */ +#define MEMSYSCTL_ITCMCR_SZ_Pos 3U /*!< MEMSYSCTL ITCMCR: SZ Position */ +#define MEMSYSCTL_ITCMCR_SZ_Msk (0xFUL << MEMSYSCTL_ITCMCR_SZ_Pos) /*!< MEMSYSCTL ITCMCR: SZ Mask */ + +#define MEMSYSCTL_ITCMCR_EN_Pos 0U /*!< MEMSYSCTL ITCMCR: EN Position */ +#define MEMSYSCTL_ITCMCR_EN_Msk (0x1UL /*<< MEMSYSCTL_ITCMCR_EN_Pos*/) /*!< MEMSYSCTL ITCMCR: EN Mask */ + +/* MEMSYSCTL DTCM Control Register (DTCMCR) Register Definitions */ +#define MEMSYSCTL_DTCMCR_SZ_Pos 3U /*!< MEMSYSCTL DTCMCR: SZ Position */ +#define MEMSYSCTL_DTCMCR_SZ_Msk (0xFUL << MEMSYSCTL_DTCMCR_SZ_Pos) /*!< MEMSYSCTL DTCMCR: SZ Mask */ + +#define MEMSYSCTL_DTCMCR_EN_Pos 0U /*!< MEMSYSCTL DTCMCR: EN Position */ +#define MEMSYSCTL_DTCMCR_EN_Msk (0x1UL /*<< MEMSYSCTL_DTCMCR_EN_Pos*/) /*!< MEMSYSCTL DTCMCR: EN Mask */ + +/* MEMSYSCTL P-AHB Control Register (PAHBCR) Register Definitions */ +#define MEMSYSCTL_PAHBCR_SZ_Pos 1U /*!< MEMSYSCTL PAHBCR: SZ Position */ +#define MEMSYSCTL_PAHBCR_SZ_Msk (0x7UL << MEMSYSCTL_PAHBCR_SZ_Pos) /*!< MEMSYSCTL PAHBCR: SZ Mask */ + +#define MEMSYSCTL_PAHBCR_EN_Pos 0U /*!< MEMSYSCTL PAHBCR: EN Position */ +#define MEMSYSCTL_PAHBCR_EN_Msk (0x1UL /*<< MEMSYSCTL_PAHBCR_EN_Pos*/) /*!< MEMSYSCTL PAHBCR: EN Mask */ + +/* MEMSYSCTL ITGU Control Register (ITGU_CTRL) Register Definitions */ +#define MEMSYSCTL_ITGU_CTRL_DEREN_Pos 1U /*!< MEMSYSCTL ITGU_CTRL: DEREN Position */ +#define MEMSYSCTL_ITGU_CTRL_DEREN_Msk (0x1UL << MEMSYSCTL_ITGU_CTRL_DEREN_Pos) /*!< MEMSYSCTL ITGU_CTRL: DEREN Mask */ + +#define MEMSYSCTL_ITGU_CTRL_DBFEN_Pos 0U /*!< MEMSYSCTL ITGU_CTRL: DBFEN Position */ +#define MEMSYSCTL_ITGU_CTRL_DBFEN_Msk (0x1UL /*<< MEMSYSCTL_ITGU_CTRL_DBFEN_Pos*/) /*!< MEMSYSCTL ITGU_CTRL: DBFEN Mask */ + +/* MEMSYSCTL ITGU Configuration Register (ITGU_CFG) Register Definitions */ +#define MEMSYSCTL_ITGU_CFG_PRESENT_Pos 31U /*!< MEMSYSCTL ITGU_CFG: PRESENT Position */ +#define MEMSYSCTL_ITGU_CFG_PRESENT_Msk (0x1UL << MEMSYSCTL_ITGU_CFG_PRESENT_Pos) /*!< MEMSYSCTL ITGU_CFG: PRESENT Mask */ + +#define MEMSYSCTL_ITGU_CFG_NUMBLKS_Pos 8U /*!< MEMSYSCTL ITGU_CFG: NUMBLKS Position */ +#define MEMSYSCTL_ITGU_CFG_NUMBLKS_Msk (0xFUL << MEMSYSCTL_ITGU_CFG_NUMBLKS_Pos) /*!< MEMSYSCTL ITGU_CFG: NUMBLKS Mask */ + +#define MEMSYSCTL_ITGU_CFG_BLKSZ_Pos 0U /*!< MEMSYSCTL ITGU_CFG: BLKSZ Position */ +#define MEMSYSCTL_ITGU_CFG_BLKSZ_Msk (0xFUL /*<< MEMSYSCTL_ITGU_CFG_BLKSZ_Pos*/) /*!< MEMSYSCTL ITGU_CFG: BLKSZ Mask */ + +/* MEMSYSCTL DTGU Control Registers (DTGU_CTRL) Register Definitions */ +#define MEMSYSCTL_DTGU_CTRL_DEREN_Pos 1U /*!< MEMSYSCTL DTGU_CTRL: DEREN Position */ +#define MEMSYSCTL_DTGU_CTRL_DEREN_Msk (0x1UL << MEMSYSCTL_DTGU_CTRL_DEREN_Pos) /*!< MEMSYSCTL DTGU_CTRL: DEREN Mask */ + +#define MEMSYSCTL_DTGU_CTRL_DBFEN_Pos 0U /*!< MEMSYSCTL DTGU_CTRL: DBFEN Position */ +#define MEMSYSCTL_DTGU_CTRL_DBFEN_Msk (0x1UL /*<< MEMSYSCTL_DTGU_CTRL_DBFEN_Pos*/) /*!< MEMSYSCTL DTGU_CTRL: DBFEN Mask */ + +/* MEMSYSCTL DTGU Configuration Register (DTGU_CFG) Register Definitions */ +#define MEMSYSCTL_DTGU_CFG_PRESENT_Pos 31U /*!< MEMSYSCTL DTGU_CFG: PRESENT Position */ +#define MEMSYSCTL_DTGU_CFG_PRESENT_Msk (0x1UL << MEMSYSCTL_DTGU_CFG_PRESENT_Pos) /*!< MEMSYSCTL DTGU_CFG: PRESENT Mask */ + +#define MEMSYSCTL_DTGU_CFG_NUMBLKS_Pos 8U /*!< MEMSYSCTL DTGU_CFG: NUMBLKS Position */ +#define MEMSYSCTL_DTGU_CFG_NUMBLKS_Msk (0xFUL << MEMSYSCTL_DTGU_CFG_NUMBLKS_Pos) /*!< MEMSYSCTL DTGU_CFG: NUMBLKS Mask */ + +#define MEMSYSCTL_DTGU_CFG_BLKSZ_Pos 0U /*!< MEMSYSCTL DTGU_CFG: BLKSZ Position */ +#define MEMSYSCTL_DTGU_CFG_BLKSZ_Msk (0xFUL /*<< MEMSYSCTL_DTGU_CFG_BLKSZ_Pos*/) /*!< MEMSYSCTL DTGU_CFG: BLKSZ Mask */ + + +/*@}*/ /* end of group MemSysCtl_Type */ + + +/** + \ingroup CMSIS_core_register + \defgroup PwrModCtl_Type Power Mode Control Registers + \brief Type definitions for the Power Mode Control Registers (PWRMODCTL) + @{ + */ + +/** + \brief Structure type to access the Power Mode Control Registers (PWRMODCTL). + */ +typedef struct +{ + __IOM uint32_t CPDLPSTATE; /*!< Offset: 0x000 (R/W) Core Power Domain Low Power State Register */ + __IOM uint32_t DPDLPSTATE; /*!< Offset: 0x004 (R/W) Debug Power Domain Low Power State Register */ +} PwrModCtl_Type; + +/* PWRMODCTL Core Power Domain Low Power State (CPDLPSTATE) Register Definitions */ +#define PWRMODCTL_CPDLPSTATE_RLPSTATE_Pos 8U /*!< PWRMODCTL CPDLPSTATE: RLPSTATE Position */ +#define PWRMODCTL_CPDLPSTATE_RLPSTATE_Msk (0x3UL << PWRMODCTL_CPDLPSTATE_RLPSTATE_Pos) /*!< PWRMODCTL CPDLPSTATE: RLPSTATE Mask */ + +#define PWRMODCTL_CPDLPSTATE_ELPSTATE_Pos 4U /*!< PWRMODCTL CPDLPSTATE: ELPSTATE Position */ +#define PWRMODCTL_CPDLPSTATE_ELPSTATE_Msk (0x3UL << PWRMODCTL_CPDLPSTATE_ELPSTATE_Pos) /*!< PWRMODCTL CPDLPSTATE: ELPSTATE Mask */ + +#define PWRMODCTL_CPDLPSTATE_CLPSTATE_Pos 0U /*!< PWRMODCTL CPDLPSTATE: CLPSTATE Position */ +#define PWRMODCTL_CPDLPSTATE_CLPSTATE_Msk (0x3UL /*<< PWRMODCTL_CPDLPSTATE_CLPSTATE_Pos*/) /*!< PWRMODCTL CPDLPSTATE: CLPSTATE Mask */ + +/* PWRMODCTL Debug Power Domain Low Power State (DPDLPSTATE) Register Definitions */ +#define PWRMODCTL_DPDLPSTATE_DLPSTATE_Pos 0U /*!< PWRMODCTL DPDLPSTATE: DLPSTATE Position */ +#define PWRMODCTL_DPDLPSTATE_DLPSTATE_Msk (0x3UL /*<< PWRMODCTL_DPDLPSTATE_DLPSTATE_Pos*/) /*!< PWRMODCTL DPDLPSTATE: DLPSTATE Mask */ + +/*@}*/ /* end of group PwrModCtl_Type */ + + +/** + \ingroup CMSIS_core_register + \defgroup EWIC_Type External Wakeup Interrupt Controller Registers + \brief Type definitions for the External Wakeup Interrupt Controller Registers (EWIC) + @{ + */ + +/** + \brief Structure type to access the External Wakeup Interrupt Controller Registers (EWIC). + */ +typedef struct +{ + __OM uint32_t EVENTSPR; /*!< Offset: 0x000 ( /W) Event Set Pending Register */ + uint32_t RESERVED0[31U]; + __IM uint32_t EVENTMASKA; /*!< Offset: 0x080 (R/W) Event Mask A Register */ + __IM uint32_t EVENTMASK[15]; /*!< Offset: 0x084 (R/W) Event Mask Register */ +} EWIC_Type; + +/* EWIC External Wakeup Interrupt Controller (EVENTSPR) Register Definitions */ +#define EWIC_EVENTSPR_EDBGREQ_Pos 2U /*!< EWIC EVENTSPR: EDBGREQ Position */ +#define EWIC_EVENTSPR_EDBGREQ_Msk (0x1UL << EWIC_EVENTSPR_EDBGREQ_Pos) /*!< EWIC EVENTSPR: EDBGREQ Mask */ + +#define EWIC_EVENTSPR_NMI_Pos 1U /*!< EWIC EVENTSPR: NMI Position */ +#define EWIC_EVENTSPR_NMI_Msk (0x1UL << EWIC_EVENTSPR_NMI_Pos) /*!< EWIC EVENTSPR: NMI Mask */ + +#define EWIC_EVENTSPR_EVENT_Pos 0U /*!< EWIC EVENTSPR: EVENT Position */ +#define EWIC_EVENTSPR_EVENT_Msk (0x1UL /*<< EWIC_EVENTSPR_EVENT_Pos*/) /*!< EWIC EVENTSPR: EVENT Mask */ + +/* EWIC External Wakeup Interrupt Controller (EVENTMASKA) Register Definitions */ +#define EWIC_EVENTMASKA_EDBGREQ_Pos 2U /*!< EWIC EVENTMASKA: EDBGREQ Position */ +#define EWIC_EVENTMASKA_EDBGREQ_Msk (0x1UL << EWIC_EVENTMASKA_EDBGREQ_Pos) /*!< EWIC EVENTMASKA: EDBGREQ Mask */ + +#define EWIC_EVENTMASKA_NMI_Pos 1U /*!< EWIC EVENTMASKA: NMI Position */ +#define EWIC_EVENTMASKA_NMI_Msk (0x1UL << EWIC_EVENTMASKA_NMI_Pos) /*!< EWIC EVENTMASKA: NMI Mask */ + +#define EWIC_EVENTMASKA_EVENT_Pos 0U /*!< EWIC EVENTMASKA: EVENT Position */ +#define EWIC_EVENTMASKA_EVENT_Msk (0x1UL /*<< EWIC_EVENTMASKA_EVENT_Pos*/) /*!< EWIC EVENTMASKA: EVENT Mask */ + +/* EWIC External Wakeup Interrupt Controller (EVENTMASK) Register Definitions */ +#define EWIC_EVENTMASK_IRQ_Pos 0U /*!< EWIC EVENTMASKA: IRQ Position */ +#define EWIC_EVENTMASK_IRQ_Msk (0xFFFFFFFFUL /*<< EWIC_EVENTMASKA_IRQ_Pos*/) /*!< EWIC EVENTMASKA: IRQ Mask */ + +/*@}*/ /* end of group EWIC_Type */ + + +/** + \ingroup CMSIS_core_register + \defgroup ErrBnk_Type Error Banking Registers (IMPLEMENTATION DEFINED) + \brief Type definitions for the Error Banking Registers (ERRBNK) + @{ + */ + +/** + \brief Structure type to access the Error Banking Registers (ERRBNK). + */ +typedef struct +{ + __IOM uint32_t IEBR0; /*!< Offset: 0x000 (R/W) Instruction Cache Error Bank Register 0 */ + __IOM uint32_t IEBR1; /*!< Offset: 0x004 (R/W) Instruction Cache Error Bank Register 1 */ + uint32_t RESERVED0[2U]; + __IOM uint32_t DEBR0; /*!< Offset: 0x010 (R/W) Data Cache Error Bank Register 0 */ + __IOM uint32_t DEBR1; /*!< Offset: 0x014 (R/W) Data Cache Error Bank Register 1 */ + uint32_t RESERVED1[2U]; + __IOM uint32_t TEBR0; /*!< Offset: 0x020 (R/W) TCM Error Bank Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t TEBR1; /*!< Offset: 0x028 (R/W) TCM Error Bank Register 1 */ +} ErrBnk_Type; + +/* ERRBNK Instruction Cache Error Bank Register 0 (IEBR0) Register Definitions */ +#define ERRBNK_IEBR0_SWDEF_Pos 30U /*!< ERRBNK IEBR0: SWDEF Position */ +#define ERRBNK_IEBR0_SWDEF_Msk (0x3UL << ERRBNK_IEBR0_SWDEF_Pos) /*!< ERRBNK IEBR0: SWDEF Mask */ + +#define ERRBNK_IEBR0_BANK_Pos 16U /*!< ERRBNK IEBR0: BANK Position */ +#define ERRBNK_IEBR0_BANK_Msk (0x1UL << ERRBNK_IEBR0_BANK_Pos) /*!< ERRBNK IEBR0: BANK Mask */ + +#define ERRBNK_IEBR0_LOCATION_Pos 2U /*!< ERRBNK IEBR0: LOCATION Position */ +#define ERRBNK_IEBR0_LOCATION_Msk (0x3FFFUL << ERRBNK_IEBR0_LOCATION_Pos) /*!< ERRBNK IEBR0: LOCATION Mask */ + +#define ERRBNK_IEBR0_LOCKED_Pos 1U /*!< ERRBNK IEBR0: LOCKED Position */ +#define ERRBNK_IEBR0_LOCKED_Msk (0x1UL << ERRBNK_IEBR0_LOCKED_Pos) /*!< ERRBNK IEBR0: LOCKED Mask */ + +#define ERRBNK_IEBR0_VALID_Pos 0U /*!< ERRBNK IEBR0: VALID Position */ +#define ERRBNK_IEBR0_VALID_Msk (0x1UL << /*ERRBNK_IEBR0_VALID_Pos*/) /*!< ERRBNK IEBR0: VALID Mask */ + +/* ERRBNK Instruction Cache Error Bank Register 1 (IEBR1) Register Definitions */ +#define ERRBNK_IEBR1_SWDEF_Pos 30U /*!< ERRBNK IEBR1: SWDEF Position */ +#define ERRBNK_IEBR1_SWDEF_Msk (0x3UL << ERRBNK_IEBR1_SWDEF_Pos) /*!< ERRBNK IEBR1: SWDEF Mask */ + +#define ERRBNK_IEBR1_BANK_Pos 16U /*!< ERRBNK IEBR1: BANK Position */ +#define ERRBNK_IEBR1_BANK_Msk (0x1UL << ERRBNK_IEBR1_BANK_Pos) /*!< ERRBNK IEBR1: BANK Mask */ + +#define ERRBNK_IEBR1_LOCATION_Pos 2U /*!< ERRBNK IEBR1: LOCATION Position */ +#define ERRBNK_IEBR1_LOCATION_Msk (0x3FFFUL << ERRBNK_IEBR1_LOCATION_Pos) /*!< ERRBNK IEBR1: LOCATION Mask */ + +#define ERRBNK_IEBR1_LOCKED_Pos 1U /*!< ERRBNK IEBR1: LOCKED Position */ +#define ERRBNK_IEBR1_LOCKED_Msk (0x1UL << ERRBNK_IEBR1_LOCKED_Pos) /*!< ERRBNK IEBR1: LOCKED Mask */ + +#define ERRBNK_IEBR1_VALID_Pos 0U /*!< ERRBNK IEBR1: VALID Position */ +#define ERRBNK_IEBR1_VALID_Msk (0x1UL << /*ERRBNK_IEBR1_VALID_Pos*/) /*!< ERRBNK IEBR1: VALID Mask */ + +/* ERRBNK Data Cache Error Bank Register 0 (DEBR0) Register Definitions */ +#define ERRBNK_DEBR0_SWDEF_Pos 30U /*!< ERRBNK DEBR0: SWDEF Position */ +#define ERRBNK_DEBR0_SWDEF_Msk (0x3UL << ERRBNK_DEBR0_SWDEF_Pos) /*!< ERRBNK DEBR0: SWDEF Mask */ + +#define ERRBNK_DEBR0_TYPE_Pos 17U /*!< ERRBNK DEBR0: TYPE Position */ +#define ERRBNK_DEBR0_TYPE_Msk (0x1UL << ERRBNK_DEBR0_TYPE_Pos) /*!< ERRBNK DEBR0: TYPE Mask */ + +#define ERRBNK_DEBR0_BANK_Pos 16U /*!< ERRBNK DEBR0: BANK Position */ +#define ERRBNK_DEBR0_BANK_Msk (0x1UL << ERRBNK_DEBR0_BANK_Pos) /*!< ERRBNK DEBR0: BANK Mask */ + +#define ERRBNK_DEBR0_LOCATION_Pos 2U /*!< ERRBNK DEBR0: LOCATION Position */ +#define ERRBNK_DEBR0_LOCATION_Msk (0x3FFFUL << ERRBNK_DEBR0_LOCATION_Pos) /*!< ERRBNK DEBR0: LOCATION Mask */ + +#define ERRBNK_DEBR0_LOCKED_Pos 1U /*!< ERRBNK DEBR0: LOCKED Position */ +#define ERRBNK_DEBR0_LOCKED_Msk (0x1UL << ERRBNK_DEBR0_LOCKED_Pos) /*!< ERRBNK DEBR0: LOCKED Mask */ + +#define ERRBNK_DEBR0_VALID_Pos 0U /*!< ERRBNK DEBR0: VALID Position */ +#define ERRBNK_DEBR0_VALID_Msk (0x1UL << /*ERRBNK_DEBR0_VALID_Pos*/) /*!< ERRBNK DEBR0: VALID Mask */ + +/* ERRBNK Data Cache Error Bank Register 1 (DEBR1) Register Definitions */ +#define ERRBNK_DEBR1_SWDEF_Pos 30U /*!< ERRBNK DEBR1: SWDEF Position */ +#define ERRBNK_DEBR1_SWDEF_Msk (0x3UL << ERRBNK_DEBR1_SWDEF_Pos) /*!< ERRBNK DEBR1: SWDEF Mask */ + +#define ERRBNK_DEBR1_TYPE_Pos 17U /*!< ERRBNK DEBR1: TYPE Position */ +#define ERRBNK_DEBR1_TYPE_Msk (0x1UL << ERRBNK_DEBR1_TYPE_Pos) /*!< ERRBNK DEBR1: TYPE Mask */ + +#define ERRBNK_DEBR1_BANK_Pos 16U /*!< ERRBNK DEBR1: BANK Position */ +#define ERRBNK_DEBR1_BANK_Msk (0x1UL << ERRBNK_DEBR1_BANK_Pos) /*!< ERRBNK DEBR1: BANK Mask */ + +#define ERRBNK_DEBR1_LOCATION_Pos 2U /*!< ERRBNK DEBR1: LOCATION Position */ +#define ERRBNK_DEBR1_LOCATION_Msk (0x3FFFUL << ERRBNK_DEBR1_LOCATION_Pos) /*!< ERRBNK DEBR1: LOCATION Mask */ + +#define ERRBNK_DEBR1_LOCKED_Pos 1U /*!< ERRBNK DEBR1: LOCKED Position */ +#define ERRBNK_DEBR1_LOCKED_Msk (0x1UL << ERRBNK_DEBR1_LOCKED_Pos) /*!< ERRBNK DEBR1: LOCKED Mask */ + +#define ERRBNK_DEBR1_VALID_Pos 0U /*!< ERRBNK DEBR1: VALID Position */ +#define ERRBNK_DEBR1_VALID_Msk (0x1UL << /*ERRBNK_DEBR1_VALID_Pos*/) /*!< ERRBNK DEBR1: VALID Mask */ + +/* ERRBNK TCM Error Bank Register 0 (TEBR0) Register Definitions */ +#define ERRBNK_TEBR0_SWDEF_Pos 30U /*!< ERRBNK TEBR0: SWDEF Position */ +#define ERRBNK_TEBR0_SWDEF_Msk (0x3UL << ERRBNK_TEBR0_SWDEF_Pos) /*!< ERRBNK TEBR0: SWDEF Mask */ + +#define ERRBNK_TEBR0_POISON_Pos 28U /*!< ERRBNK TEBR0: POISON Position */ +#define ERRBNK_TEBR0_POISON_Msk (0x1UL << ERRBNK_TEBR0_POISON_Pos) /*!< ERRBNK TEBR0: POISON Mask */ + +#define ERRBNK_TEBR0_TYPE_Pos 27U /*!< ERRBNK TEBR0: TYPE Position */ +#define ERRBNK_TEBR0_TYPE_Msk (0x1UL << ERRBNK_TEBR0_TYPE_Pos) /*!< ERRBNK TEBR0: TYPE Mask */ + +#define ERRBNK_TEBR0_BANK_Pos 24U /*!< ERRBNK TEBR0: BANK Position */ +#define ERRBNK_TEBR0_BANK_Msk (0x3UL << ERRBNK_TEBR0_BANK_Pos) /*!< ERRBNK TEBR0: BANK Mask */ + +#define ERRBNK_TEBR0_LOCATION_Pos 2U /*!< ERRBNK TEBR0: LOCATION Position */ +#define ERRBNK_TEBR0_LOCATION_Msk (0x3FFFFFUL << ERRBNK_TEBR0_LOCATION_Pos) /*!< ERRBNK TEBR0: LOCATION Mask */ + +#define ERRBNK_TEBR0_LOCKED_Pos 1U /*!< ERRBNK TEBR0: LOCKED Position */ +#define ERRBNK_TEBR0_LOCKED_Msk (0x1UL << ERRBNK_TEBR0_LOCKED_Pos) /*!< ERRBNK TEBR0: LOCKED Mask */ + +#define ERRBNK_TEBR0_VALID_Pos 0U /*!< ERRBNK TEBR0: VALID Position */ +#define ERRBNK_TEBR0_VALID_Msk (0x1UL << /*ERRBNK_TEBR0_VALID_Pos*/) /*!< ERRBNK TEBR0: VALID Mask */ + +/* ERRBNK TCM Error Bank Register 1 (TEBR1) Register Definitions */ +#define ERRBNK_TEBR1_SWDEF_Pos 30U /*!< ERRBNK TEBR1: SWDEF Position */ +#define ERRBNK_TEBR1_SWDEF_Msk (0x3UL << ERRBNK_TEBR1_SWDEF_Pos) /*!< ERRBNK TEBR1: SWDEF Mask */ + +#define ERRBNK_TEBR1_POISON_Pos 28U /*!< ERRBNK TEBR1: POISON Position */ +#define ERRBNK_TEBR1_POISON_Msk (0x1UL << ERRBNK_TEBR1_POISON_Pos) /*!< ERRBNK TEBR1: POISON Mask */ + +#define ERRBNK_TEBR1_TYPE_Pos 27U /*!< ERRBNK TEBR1: TYPE Position */ +#define ERRBNK_TEBR1_TYPE_Msk (0x1UL << ERRBNK_TEBR1_TYPE_Pos) /*!< ERRBNK TEBR1: TYPE Mask */ + +#define ERRBNK_TEBR1_BANK_Pos 24U /*!< ERRBNK TEBR1: BANK Position */ +#define ERRBNK_TEBR1_BANK_Msk (0x3UL << ERRBNK_TEBR1_BANK_Pos) /*!< ERRBNK TEBR1: BANK Mask */ + +#define ERRBNK_TEBR1_LOCATION_Pos 2U /*!< ERRBNK TEBR1: LOCATION Position */ +#define ERRBNK_TEBR1_LOCATION_Msk (0x3FFFFFUL << ERRBNK_TEBR1_LOCATION_Pos) /*!< ERRBNK TEBR1: LOCATION Mask */ + +#define ERRBNK_TEBR1_LOCKED_Pos 1U /*!< ERRBNK TEBR1: LOCKED Position */ +#define ERRBNK_TEBR1_LOCKED_Msk (0x1UL << ERRBNK_TEBR1_LOCKED_Pos) /*!< ERRBNK TEBR1: LOCKED Mask */ + +#define ERRBNK_TEBR1_VALID_Pos 0U /*!< ERRBNK TEBR1: VALID Position */ +#define ERRBNK_TEBR1_VALID_Msk (0x1UL << /*ERRBNK_TEBR1_VALID_Pos*/) /*!< ERRBNK TEBR1: VALID Mask */ + +/*@}*/ /* end of group ErrBnk_Type */ + + +/** + \ingroup CMSIS_core_register + \defgroup PrcCfgInf_Type Processor Configuration Information Registers (IMPLEMENTATION DEFINED) + \brief Type definitions for the Processor Configuration Information Registerss (PRCCFGINF) + @{ + */ + +/** + \brief Structure type to access the Processor Configuration Information Registerss (PRCCFGINF). + */ +typedef struct +{ + __OM uint32_t CFGINFOSEL; /*!< Offset: 0x000 ( /W) Processor Configuration Information Selection Register */ + __IM uint32_t CFGINFORD; /*!< Offset: 0x004 (R/ ) Processor Configuration Information Read Data Register */ +} PrcCfgInf_Type; + +/* PRCCFGINF Processor Configuration Information Selection Register (CFGINFOSEL) Definitions */ + +/* PRCCFGINF Processor Configuration Information Read Data Register (CFGINFORD) Definitions */ + +/*@}*/ /* end of group PrcCfgInf_Type */ + + +/** + \ingroup CMSIS_core_register + \defgroup STL_Type Software Test Library Observation Registers + \brief Type definitions for the Software Test Library Observation Registerss (STL) + @{ + */ + +/** + \brief Structure type to access the Software Test Library Observation Registerss (STL). + */ +typedef struct +{ + __IM uint32_t STLNVICPENDOR; /*!< Offset: 0x000 (R/ ) NVIC Pending Priority Tree Register */ + __IM uint32_t STLNVICACTVOR; /*!< Offset: 0x004 (R/ ) NVIC Active Priority Tree Register */ + uint32_t RESERVED0[2U]; + __OM uint32_t STLIDMPUSR; /*!< Offset: 0x010 ( /W) MPU Sanple Register */ + __IM uint32_t STLIMPUOR; /*!< Offset: 0x014 (R/ ) MPU Region Hit Register */ + __IM uint32_t STLD0MPUOR; /*!< Offset: 0x018 (R/ ) MPU Memory Attributes Register 0 */ + __IM uint32_t STLD1MPUOR; /*!< Offset: 0x01C (R/ ) MPU Memory Attributes Register 1 */ + +} STL_Type; + +/* STL Software Test Library Observation Register (STLNVICPENDOR) Definitions */ +#define STL_STLNVICPENDOR_VALID_Pos 18U /*!< STL STLNVICPENDOR: VALID Position */ +#define STL_STLNVICPENDOR_VALID_Msk (0x1UL << STL_STLNVICPENDOR_VALID_Pos) /*!< STL STLNVICPENDOR: VALID Mask */ + +#define STL_STLNVICPENDOR_TARGET_Pos 17U /*!< STL STLNVICPENDOR: TARGET Position */ +#define STL_STLNVICPENDOR_TARGET_Msk (0x1UL << STL_STLNVICPENDOR_TARGET_Pos) /*!< STL STLNVICPENDOR: TARGET Mask */ + +#define STL_STLNVICPENDOR_PRIORITY_Pos 9U /*!< STL STLNVICPENDOR: PRIORITY Position */ +#define STL_STLNVICPENDOR_PRIORITY_Msk (0xFFUL << STL_STLNVICPENDOR_PRIORITY_Pos) /*!< STL STLNVICPENDOR: PRIORITY Mask */ + +#define STL_STLNVICPENDOR_INTNUM_Pos 0U /*!< STL STLNVICPENDOR: INTNUM Position */ +#define STL_STLNVICPENDOR_INTNUM_Msk (0x1FFUL /*<< STL_STLNVICPENDOR_INTNUM_Pos*/) /*!< STL STLNVICPENDOR: INTNUM Mask */ + +/* STL Software Test Library Observation Register (STLNVICACTVOR) Definitions */ +#define STL_STLNVICACTVOR_VALID_Pos 18U /*!< STL STLNVICACTVOR: VALID Position */ +#define STL_STLNVICACTVOR_VALID_Msk (0x1UL << STL_STLNVICACTVOR_VALID_Pos) /*!< STL STLNVICACTVOR: VALID Mask */ + +#define STL_STLNVICACTVOR_TARGET_Pos 17U /*!< STL STLNVICACTVOR: TARGET Position */ +#define STL_STLNVICACTVOR_TARGET_Msk (0x1UL << STL_STLNVICACTVOR_TARGET_Pos) /*!< STL STLNVICACTVOR: TARGET Mask */ + +#define STL_STLNVICACTVOR_PRIORITY_Pos 9U /*!< STL STLNVICACTVOR: PRIORITY Position */ +#define STL_STLNVICACTVOR_PRIORITY_Msk (0xFFUL << STL_STLNVICACTVOR_PRIORITY_Pos) /*!< STL STLNVICACTVOR: PRIORITY Mask */ + +#define STL_STLNVICACTVOR_INTNUM_Pos 0U /*!< STL STLNVICACTVOR: INTNUM Position */ +#define STL_STLNVICACTVOR_INTNUM_Msk (0x1FFUL /*<< STL_STLNVICACTVOR_INTNUM_Pos*/) /*!< STL STLNVICACTVOR: INTNUM Mask */ + +/* STL Software Test Library Observation Register (STLIDMPUSR) Definitions */ +#define STL_STLIDMPUSR_ADDR_Pos 5U /*!< STL STLIDMPUSR: ADDR Position */ +#define STL_STLIDMPUSR_ADDR_Msk (0x7FFFFFFUL << STL_STLIDMPUSR_ADDR_Pos) /*!< STL STLIDMPUSR: ADDR Mask */ + +#define STL_STLIDMPUSR_INSTR_Pos 2U /*!< STL STLIDMPUSR: INSTR Position */ +#define STL_STLIDMPUSR_INSTR_Msk (0x1UL << STL_STLIDMPUSR_INSTR_Pos) /*!< STL STLIDMPUSR: INSTR Mask */ + +#define STL_STLIDMPUSR_DATA_Pos 1U /*!< STL STLIDMPUSR: DATA Position */ +#define STL_STLIDMPUSR_DATA_Msk (0x1UL << STL_STLIDMPUSR_DATA_Pos) /*!< STL STLIDMPUSR: DATA Mask */ + +/* STL Software Test Library Observation Register (STLIMPUOR) Definitions */ +#define STL_STLIMPUOR_HITREGION_Pos 9U /*!< STL STLIMPUOR: HITREGION Position */ +#define STL_STLIMPUOR_HITREGION_Msk (0xFFUL << STL_STLIMPUOR_HITREGION_Pos) /*!< STL STLIMPUOR: HITREGION Mask */ + +#define STL_STLIMPUOR_ATTR_Pos 0U /*!< STL STLIMPUOR: ATTR Position */ +#define STL_STLIMPUOR_ATTR_Msk (0x1FFUL /*<< STL_STLIMPUOR_ATTR_Pos*/) /*!< STL STLIMPUOR: ATTR Mask */ + +/* STL Software Test Library Observation Register (STLD0MPUOR) Definitions */ +#define STL_STLD0MPUOR_HITREGION_Pos 9U /*!< STL STLD0MPUOR: HITREGION Position */ +#define STL_STLD0MPUOR_HITREGION_Msk (0xFFUL << STL_STLD0MPUOR_HITREGION_Pos) /*!< STL STLD0MPUOR: HITREGION Mask */ + +#define STL_STLD0MPUOR_ATTR_Pos 0U /*!< STL STLD0MPUOR: ATTR Position */ +#define STL_STLD0MPUOR_ATTR_Msk (0x1FFUL /*<< STL_STLD0MPUOR_ATTR_Pos*/) /*!< STL STLD0MPUOR: ATTR Mask */ + +/* STL Software Test Library Observation Register (STLD1MPUOR) Definitions */ +#define STL_STLD1MPUOR_HITREGION_Pos 9U /*!< STL STLD1MPUOR: HITREGION Position */ +#define STL_STLD1MPUOR_HITREGION_Msk (0xFFUL << STL_STLD1MPUOR_HITREGION_Pos) /*!< STL STLD1MPUOR: HITREGION Mask */ + +#define STL_STLD1MPUOR_ATTR_Pos 0U /*!< STL STLD1MPUOR: ATTR Position */ +#define STL_STLD1MPUOR_ATTR_Msk (0x1FFUL /*<< STL_STLD1MPUOR_ATTR_Pos*/) /*!< STL STLD1MPUOR: ATTR Mask */ + +/*@}*/ /* end of group STL_Type */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[809U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ + uint32_t RESERVED4[4U]; + __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ +#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFmt_Pos 0U /*!< TPI FFCR: EnFmt Position */ +#define TPI_FFCR_EnFmt_Msk (0x3UL << /*TPI_FFCR_EnFmt_Pos*/) /*!< TPI FFCR: EnFmt Mask */ + +/* TPI Periodic Synchronization Control Register Definitions */ +#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ +#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ + +/* TPI Software Lock Status Register Definitions */ +#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ +#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ + +#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ +#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ + +#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ +#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + +#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_PMU Performance Monitoring Unit (PMU) + \brief Type definitions for the Performance Monitoring Unit (PMU) + @{ + */ + +/** + \brief Structure type to access the Performance Monitoring Unit (PMU). + */ +typedef struct +{ + __IOM uint32_t EVCNTR[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x0 (R/W) PMU Event Counter Registers */ +#if __PMU_NUM_EVENTCNT<31 + uint32_t RESERVED0[31U-__PMU_NUM_EVENTCNT]; +#endif + __IOM uint32_t CCNTR; /*!< Offset: 0x7C (R/W) PMU Cycle Counter Register */ + uint32_t RESERVED1[224]; + __IOM uint32_t EVTYPER[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x400 (R/W) PMU Event Type and Filter Registers */ +#if __PMU_NUM_EVENTCNT<31 + uint32_t RESERVED2[31U-__PMU_NUM_EVENTCNT]; +#endif + __IOM uint32_t CCFILTR; /*!< Offset: 0x47C (R/W) PMU Cycle Counter Filter Register */ + uint32_t RESERVED3[480]; + __IOM uint32_t CNTENSET; /*!< Offset: 0xC00 (R/W) PMU Count Enable Set Register */ + uint32_t RESERVED4[7]; + __IOM uint32_t CNTENCLR; /*!< Offset: 0xC20 (R/W) PMU Count Enable Clear Register */ + uint32_t RESERVED5[7]; + __IOM uint32_t INTENSET; /*!< Offset: 0xC40 (R/W) PMU Interrupt Enable Set Register */ + uint32_t RESERVED6[7]; + __IOM uint32_t INTENCLR; /*!< Offset: 0xC60 (R/W) PMU Interrupt Enable Clear Register */ + uint32_t RESERVED7[7]; + __IOM uint32_t OVSCLR; /*!< Offset: 0xC80 (R/W) PMU Overflow Flag Status Clear Register */ + uint32_t RESERVED8[7]; + __IOM uint32_t SWINC; /*!< Offset: 0xCA0 (R/W) PMU Software Increment Register */ + uint32_t RESERVED9[7]; + __IOM uint32_t OVSSET; /*!< Offset: 0xCC0 (R/W) PMU Overflow Flag Status Set Register */ + uint32_t RESERVED10[79]; + __IOM uint32_t TYPE; /*!< Offset: 0xE00 (R/W) PMU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0xE04 (R/W) PMU Control Register */ + uint32_t RESERVED11[108]; + __IOM uint32_t AUTHSTATUS; /*!< Offset: 0xFB8 (R/W) PMU Authentication Status Register */ + __IOM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/W) PMU Device Architecture Register */ + uint32_t RESERVED12[3]; + __IOM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/W) PMU Device Type Register */ + __IOM uint32_t PIDR4; /*!< Offset: 0xFD0 (R/W) PMU Peripheral Identification Register 4 */ + uint32_t RESERVED13[3]; + __IOM uint32_t PIDR0; /*!< Offset: 0xFE0 (R/W) PMU Peripheral Identification Register 0 */ + __IOM uint32_t PIDR1; /*!< Offset: 0xFE4 (R/W) PMU Peripheral Identification Register 1 */ + __IOM uint32_t PIDR2; /*!< Offset: 0xFE8 (R/W) PMU Peripheral Identification Register 2 */ + __IOM uint32_t PIDR3; /*!< Offset: 0xFEC (R/W) PMU Peripheral Identification Register 3 */ + __IOM uint32_t CIDR0; /*!< Offset: 0xFF0 (R/W) PMU Component Identification Register 0 */ + __IOM uint32_t CIDR1; /*!< Offset: 0xFF4 (R/W) PMU Component Identification Register 1 */ + __IOM uint32_t CIDR2; /*!< Offset: 0xFF8 (R/W) PMU Component Identification Register 2 */ + __IOM uint32_t CIDR3; /*!< Offset: 0xFFC (R/W) PMU Component Identification Register 3 */ +} PMU_Type; + +/** \brief PMU Event Counter Registers (0-30) Definitions */ + +#define PMU_EVCNTR_CNT_Pos 0U /*!< PMU EVCNTR: Counter Position */ +#define PMU_EVCNTR_CNT_Msk (0xFFFFUL /*<< PMU_EVCNTRx_CNT_Pos*/) /*!< PMU EVCNTR: Counter Mask */ + +/** \brief PMU Event Type and Filter Registers (0-30) Definitions */ + +#define PMU_EVTYPER_EVENTTOCNT_Pos 0U /*!< PMU EVTYPER: Event to Count Position */ +#define PMU_EVTYPER_EVENTTOCNT_Msk (0xFFFFUL /*<< EVTYPERx_EVENTTOCNT_Pos*/) /*!< PMU EVTYPER: Event to Count Mask */ + +/** \brief PMU Count Enable Set Register Definitions */ + +#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENSET: Event Counter 0 Enable Set Position */ +#define PMU_CNTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENSET_CNT0_ENABLE_Pos*/) /*!< PMU CNTENSET: Event Counter 0 Enable Set Mask */ + +#define PMU_CNTENSET_CNT1_ENABLE_Pos 1U /*!< PMU CNTENSET: Event Counter 1 Enable Set Position */ +#define PMU_CNTENSET_CNT1_ENABLE_Msk (1UL << PMU_CNTENSET_CNT1_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 1 Enable Set Mask */ + +#define PMU_CNTENSET_CNT2_ENABLE_Pos 2U /*!< PMU CNTENSET: Event Counter 2 Enable Set Position */ +#define PMU_CNTENSET_CNT2_ENABLE_Msk (1UL << PMU_CNTENSET_CNT2_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 2 Enable Set Mask */ + +#define PMU_CNTENSET_CNT3_ENABLE_Pos 3U /*!< PMU CNTENSET: Event Counter 3 Enable Set Position */ +#define PMU_CNTENSET_CNT3_ENABLE_Msk (1UL << PMU_CNTENSET_CNT3_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 3 Enable Set Mask */ + +#define PMU_CNTENSET_CNT4_ENABLE_Pos 4U /*!< PMU CNTENSET: Event Counter 4 Enable Set Position */ +#define PMU_CNTENSET_CNT4_ENABLE_Msk (1UL << PMU_CNTENSET_CNT4_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 4 Enable Set Mask */ + +#define PMU_CNTENSET_CNT5_ENABLE_Pos 5U /*!< PMU CNTENSET: Event Counter 5 Enable Set Position */ +#define PMU_CNTENSET_CNT5_ENABLE_Msk (1UL << PMU_CNTENSET_CNT5_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 5 Enable Set Mask */ + +#define PMU_CNTENSET_CNT6_ENABLE_Pos 6U /*!< PMU CNTENSET: Event Counter 6 Enable Set Position */ +#define PMU_CNTENSET_CNT6_ENABLE_Msk (1UL << PMU_CNTENSET_CNT6_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 6 Enable Set Mask */ + +#define PMU_CNTENSET_CNT7_ENABLE_Pos 7U /*!< PMU CNTENSET: Event Counter 7 Enable Set Position */ +#define PMU_CNTENSET_CNT7_ENABLE_Msk (1UL << PMU_CNTENSET_CNT7_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 7 Enable Set Mask */ + +#define PMU_CNTENSET_CNT8_ENABLE_Pos 8U /*!< PMU CNTENSET: Event Counter 8 Enable Set Position */ +#define PMU_CNTENSET_CNT8_ENABLE_Msk (1UL << PMU_CNTENSET_CNT8_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 8 Enable Set Mask */ + +#define PMU_CNTENSET_CNT9_ENABLE_Pos 9U /*!< PMU CNTENSET: Event Counter 9 Enable Set Position */ +#define PMU_CNTENSET_CNT9_ENABLE_Msk (1UL << PMU_CNTENSET_CNT9_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 9 Enable Set Mask */ + +#define PMU_CNTENSET_CNT10_ENABLE_Pos 10U /*!< PMU CNTENSET: Event Counter 10 Enable Set Position */ +#define PMU_CNTENSET_CNT10_ENABLE_Msk (1UL << PMU_CNTENSET_CNT10_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 10 Enable Set Mask */ + +#define PMU_CNTENSET_CNT11_ENABLE_Pos 11U /*!< PMU CNTENSET: Event Counter 11 Enable Set Position */ +#define PMU_CNTENSET_CNT11_ENABLE_Msk (1UL << PMU_CNTENSET_CNT11_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 11 Enable Set Mask */ + +#define PMU_CNTENSET_CNT12_ENABLE_Pos 12U /*!< PMU CNTENSET: Event Counter 12 Enable Set Position */ +#define PMU_CNTENSET_CNT12_ENABLE_Msk (1UL << PMU_CNTENSET_CNT12_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 12 Enable Set Mask */ + +#define PMU_CNTENSET_CNT13_ENABLE_Pos 13U /*!< PMU CNTENSET: Event Counter 13 Enable Set Position */ +#define PMU_CNTENSET_CNT13_ENABLE_Msk (1UL << PMU_CNTENSET_CNT13_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 13 Enable Set Mask */ + +#define PMU_CNTENSET_CNT14_ENABLE_Pos 14U /*!< PMU CNTENSET: Event Counter 14 Enable Set Position */ +#define PMU_CNTENSET_CNT14_ENABLE_Msk (1UL << PMU_CNTENSET_CNT14_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 14 Enable Set Mask */ + +#define PMU_CNTENSET_CNT15_ENABLE_Pos 15U /*!< PMU CNTENSET: Event Counter 15 Enable Set Position */ +#define PMU_CNTENSET_CNT15_ENABLE_Msk (1UL << PMU_CNTENSET_CNT15_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 15 Enable Set Mask */ + +#define PMU_CNTENSET_CNT16_ENABLE_Pos 16U /*!< PMU CNTENSET: Event Counter 16 Enable Set Position */ +#define PMU_CNTENSET_CNT16_ENABLE_Msk (1UL << PMU_CNTENSET_CNT16_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 16 Enable Set Mask */ + +#define PMU_CNTENSET_CNT17_ENABLE_Pos 17U /*!< PMU CNTENSET: Event Counter 17 Enable Set Position */ +#define PMU_CNTENSET_CNT17_ENABLE_Msk (1UL << PMU_CNTENSET_CNT17_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 17 Enable Set Mask */ + +#define PMU_CNTENSET_CNT18_ENABLE_Pos 18U /*!< PMU CNTENSET: Event Counter 18 Enable Set Position */ +#define PMU_CNTENSET_CNT18_ENABLE_Msk (1UL << PMU_CNTENSET_CNT18_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 18 Enable Set Mask */ + +#define PMU_CNTENSET_CNT19_ENABLE_Pos 19U /*!< PMU CNTENSET: Event Counter 19 Enable Set Position */ +#define PMU_CNTENSET_CNT19_ENABLE_Msk (1UL << PMU_CNTENSET_CNT19_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 19 Enable Set Mask */ + +#define PMU_CNTENSET_CNT20_ENABLE_Pos 20U /*!< PMU CNTENSET: Event Counter 20 Enable Set Position */ +#define PMU_CNTENSET_CNT20_ENABLE_Msk (1UL << PMU_CNTENSET_CNT20_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 20 Enable Set Mask */ + +#define PMU_CNTENSET_CNT21_ENABLE_Pos 21U /*!< PMU CNTENSET: Event Counter 21 Enable Set Position */ +#define PMU_CNTENSET_CNT21_ENABLE_Msk (1UL << PMU_CNTENSET_CNT21_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 21 Enable Set Mask */ + +#define PMU_CNTENSET_CNT22_ENABLE_Pos 22U /*!< PMU CNTENSET: Event Counter 22 Enable Set Position */ +#define PMU_CNTENSET_CNT22_ENABLE_Msk (1UL << PMU_CNTENSET_CNT22_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 22 Enable Set Mask */ + +#define PMU_CNTENSET_CNT23_ENABLE_Pos 23U /*!< PMU CNTENSET: Event Counter 23 Enable Set Position */ +#define PMU_CNTENSET_CNT23_ENABLE_Msk (1UL << PMU_CNTENSET_CNT23_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 23 Enable Set Mask */ + +#define PMU_CNTENSET_CNT24_ENABLE_Pos 24U /*!< PMU CNTENSET: Event Counter 24 Enable Set Position */ +#define PMU_CNTENSET_CNT24_ENABLE_Msk (1UL << PMU_CNTENSET_CNT24_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 24 Enable Set Mask */ + +#define PMU_CNTENSET_CNT25_ENABLE_Pos 25U /*!< PMU CNTENSET: Event Counter 25 Enable Set Position */ +#define PMU_CNTENSET_CNT25_ENABLE_Msk (1UL << PMU_CNTENSET_CNT25_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 25 Enable Set Mask */ + +#define PMU_CNTENSET_CNT26_ENABLE_Pos 26U /*!< PMU CNTENSET: Event Counter 26 Enable Set Position */ +#define PMU_CNTENSET_CNT26_ENABLE_Msk (1UL << PMU_CNTENSET_CNT26_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 26 Enable Set Mask */ + +#define PMU_CNTENSET_CNT27_ENABLE_Pos 27U /*!< PMU CNTENSET: Event Counter 27 Enable Set Position */ +#define PMU_CNTENSET_CNT27_ENABLE_Msk (1UL << PMU_CNTENSET_CNT27_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 27 Enable Set Mask */ + +#define PMU_CNTENSET_CNT28_ENABLE_Pos 28U /*!< PMU CNTENSET: Event Counter 28 Enable Set Position */ +#define PMU_CNTENSET_CNT28_ENABLE_Msk (1UL << PMU_CNTENSET_CNT28_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 28 Enable Set Mask */ + +#define PMU_CNTENSET_CNT29_ENABLE_Pos 29U /*!< PMU CNTENSET: Event Counter 29 Enable Set Position */ +#define PMU_CNTENSET_CNT29_ENABLE_Msk (1UL << PMU_CNTENSET_CNT29_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 29 Enable Set Mask */ + +#define PMU_CNTENSET_CNT30_ENABLE_Pos 30U /*!< PMU CNTENSET: Event Counter 30 Enable Set Position */ +#define PMU_CNTENSET_CNT30_ENABLE_Msk (1UL << PMU_CNTENSET_CNT30_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 30 Enable Set Mask */ + +#define PMU_CNTENSET_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENSET: Cycle Counter Enable Set Position */ +#define PMU_CNTENSET_CCNTR_ENABLE_Msk (1UL << PMU_CNTENSET_CCNTR_ENABLE_Pos) /*!< PMU CNTENSET: Cycle Counter Enable Set Mask */ + +/** \brief PMU Count Enable Clear Register Definitions */ + +#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Position */ +#define PMU_CNTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU CNTENCLR: Event Counter 1 Enable Clear Position */ +#define PMU_CNTENCLR_CNT1_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT1_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 1 Enable Clear */ + +#define PMU_CNTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Position */ +#define PMU_CNTENCLR_CNT2_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT2_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Position */ +#define PMU_CNTENCLR_CNT3_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT3_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Position */ +#define PMU_CNTENCLR_CNT4_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT4_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Position */ +#define PMU_CNTENCLR_CNT5_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT5_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Position */ +#define PMU_CNTENCLR_CNT6_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT6_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Position */ +#define PMU_CNTENCLR_CNT7_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT7_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Position */ +#define PMU_CNTENCLR_CNT8_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT8_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Position */ +#define PMU_CNTENCLR_CNT9_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT9_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Position */ +#define PMU_CNTENCLR_CNT10_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT10_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Position */ +#define PMU_CNTENCLR_CNT11_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT11_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Position */ +#define PMU_CNTENCLR_CNT12_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT12_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Position */ +#define PMU_CNTENCLR_CNT13_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT13_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Position */ +#define PMU_CNTENCLR_CNT14_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT14_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Position */ +#define PMU_CNTENCLR_CNT15_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT15_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Position */ +#define PMU_CNTENCLR_CNT16_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT16_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Position */ +#define PMU_CNTENCLR_CNT17_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT17_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Position */ +#define PMU_CNTENCLR_CNT18_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT18_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Position */ +#define PMU_CNTENCLR_CNT19_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT19_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Position */ +#define PMU_CNTENCLR_CNT20_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT20_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Position */ +#define PMU_CNTENCLR_CNT21_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT21_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Position */ +#define PMU_CNTENCLR_CNT22_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT22_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Position */ +#define PMU_CNTENCLR_CNT23_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT23_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Position */ +#define PMU_CNTENCLR_CNT24_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT24_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Position */ +#define PMU_CNTENCLR_CNT25_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT25_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Position */ +#define PMU_CNTENCLR_CNT26_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT26_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Position */ +#define PMU_CNTENCLR_CNT27_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT27_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Position */ +#define PMU_CNTENCLR_CNT28_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT28_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Position */ +#define PMU_CNTENCLR_CNT29_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT29_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Position */ +#define PMU_CNTENCLR_CNT30_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT30_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Mask */ + +#define PMU_CNTENCLR_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENCLR: Cycle Counter Enable Clear Position */ +#define PMU_CNTENCLR_CCNTR_ENABLE_Msk (1UL << PMU_CNTENCLR_CCNTR_ENABLE_Pos) /*!< PMU CNTENCLR: Cycle Counter Enable Clear Mask */ + +/** \brief PMU Interrupt Enable Set Register Definitions */ + +#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENSET_CNT0_ENABLE_Pos*/) /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT1_ENABLE_Pos 1U /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT1_ENABLE_Msk (1UL << PMU_INTENSET_CNT1_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT2_ENABLE_Pos 2U /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT2_ENABLE_Msk (1UL << PMU_INTENSET_CNT2_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT3_ENABLE_Pos 3U /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT3_ENABLE_Msk (1UL << PMU_INTENSET_CNT3_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT4_ENABLE_Pos 4U /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT4_ENABLE_Msk (1UL << PMU_INTENSET_CNT4_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT5_ENABLE_Pos 5U /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT5_ENABLE_Msk (1UL << PMU_INTENSET_CNT5_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT6_ENABLE_Pos 6U /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT6_ENABLE_Msk (1UL << PMU_INTENSET_CNT6_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT7_ENABLE_Pos 7U /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT7_ENABLE_Msk (1UL << PMU_INTENSET_CNT7_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT8_ENABLE_Pos 8U /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT8_ENABLE_Msk (1UL << PMU_INTENSET_CNT8_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT9_ENABLE_Pos 9U /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT9_ENABLE_Msk (1UL << PMU_INTENSET_CNT9_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT10_ENABLE_Pos 10U /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT10_ENABLE_Msk (1UL << PMU_INTENSET_CNT10_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT11_ENABLE_Pos 11U /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT11_ENABLE_Msk (1UL << PMU_INTENSET_CNT11_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT12_ENABLE_Pos 12U /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT12_ENABLE_Msk (1UL << PMU_INTENSET_CNT12_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT13_ENABLE_Pos 13U /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT13_ENABLE_Msk (1UL << PMU_INTENSET_CNT13_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT14_ENABLE_Pos 14U /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT14_ENABLE_Msk (1UL << PMU_INTENSET_CNT14_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT15_ENABLE_Pos 15U /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT15_ENABLE_Msk (1UL << PMU_INTENSET_CNT15_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT16_ENABLE_Pos 16U /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT16_ENABLE_Msk (1UL << PMU_INTENSET_CNT16_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT17_ENABLE_Pos 17U /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT17_ENABLE_Msk (1UL << PMU_INTENSET_CNT17_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT18_ENABLE_Pos 18U /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT18_ENABLE_Msk (1UL << PMU_INTENSET_CNT18_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT19_ENABLE_Pos 19U /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT19_ENABLE_Msk (1UL << PMU_INTENSET_CNT19_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT20_ENABLE_Pos 20U /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT20_ENABLE_Msk (1UL << PMU_INTENSET_CNT20_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT21_ENABLE_Pos 21U /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT21_ENABLE_Msk (1UL << PMU_INTENSET_CNT21_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT22_ENABLE_Pos 22U /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT22_ENABLE_Msk (1UL << PMU_INTENSET_CNT22_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT23_ENABLE_Pos 23U /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT23_ENABLE_Msk (1UL << PMU_INTENSET_CNT23_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT24_ENABLE_Pos 24U /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT24_ENABLE_Msk (1UL << PMU_INTENSET_CNT24_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT25_ENABLE_Pos 25U /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT25_ENABLE_Msk (1UL << PMU_INTENSET_CNT25_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT26_ENABLE_Pos 26U /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT26_ENABLE_Msk (1UL << PMU_INTENSET_CNT26_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT27_ENABLE_Pos 27U /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT27_ENABLE_Msk (1UL << PMU_INTENSET_CNT27_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT28_ENABLE_Pos 28U /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT28_ENABLE_Msk (1UL << PMU_INTENSET_CNT28_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT29_ENABLE_Pos 29U /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT29_ENABLE_Msk (1UL << PMU_INTENSET_CNT29_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT30_ENABLE_Pos 30U /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT30_ENABLE_Msk (1UL << PMU_INTENSET_CNT30_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Position */ +#define PMU_INTENSET_CCYCNT_ENABLE_Msk (1UL << PMU_INTENSET_CYCCNT_ENABLE_Pos) /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Mask */ + +/** \brief PMU Interrupt Enable Clear Register Definitions */ + +#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT1_ENABLE_Msk (1UL << PMU_INTENCLR_CNT1_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear */ + +#define PMU_INTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT2_ENABLE_Msk (1UL << PMU_INTENCLR_CNT2_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT3_ENABLE_Msk (1UL << PMU_INTENCLR_CNT3_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT4_ENABLE_Msk (1UL << PMU_INTENCLR_CNT4_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT5_ENABLE_Msk (1UL << PMU_INTENCLR_CNT5_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT6_ENABLE_Msk (1UL << PMU_INTENCLR_CNT6_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT7_ENABLE_Msk (1UL << PMU_INTENCLR_CNT7_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT8_ENABLE_Msk (1UL << PMU_INTENCLR_CNT8_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT9_ENABLE_Msk (1UL << PMU_INTENCLR_CNT9_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT10_ENABLE_Msk (1UL << PMU_INTENCLR_CNT10_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT11_ENABLE_Msk (1UL << PMU_INTENCLR_CNT11_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT12_ENABLE_Msk (1UL << PMU_INTENCLR_CNT12_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT13_ENABLE_Msk (1UL << PMU_INTENCLR_CNT13_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT14_ENABLE_Msk (1UL << PMU_INTENCLR_CNT14_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT15_ENABLE_Msk (1UL << PMU_INTENCLR_CNT15_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT16_ENABLE_Msk (1UL << PMU_INTENCLR_CNT16_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT17_ENABLE_Msk (1UL << PMU_INTENCLR_CNT17_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT18_ENABLE_Msk (1UL << PMU_INTENCLR_CNT18_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT19_ENABLE_Msk (1UL << PMU_INTENCLR_CNT19_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT20_ENABLE_Msk (1UL << PMU_INTENCLR_CNT20_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT21_ENABLE_Msk (1UL << PMU_INTENCLR_CNT21_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT22_ENABLE_Msk (1UL << PMU_INTENCLR_CNT22_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT23_ENABLE_Msk (1UL << PMU_INTENCLR_CNT23_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT24_ENABLE_Msk (1UL << PMU_INTENCLR_CNT24_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT25_ENABLE_Msk (1UL << PMU_INTENCLR_CNT25_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT26_ENABLE_Msk (1UL << PMU_INTENCLR_CNT26_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT27_ENABLE_Msk (1UL << PMU_INTENCLR_CNT27_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT28_ENABLE_Msk (1UL << PMU_INTENCLR_CNT28_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT29_ENABLE_Msk (1UL << PMU_INTENCLR_CNT29_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT30_ENABLE_Msk (1UL << PMU_INTENCLR_CNT30_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CYCCNT_ENABLE_Msk (1UL << PMU_INTENCLR_CYCCNT_ENABLE_Pos) /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Mask */ + +/** \brief PMU Overflow Flag Status Set Register Definitions */ + +#define PMU_OVSSET_CNT0_STATUS_Pos 0U /*!< PMU OVSSET: Event Counter 0 Overflow Set Position */ +#define PMU_OVSSET_CNT0_STATUS_Msk (1UL /*<< PMU_OVSSET_CNT0_STATUS_Pos*/) /*!< PMU OVSSET: Event Counter 0 Overflow Set Mask */ + +#define PMU_OVSSET_CNT1_STATUS_Pos 1U /*!< PMU OVSSET: Event Counter 1 Overflow Set Position */ +#define PMU_OVSSET_CNT1_STATUS_Msk (1UL << PMU_OVSSET_CNT1_STATUS_Pos) /*!< PMU OVSSET: Event Counter 1 Overflow Set Mask */ + +#define PMU_OVSSET_CNT2_STATUS_Pos 2U /*!< PMU OVSSET: Event Counter 2 Overflow Set Position */ +#define PMU_OVSSET_CNT2_STATUS_Msk (1UL << PMU_OVSSET_CNT2_STATUS_Pos) /*!< PMU OVSSET: Event Counter 2 Overflow Set Mask */ + +#define PMU_OVSSET_CNT3_STATUS_Pos 3U /*!< PMU OVSSET: Event Counter 3 Overflow Set Position */ +#define PMU_OVSSET_CNT3_STATUS_Msk (1UL << PMU_OVSSET_CNT3_STATUS_Pos) /*!< PMU OVSSET: Event Counter 3 Overflow Set Mask */ + +#define PMU_OVSSET_CNT4_STATUS_Pos 4U /*!< PMU OVSSET: Event Counter 4 Overflow Set Position */ +#define PMU_OVSSET_CNT4_STATUS_Msk (1UL << PMU_OVSSET_CNT4_STATUS_Pos) /*!< PMU OVSSET: Event Counter 4 Overflow Set Mask */ + +#define PMU_OVSSET_CNT5_STATUS_Pos 5U /*!< PMU OVSSET: Event Counter 5 Overflow Set Position */ +#define PMU_OVSSET_CNT5_STATUS_Msk (1UL << PMU_OVSSET_CNT5_STATUS_Pos) /*!< PMU OVSSET: Event Counter 5 Overflow Set Mask */ + +#define PMU_OVSSET_CNT6_STATUS_Pos 6U /*!< PMU OVSSET: Event Counter 6 Overflow Set Position */ +#define PMU_OVSSET_CNT6_STATUS_Msk (1UL << PMU_OVSSET_CNT6_STATUS_Pos) /*!< PMU OVSSET: Event Counter 6 Overflow Set Mask */ + +#define PMU_OVSSET_CNT7_STATUS_Pos 7U /*!< PMU OVSSET: Event Counter 7 Overflow Set Position */ +#define PMU_OVSSET_CNT7_STATUS_Msk (1UL << PMU_OVSSET_CNT7_STATUS_Pos) /*!< PMU OVSSET: Event Counter 7 Overflow Set Mask */ + +#define PMU_OVSSET_CNT8_STATUS_Pos 8U /*!< PMU OVSSET: Event Counter 8 Overflow Set Position */ +#define PMU_OVSSET_CNT8_STATUS_Msk (1UL << PMU_OVSSET_CNT8_STATUS_Pos) /*!< PMU OVSSET: Event Counter 8 Overflow Set Mask */ + +#define PMU_OVSSET_CNT9_STATUS_Pos 9U /*!< PMU OVSSET: Event Counter 9 Overflow Set Position */ +#define PMU_OVSSET_CNT9_STATUS_Msk (1UL << PMU_OVSSET_CNT9_STATUS_Pos) /*!< PMU OVSSET: Event Counter 9 Overflow Set Mask */ + +#define PMU_OVSSET_CNT10_STATUS_Pos 10U /*!< PMU OVSSET: Event Counter 10 Overflow Set Position */ +#define PMU_OVSSET_CNT10_STATUS_Msk (1UL << PMU_OVSSET_CNT10_STATUS_Pos) /*!< PMU OVSSET: Event Counter 10 Overflow Set Mask */ + +#define PMU_OVSSET_CNT11_STATUS_Pos 11U /*!< PMU OVSSET: Event Counter 11 Overflow Set Position */ +#define PMU_OVSSET_CNT11_STATUS_Msk (1UL << PMU_OVSSET_CNT11_STATUS_Pos) /*!< PMU OVSSET: Event Counter 11 Overflow Set Mask */ + +#define PMU_OVSSET_CNT12_STATUS_Pos 12U /*!< PMU OVSSET: Event Counter 12 Overflow Set Position */ +#define PMU_OVSSET_CNT12_STATUS_Msk (1UL << PMU_OVSSET_CNT12_STATUS_Pos) /*!< PMU OVSSET: Event Counter 12 Overflow Set Mask */ + +#define PMU_OVSSET_CNT13_STATUS_Pos 13U /*!< PMU OVSSET: Event Counter 13 Overflow Set Position */ +#define PMU_OVSSET_CNT13_STATUS_Msk (1UL << PMU_OVSSET_CNT13_STATUS_Pos) /*!< PMU OVSSET: Event Counter 13 Overflow Set Mask */ + +#define PMU_OVSSET_CNT14_STATUS_Pos 14U /*!< PMU OVSSET: Event Counter 14 Overflow Set Position */ +#define PMU_OVSSET_CNT14_STATUS_Msk (1UL << PMU_OVSSET_CNT14_STATUS_Pos) /*!< PMU OVSSET: Event Counter 14 Overflow Set Mask */ + +#define PMU_OVSSET_CNT15_STATUS_Pos 15U /*!< PMU OVSSET: Event Counter 15 Overflow Set Position */ +#define PMU_OVSSET_CNT15_STATUS_Msk (1UL << PMU_OVSSET_CNT15_STATUS_Pos) /*!< PMU OVSSET: Event Counter 15 Overflow Set Mask */ + +#define PMU_OVSSET_CNT16_STATUS_Pos 16U /*!< PMU OVSSET: Event Counter 16 Overflow Set Position */ +#define PMU_OVSSET_CNT16_STATUS_Msk (1UL << PMU_OVSSET_CNT16_STATUS_Pos) /*!< PMU OVSSET: Event Counter 16 Overflow Set Mask */ + +#define PMU_OVSSET_CNT17_STATUS_Pos 17U /*!< PMU OVSSET: Event Counter 17 Overflow Set Position */ +#define PMU_OVSSET_CNT17_STATUS_Msk (1UL << PMU_OVSSET_CNT17_STATUS_Pos) /*!< PMU OVSSET: Event Counter 17 Overflow Set Mask */ + +#define PMU_OVSSET_CNT18_STATUS_Pos 18U /*!< PMU OVSSET: Event Counter 18 Overflow Set Position */ +#define PMU_OVSSET_CNT18_STATUS_Msk (1UL << PMU_OVSSET_CNT18_STATUS_Pos) /*!< PMU OVSSET: Event Counter 18 Overflow Set Mask */ + +#define PMU_OVSSET_CNT19_STATUS_Pos 19U /*!< PMU OVSSET: Event Counter 19 Overflow Set Position */ +#define PMU_OVSSET_CNT19_STATUS_Msk (1UL << PMU_OVSSET_CNT19_STATUS_Pos) /*!< PMU OVSSET: Event Counter 19 Overflow Set Mask */ + +#define PMU_OVSSET_CNT20_STATUS_Pos 20U /*!< PMU OVSSET: Event Counter 20 Overflow Set Position */ +#define PMU_OVSSET_CNT20_STATUS_Msk (1UL << PMU_OVSSET_CNT20_STATUS_Pos) /*!< PMU OVSSET: Event Counter 20 Overflow Set Mask */ + +#define PMU_OVSSET_CNT21_STATUS_Pos 21U /*!< PMU OVSSET: Event Counter 21 Overflow Set Position */ +#define PMU_OVSSET_CNT21_STATUS_Msk (1UL << PMU_OVSSET_CNT21_STATUS_Pos) /*!< PMU OVSSET: Event Counter 21 Overflow Set Mask */ + +#define PMU_OVSSET_CNT22_STATUS_Pos 22U /*!< PMU OVSSET: Event Counter 22 Overflow Set Position */ +#define PMU_OVSSET_CNT22_STATUS_Msk (1UL << PMU_OVSSET_CNT22_STATUS_Pos) /*!< PMU OVSSET: Event Counter 22 Overflow Set Mask */ + +#define PMU_OVSSET_CNT23_STATUS_Pos 23U /*!< PMU OVSSET: Event Counter 23 Overflow Set Position */ +#define PMU_OVSSET_CNT23_STATUS_Msk (1UL << PMU_OVSSET_CNT23_STATUS_Pos) /*!< PMU OVSSET: Event Counter 23 Overflow Set Mask */ + +#define PMU_OVSSET_CNT24_STATUS_Pos 24U /*!< PMU OVSSET: Event Counter 24 Overflow Set Position */ +#define PMU_OVSSET_CNT24_STATUS_Msk (1UL << PMU_OVSSET_CNT24_STATUS_Pos) /*!< PMU OVSSET: Event Counter 24 Overflow Set Mask */ + +#define PMU_OVSSET_CNT25_STATUS_Pos 25U /*!< PMU OVSSET: Event Counter 25 Overflow Set Position */ +#define PMU_OVSSET_CNT25_STATUS_Msk (1UL << PMU_OVSSET_CNT25_STATUS_Pos) /*!< PMU OVSSET: Event Counter 25 Overflow Set Mask */ + +#define PMU_OVSSET_CNT26_STATUS_Pos 26U /*!< PMU OVSSET: Event Counter 26 Overflow Set Position */ +#define PMU_OVSSET_CNT26_STATUS_Msk (1UL << PMU_OVSSET_CNT26_STATUS_Pos) /*!< PMU OVSSET: Event Counter 26 Overflow Set Mask */ + +#define PMU_OVSSET_CNT27_STATUS_Pos 27U /*!< PMU OVSSET: Event Counter 27 Overflow Set Position */ +#define PMU_OVSSET_CNT27_STATUS_Msk (1UL << PMU_OVSSET_CNT27_STATUS_Pos) /*!< PMU OVSSET: Event Counter 27 Overflow Set Mask */ + +#define PMU_OVSSET_CNT28_STATUS_Pos 28U /*!< PMU OVSSET: Event Counter 28 Overflow Set Position */ +#define PMU_OVSSET_CNT28_STATUS_Msk (1UL << PMU_OVSSET_CNT28_STATUS_Pos) /*!< PMU OVSSET: Event Counter 28 Overflow Set Mask */ + +#define PMU_OVSSET_CNT29_STATUS_Pos 29U /*!< PMU OVSSET: Event Counter 29 Overflow Set Position */ +#define PMU_OVSSET_CNT29_STATUS_Msk (1UL << PMU_OVSSET_CNT29_STATUS_Pos) /*!< PMU OVSSET: Event Counter 29 Overflow Set Mask */ + +#define PMU_OVSSET_CNT30_STATUS_Pos 30U /*!< PMU OVSSET: Event Counter 30 Overflow Set Position */ +#define PMU_OVSSET_CNT30_STATUS_Msk (1UL << PMU_OVSSET_CNT30_STATUS_Pos) /*!< PMU OVSSET: Event Counter 30 Overflow Set Mask */ + +#define PMU_OVSSET_CYCCNT_STATUS_Pos 31U /*!< PMU OVSSET: Cycle Counter Overflow Set Position */ +#define PMU_OVSSET_CYCCNT_STATUS_Msk (1UL << PMU_OVSSET_CYCCNT_STATUS_Pos) /*!< PMU OVSSET: Cycle Counter Overflow Set Mask */ + +/** \brief PMU Overflow Flag Status Clear Register Definitions */ + +#define PMU_OVSCLR_CNT0_STATUS_Pos 0U /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Position */ +#define PMU_OVSCLR_CNT0_STATUS_Msk (1UL /*<< PMU_OVSCLR_CNT0_STATUS_Pos*/) /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT1_STATUS_Pos 1U /*!< PMU OVSCLR: Event Counter 1 Overflow Clear Position */ +#define PMU_OVSCLR_CNT1_STATUS_Msk (1UL << PMU_OVSCLR_CNT1_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 1 Overflow Clear */ + +#define PMU_OVSCLR_CNT2_STATUS_Pos 2U /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Position */ +#define PMU_OVSCLR_CNT2_STATUS_Msk (1UL << PMU_OVSCLR_CNT2_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT3_STATUS_Pos 3U /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Position */ +#define PMU_OVSCLR_CNT3_STATUS_Msk (1UL << PMU_OVSCLR_CNT3_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT4_STATUS_Pos 4U /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Position */ +#define PMU_OVSCLR_CNT4_STATUS_Msk (1UL << PMU_OVSCLR_CNT4_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT5_STATUS_Pos 5U /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Position */ +#define PMU_OVSCLR_CNT5_STATUS_Msk (1UL << PMU_OVSCLR_CNT5_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT6_STATUS_Pos 6U /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Position */ +#define PMU_OVSCLR_CNT6_STATUS_Msk (1UL << PMU_OVSCLR_CNT6_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT7_STATUS_Pos 7U /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Position */ +#define PMU_OVSCLR_CNT7_STATUS_Msk (1UL << PMU_OVSCLR_CNT7_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT8_STATUS_Pos 8U /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Position */ +#define PMU_OVSCLR_CNT8_STATUS_Msk (1UL << PMU_OVSCLR_CNT8_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT9_STATUS_Pos 9U /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Position */ +#define PMU_OVSCLR_CNT9_STATUS_Msk (1UL << PMU_OVSCLR_CNT9_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT10_STATUS_Pos 10U /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Position */ +#define PMU_OVSCLR_CNT10_STATUS_Msk (1UL << PMU_OVSCLR_CNT10_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT11_STATUS_Pos 11U /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Position */ +#define PMU_OVSCLR_CNT11_STATUS_Msk (1UL << PMU_OVSCLR_CNT11_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT12_STATUS_Pos 12U /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Position */ +#define PMU_OVSCLR_CNT12_STATUS_Msk (1UL << PMU_OVSCLR_CNT12_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT13_STATUS_Pos 13U /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Position */ +#define PMU_OVSCLR_CNT13_STATUS_Msk (1UL << PMU_OVSCLR_CNT13_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT14_STATUS_Pos 14U /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Position */ +#define PMU_OVSCLR_CNT14_STATUS_Msk (1UL << PMU_OVSCLR_CNT14_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT15_STATUS_Pos 15U /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Position */ +#define PMU_OVSCLR_CNT15_STATUS_Msk (1UL << PMU_OVSCLR_CNT15_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT16_STATUS_Pos 16U /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Position */ +#define PMU_OVSCLR_CNT16_STATUS_Msk (1UL << PMU_OVSCLR_CNT16_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT17_STATUS_Pos 17U /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Position */ +#define PMU_OVSCLR_CNT17_STATUS_Msk (1UL << PMU_OVSCLR_CNT17_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT18_STATUS_Pos 18U /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Position */ +#define PMU_OVSCLR_CNT18_STATUS_Msk (1UL << PMU_OVSCLR_CNT18_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT19_STATUS_Pos 19U /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Position */ +#define PMU_OVSCLR_CNT19_STATUS_Msk (1UL << PMU_OVSCLR_CNT19_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT20_STATUS_Pos 20U /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Position */ +#define PMU_OVSCLR_CNT20_STATUS_Msk (1UL << PMU_OVSCLR_CNT20_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT21_STATUS_Pos 21U /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Position */ +#define PMU_OVSCLR_CNT21_STATUS_Msk (1UL << PMU_OVSCLR_CNT21_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT22_STATUS_Pos 22U /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Position */ +#define PMU_OVSCLR_CNT22_STATUS_Msk (1UL << PMU_OVSCLR_CNT22_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT23_STATUS_Pos 23U /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Position */ +#define PMU_OVSCLR_CNT23_STATUS_Msk (1UL << PMU_OVSCLR_CNT23_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT24_STATUS_Pos 24U /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Position */ +#define PMU_OVSCLR_CNT24_STATUS_Msk (1UL << PMU_OVSCLR_CNT24_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT25_STATUS_Pos 25U /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Position */ +#define PMU_OVSCLR_CNT25_STATUS_Msk (1UL << PMU_OVSCLR_CNT25_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT26_STATUS_Pos 26U /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Position */ +#define PMU_OVSCLR_CNT26_STATUS_Msk (1UL << PMU_OVSCLR_CNT26_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT27_STATUS_Pos 27U /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Position */ +#define PMU_OVSCLR_CNT27_STATUS_Msk (1UL << PMU_OVSCLR_CNT27_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT28_STATUS_Pos 28U /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Position */ +#define PMU_OVSCLR_CNT28_STATUS_Msk (1UL << PMU_OVSCLR_CNT28_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT29_STATUS_Pos 29U /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Position */ +#define PMU_OVSCLR_CNT29_STATUS_Msk (1UL << PMU_OVSCLR_CNT29_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT30_STATUS_Pos 30U /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Position */ +#define PMU_OVSCLR_CNT30_STATUS_Msk (1UL << PMU_OVSCLR_CNT30_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Mask */ + +#define PMU_OVSCLR_CYCCNT_STATUS_Pos 31U /*!< PMU OVSCLR: Cycle Counter Overflow Clear Position */ +#define PMU_OVSCLR_CYCCNT_STATUS_Msk (1UL << PMU_OVSCLR_CYCCNT_STATUS_Pos) /*!< PMU OVSCLR: Cycle Counter Overflow Clear Mask */ + +/** \brief PMU Software Increment Counter */ + +#define PMU_SWINC_CNT0_Pos 0U /*!< PMU SWINC: Event Counter 0 Software Increment Position */ +#define PMU_SWINC_CNT0_Msk (1UL /*<< PMU_SWINC_CNT0_Pos */) /*!< PMU SWINC: Event Counter 0 Software Increment Mask */ + +#define PMU_SWINC_CNT1_Pos 1U /*!< PMU SWINC: Event Counter 1 Software Increment Position */ +#define PMU_SWINC_CNT1_Msk (1UL << PMU_SWINC_CNT1_Pos) /*!< PMU SWINC: Event Counter 1 Software Increment Mask */ + +#define PMU_SWINC_CNT2_Pos 2U /*!< PMU SWINC: Event Counter 2 Software Increment Position */ +#define PMU_SWINC_CNT2_Msk (1UL << PMU_SWINC_CNT2_Pos) /*!< PMU SWINC: Event Counter 2 Software Increment Mask */ + +#define PMU_SWINC_CNT3_Pos 3U /*!< PMU SWINC: Event Counter 3 Software Increment Position */ +#define PMU_SWINC_CNT3_Msk (1UL << PMU_SWINC_CNT3_Pos) /*!< PMU SWINC: Event Counter 3 Software Increment Mask */ + +#define PMU_SWINC_CNT4_Pos 4U /*!< PMU SWINC: Event Counter 4 Software Increment Position */ +#define PMU_SWINC_CNT4_Msk (1UL << PMU_SWINC_CNT4_Pos) /*!< PMU SWINC: Event Counter 4 Software Increment Mask */ + +#define PMU_SWINC_CNT5_Pos 5U /*!< PMU SWINC: Event Counter 5 Software Increment Position */ +#define PMU_SWINC_CNT5_Msk (1UL << PMU_SWINC_CNT5_Pos) /*!< PMU SWINC: Event Counter 5 Software Increment Mask */ + +#define PMU_SWINC_CNT6_Pos 6U /*!< PMU SWINC: Event Counter 6 Software Increment Position */ +#define PMU_SWINC_CNT6_Msk (1UL << PMU_SWINC_CNT6_Pos) /*!< PMU SWINC: Event Counter 6 Software Increment Mask */ + +#define PMU_SWINC_CNT7_Pos 7U /*!< PMU SWINC: Event Counter 7 Software Increment Position */ +#define PMU_SWINC_CNT7_Msk (1UL << PMU_SWINC_CNT7_Pos) /*!< PMU SWINC: Event Counter 7 Software Increment Mask */ + +#define PMU_SWINC_CNT8_Pos 8U /*!< PMU SWINC: Event Counter 8 Software Increment Position */ +#define PMU_SWINC_CNT8_Msk (1UL << PMU_SWINC_CNT8_Pos) /*!< PMU SWINC: Event Counter 8 Software Increment Mask */ + +#define PMU_SWINC_CNT9_Pos 9U /*!< PMU SWINC: Event Counter 9 Software Increment Position */ +#define PMU_SWINC_CNT9_Msk (1UL << PMU_SWINC_CNT9_Pos) /*!< PMU SWINC: Event Counter 9 Software Increment Mask */ + +#define PMU_SWINC_CNT10_Pos 10U /*!< PMU SWINC: Event Counter 10 Software Increment Position */ +#define PMU_SWINC_CNT10_Msk (1UL << PMU_SWINC_CNT10_Pos) /*!< PMU SWINC: Event Counter 10 Software Increment Mask */ + +#define PMU_SWINC_CNT11_Pos 11U /*!< PMU SWINC: Event Counter 11 Software Increment Position */ +#define PMU_SWINC_CNT11_Msk (1UL << PMU_SWINC_CNT11_Pos) /*!< PMU SWINC: Event Counter 11 Software Increment Mask */ + +#define PMU_SWINC_CNT12_Pos 12U /*!< PMU SWINC: Event Counter 12 Software Increment Position */ +#define PMU_SWINC_CNT12_Msk (1UL << PMU_SWINC_CNT12_Pos) /*!< PMU SWINC: Event Counter 12 Software Increment Mask */ + +#define PMU_SWINC_CNT13_Pos 13U /*!< PMU SWINC: Event Counter 13 Software Increment Position */ +#define PMU_SWINC_CNT13_Msk (1UL << PMU_SWINC_CNT13_Pos) /*!< PMU SWINC: Event Counter 13 Software Increment Mask */ + +#define PMU_SWINC_CNT14_Pos 14U /*!< PMU SWINC: Event Counter 14 Software Increment Position */ +#define PMU_SWINC_CNT14_Msk (1UL << PMU_SWINC_CNT14_Pos) /*!< PMU SWINC: Event Counter 14 Software Increment Mask */ + +#define PMU_SWINC_CNT15_Pos 15U /*!< PMU SWINC: Event Counter 15 Software Increment Position */ +#define PMU_SWINC_CNT15_Msk (1UL << PMU_SWINC_CNT15_Pos) /*!< PMU SWINC: Event Counter 15 Software Increment Mask */ + +#define PMU_SWINC_CNT16_Pos 16U /*!< PMU SWINC: Event Counter 16 Software Increment Position */ +#define PMU_SWINC_CNT16_Msk (1UL << PMU_SWINC_CNT16_Pos) /*!< PMU SWINC: Event Counter 16 Software Increment Mask */ + +#define PMU_SWINC_CNT17_Pos 17U /*!< PMU SWINC: Event Counter 17 Software Increment Position */ +#define PMU_SWINC_CNT17_Msk (1UL << PMU_SWINC_CNT17_Pos) /*!< PMU SWINC: Event Counter 17 Software Increment Mask */ + +#define PMU_SWINC_CNT18_Pos 18U /*!< PMU SWINC: Event Counter 18 Software Increment Position */ +#define PMU_SWINC_CNT18_Msk (1UL << PMU_SWINC_CNT18_Pos) /*!< PMU SWINC: Event Counter 18 Software Increment Mask */ + +#define PMU_SWINC_CNT19_Pos 19U /*!< PMU SWINC: Event Counter 19 Software Increment Position */ +#define PMU_SWINC_CNT19_Msk (1UL << PMU_SWINC_CNT19_Pos) /*!< PMU SWINC: Event Counter 19 Software Increment Mask */ + +#define PMU_SWINC_CNT20_Pos 20U /*!< PMU SWINC: Event Counter 20 Software Increment Position */ +#define PMU_SWINC_CNT20_Msk (1UL << PMU_SWINC_CNT20_Pos) /*!< PMU SWINC: Event Counter 20 Software Increment Mask */ + +#define PMU_SWINC_CNT21_Pos 21U /*!< PMU SWINC: Event Counter 21 Software Increment Position */ +#define PMU_SWINC_CNT21_Msk (1UL << PMU_SWINC_CNT21_Pos) /*!< PMU SWINC: Event Counter 21 Software Increment Mask */ + +#define PMU_SWINC_CNT22_Pos 22U /*!< PMU SWINC: Event Counter 22 Software Increment Position */ +#define PMU_SWINC_CNT22_Msk (1UL << PMU_SWINC_CNT22_Pos) /*!< PMU SWINC: Event Counter 22 Software Increment Mask */ + +#define PMU_SWINC_CNT23_Pos 23U /*!< PMU SWINC: Event Counter 23 Software Increment Position */ +#define PMU_SWINC_CNT23_Msk (1UL << PMU_SWINC_CNT23_Pos) /*!< PMU SWINC: Event Counter 23 Software Increment Mask */ + +#define PMU_SWINC_CNT24_Pos 24U /*!< PMU SWINC: Event Counter 24 Software Increment Position */ +#define PMU_SWINC_CNT24_Msk (1UL << PMU_SWINC_CNT24_Pos) /*!< PMU SWINC: Event Counter 24 Software Increment Mask */ + +#define PMU_SWINC_CNT25_Pos 25U /*!< PMU SWINC: Event Counter 25 Software Increment Position */ +#define PMU_SWINC_CNT25_Msk (1UL << PMU_SWINC_CNT25_Pos) /*!< PMU SWINC: Event Counter 25 Software Increment Mask */ + +#define PMU_SWINC_CNT26_Pos 26U /*!< PMU SWINC: Event Counter 26 Software Increment Position */ +#define PMU_SWINC_CNT26_Msk (1UL << PMU_SWINC_CNT26_Pos) /*!< PMU SWINC: Event Counter 26 Software Increment Mask */ + +#define PMU_SWINC_CNT27_Pos 27U /*!< PMU SWINC: Event Counter 27 Software Increment Position */ +#define PMU_SWINC_CNT27_Msk (1UL << PMU_SWINC_CNT27_Pos) /*!< PMU SWINC: Event Counter 27 Software Increment Mask */ + +#define PMU_SWINC_CNT28_Pos 28U /*!< PMU SWINC: Event Counter 28 Software Increment Position */ +#define PMU_SWINC_CNT28_Msk (1UL << PMU_SWINC_CNT28_Pos) /*!< PMU SWINC: Event Counter 28 Software Increment Mask */ + +#define PMU_SWINC_CNT29_Pos 29U /*!< PMU SWINC: Event Counter 29 Software Increment Position */ +#define PMU_SWINC_CNT29_Msk (1UL << PMU_SWINC_CNT29_Pos) /*!< PMU SWINC: Event Counter 29 Software Increment Mask */ + +#define PMU_SWINC_CNT30_Pos 30U /*!< PMU SWINC: Event Counter 30 Software Increment Position */ +#define PMU_SWINC_CNT30_Msk (1UL << PMU_SWINC_CNT30_Pos) /*!< PMU SWINC: Event Counter 30 Software Increment Mask */ + +/** \brief PMU Control Register Definitions */ + +#define PMU_CTRL_ENABLE_Pos 0U /*!< PMU CTRL: ENABLE Position */ +#define PMU_CTRL_ENABLE_Msk (1UL /*<< PMU_CTRL_ENABLE_Pos*/) /*!< PMU CTRL: ENABLE Mask */ + +#define PMU_CTRL_EVENTCNT_RESET_Pos 1U /*!< PMU CTRL: Event Counter Reset Position */ +#define PMU_CTRL_EVENTCNT_RESET_Msk (1UL << PMU_CTRL_EVENTCNT_RESET_Pos) /*!< PMU CTRL: Event Counter Reset Mask */ + +#define PMU_CTRL_CYCCNT_RESET_Pos 2U /*!< PMU CTRL: Cycle Counter Reset Position */ +#define PMU_CTRL_CYCCNT_RESET_Msk (1UL << PMU_CTRL_CYCCNT_RESET_Pos) /*!< PMU CTRL: Cycle Counter Reset Mask */ + +#define PMU_CTRL_CYCCNT_DISABLE_Pos 5U /*!< PMU CTRL: Disable Cycle Counter Position */ +#define PMU_CTRL_CYCCNT_DISABLE_Msk (1UL << PMU_CTRL_CYCCNT_DISABLE_Pos) /*!< PMU CTRL: Disable Cycle Counter Mask */ + +#define PMU_CTRL_FRZ_ON_OV_Pos 9U /*!< PMU CTRL: Freeze-on-overflow Position */ +#define PMU_CTRL_FRZ_ON_OV_Msk (1UL << PMU_CTRL_FRZ_ON_OVERFLOW_Pos) /*!< PMU CTRL: Freeze-on-overflow Mask */ + +#define PMU_CTRL_TRACE_ON_OV_Pos 11U /*!< PMU CTRL: Trace-on-overflow Position */ +#define PMU_CTRL_TRACE_ON_OV_Msk (1UL << PMU_CTRL_TRACE_ON_OVERFLOW_Pos) /*!< PMU CTRL: Trace-on-overflow Mask */ + +/** \brief PMU Type Register Definitions */ + +#define PMU_TYPE_NUM_CNTS_Pos 0U /*!< PMU TYPE: Number of Counters Position */ +#define PMU_TYPE_NUM_CNTS_Msk (0xFFUL /*<< PMU_TYPE_NUM_CNTS_Pos*/) /*!< PMU TYPE: Number of Counters Mask */ + +#define PMU_TYPE_SIZE_CNTS_Pos 8U /*!< PMU TYPE: Size of Counters Position */ +#define PMU_TYPE_SIZE_CNTS_Msk (0x3FUL << PMU_TYPE_SIZE_CNTS_Pos) /*!< PMU TYPE: Size of Counters Mask */ + +#define PMU_TYPE_CYCCNT_PRESENT_Pos 14U /*!< PMU TYPE: Cycle Counter Present Position */ +#define PMU_TYPE_CYCCNT_PRESENT_Msk (1UL << PMU_TYPE_CYCCNT_PRESENT_Pos) /*!< PMU TYPE: Cycle Counter Present Mask */ + +#define PMU_TYPE_FRZ_OV_SUPPORT_Pos 21U /*!< PMU TYPE: Freeze-on-overflow Support Position */ +#define PMU_TYPE_FRZ_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Freeze-on-overflow Support Mask */ + +#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Pos 23U /*!< PMU TYPE: Trace-on-overflow Support Position */ +#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Trace-on-overflow Support Mask */ + +/** \brief PMU Authentication Status Register Definitions */ + +#define PMU_AUTHSTATUS_NSID_Pos 0U /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Position */ +#define PMU_AUTHSTATUS_NSID_Msk (0x3UL /*<< PMU_AUTHSTATUS_NSID_Pos*/) /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Mask */ + +#define PMU_AUTHSTATUS_NSNID_Pos 2U /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Position */ +#define PMU_AUTHSTATUS_NSNID_Msk (0x3UL << PMU_AUTHSTATUS_NSNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Mask */ + +#define PMU_AUTHSTATUS_SID_Pos 4U /*!< PMU AUTHSTATUS: Secure Invasive Debug Position */ +#define PMU_AUTHSTATUS_SID_Msk (0x3UL << PMU_AUTHSTATUS_SID_Pos) /*!< PMU AUTHSTATUS: Secure Invasive Debug Mask */ + +#define PMU_AUTHSTATUS_SNID_Pos 6U /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Position */ +#define PMU_AUTHSTATUS_SNID_Msk (0x3UL << PMU_AUTHSTATUS_SNID_Pos) /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Mask */ + +#define PMU_AUTHSTATUS_NSUID_Pos 16U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Position */ +#define PMU_AUTHSTATUS_NSUID_Msk (0x3UL << PMU_AUTHSTATUS_NSUID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Mask */ + +#define PMU_AUTHSTATUS_NSUNID_Pos 18U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Position */ +#define PMU_AUTHSTATUS_NSUNID_Msk (0x3UL << PMU_AUTHSTATUS_NSUNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Mask */ + +#define PMU_AUTHSTATUS_SUID_Pos 20U /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Position */ +#define PMU_AUTHSTATUS_SUID_Msk (0x3UL << PMU_AUTHSTATUS_SUID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Mask */ + +#define PMU_AUTHSTATUS_SUNID_Pos 22U /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Position */ +#define PMU_AUTHSTATUS_SUNID_Msk (0x3UL << PMU_AUTHSTATUS_SUNID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Mask */ + + +/*@} end of group CMSIS_PMU */ +#endif + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_PXN_Pos 4U /*!< MPU RLAR: PXN Position */ +#define MPU_RLAR_PXN_Msk (1UL << MPU_RLAR_PXN_Pos) /*!< MPU RLAR: PXN Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +#define FPU_FPDSCR_FZ16_Pos 19U /*!< FPDSCR: FZ16 bit Position */ +#define FPU_FPDSCR_FZ16_Msk (1UL << FPU_FPDSCR_FZ16_Pos) /*!< FPDSCR: FZ16 bit Mask */ + +#define FPU_FPDSCR_LTPSIZE_Pos 16U /*!< FPDSCR: LTPSIZE bit Position */ +#define FPU_FPDSCR_LTPSIZE_Msk (7UL << FPU_FPDSCR_LTPSIZE_Pos) /*!< FPDSCR: LTPSIZE bit Mask */ + +/* Media and VFP Feature Register 0 Definitions */ +#define FPU_MVFR0_FPRound_Pos 28U /*!< MVFR0: FPRound bits Position */ +#define FPU_MVFR0_FPRound_Msk (0xFUL << FPU_MVFR0_FPRound_Pos) /*!< MVFR0: FPRound bits Mask */ + +#define FPU_MVFR0_FPSqrt_Pos 20U /*!< MVFR0: FPSqrt bits Position */ +#define FPU_MVFR0_FPSqrt_Msk (0xFUL << FPU_MVFR0_FPSqrt_Pos) /*!< MVFR0: FPSqrt bits Mask */ + +#define FPU_MVFR0_FPDivide_Pos 16U /*!< MVFR0: FPDivide bits Position */ +#define FPU_MVFR0_FPDivide_Msk (0xFUL << FPU_MVFR0_FPDivide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FPDP_Pos 8U /*!< MVFR0: FPDP bits Position */ +#define FPU_MVFR0_FPDP_Msk (0xFUL << FPU_MVFR0_FPDP_Pos) /*!< MVFR0: FPDP bits Mask */ + +#define FPU_MVFR0_FPSP_Pos 4U /*!< MVFR0: FPSP bits Position */ +#define FPU_MVFR0_FPSP_Msk (0xFUL << FPU_MVFR0_FPSP_Pos) /*!< MVFR0: FPSP bits Mask */ + +#define FPU_MVFR0_SIMDReg_Pos 0U /*!< MVFR0: SIMDReg bits Position */ +#define FPU_MVFR0_SIMDReg_Msk (0xFUL /*<< FPU_MVFR0_SIMDReg_Pos*/) /*!< MVFR0: SIMDReg bits Mask */ + +/* Media and VFP Feature Register 1 Definitions */ +#define FPU_MVFR1_FMAC_Pos 28U /*!< MVFR1: FMAC bits Position */ +#define FPU_MVFR1_FMAC_Msk (0xFUL << FPU_MVFR1_FMAC_Pos) /*!< MVFR1: FMAC bits Mask */ + +#define FPU_MVFR1_FPHP_Pos 24U /*!< MVFR1: FPHP bits Position */ +#define FPU_MVFR1_FPHP_Msk (0xFUL << FPU_MVFR1_FPHP_Pos) /*!< MVFR1: FPHP bits Mask */ + +#define FPU_MVFR1_FP16_Pos 20U /*!< MVFR1: FP16 bits Position */ +#define FPU_MVFR1_FP16_Msk (0xFUL << FPU_MVFR1_FP16_Pos) /*!< MVFR1: FP16 bits Mask */ + +#define FPU_MVFR1_MVE_Pos 8U /*!< MVFR1: MVE bits Position */ +#define FPU_MVFR1_MVE_Msk (0xFUL << FPU_MVFR1_MVE_Pos) /*!< MVFR1: MVE bits Mask */ + +#define FPU_MVFR1_FPDNaN_Pos 4U /*!< MVFR1: FPDNaN bits Position */ +#define FPU_MVFR1_FPDNaN_Msk (0xFUL << FPU_MVFR1_FPDNaN_Pos) /*!< MVFR1: FPDNaN bits Mask */ + +#define FPU_MVFR1_FPFtZ_Pos 0U /*!< MVFR1: FPFtZ bits Position */ +#define FPU_MVFR1_FPFtZ_Msk (0xFUL /*<< FPU_MVFR1_FPFtZ_Pos*/) /*!< MVFR1: FPFtZ bits Mask */ + +/* Media and VFP Feature Register 2 Definitions */ +#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ +#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ + +/*@} end of group CMSIS_FPU */ + +/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_FPD_Pos 23U /*!< \deprecated CoreDebug DHCSR: S_FPD Position */ +#define CoreDebug_DHCSR_S_FPD_Msk (1UL << CoreDebug_DHCSR_S_FPD_Pos) /*!< \deprecated CoreDebug DHCSR: S_FPD Mask */ + +#define CoreDebug_DHCSR_S_SUIDE_Pos 22U /*!< \deprecated CoreDebug DHCSR: S_SUIDE Position */ +#define CoreDebug_DHCSR_S_SUIDE_Msk (1UL << CoreDebug_DHCSR_S_SUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SUIDE Mask */ + +#define CoreDebug_DHCSR_S_NSUIDE_Pos 21U /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Position */ +#define CoreDebug_DHCSR_S_NSUIDE_Msk (1UL << CoreDebug_DHCSR_S_NSUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Mask */ + +#define CoreDebug_DHCSR_S_SDE_Pos 20U /*!< \deprecated CoreDebug DHCSR: S_SDE Position */ +#define CoreDebug_DHCSR_S_SDE_Msk (1UL << CoreDebug_DHCSR_S_SDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SDE Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_PMOV_Pos 6U /*!< \deprecated CoreDebug DHCSR: C_PMOV Position */ +#define CoreDebug_DHCSR_C_PMOV_Msk (1UL << CoreDebug_DHCSR_C_PMOV_Pos) /*!< \deprecated CoreDebug DHCSR: C_PMOV Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Set Clear Exception and Monitor Control Register Definitions */ +#define CoreDebug_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Position */ +#define CoreDebug_DSCEMCR_CLR_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Mask */ + +#define CoreDebug_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Position */ +#define CoreDebug_DSCEMCR_CLR_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Mask */ + +#define CoreDebug_DSCEMCR_SET_MON_REQ_Pos 3U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Position */ +#define CoreDebug_DSCEMCR_SET_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Mask */ + +#define CoreDebug_DSCEMCR_SET_MON_PEND_Pos 1U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Position */ +#define CoreDebug_DSCEMCR_SET_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_UIDEN_Pos 10U /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Position */ +#define CoreDebug_DAUTHCTRL_UIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_UIDAPEN_Pos 9U /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Position */ +#define CoreDebug_DAUTHCTRL_UIDAPEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDAPEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Mask */ + +#define CoreDebug_DAUTHCTRL_FSDMA_Pos 8U /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Position */ +#define CoreDebug_DAUTHCTRL_FSDMA_Msk (1UL << CoreDebug_DAUTHCTRL_FSDMA_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DCB Debug Control Block + \brief Type definitions for the Debug Control Block Registers + @{ + */ + +/** + \brief Structure type to access the Debug Control Block Registers (DCB). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} DCB_Type; + +/* DHCSR, Debug Halting Control and Status Register Definitions */ +#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ +#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ + +#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ +#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ + +#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ +#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ + +#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ +#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ + +#define DCB_DHCSR_S_FPD_Pos 23U /*!< DCB DHCSR: Floating-point registers Debuggable Position */ +#define DCB_DHCSR_S_FPD_Msk (0x1UL << DCB_DHCSR_S_FPD_Pos) /*!< DCB DHCSR: Floating-point registers Debuggable Mask */ + +#define DCB_DHCSR_S_SUIDE_Pos 22U /*!< DCB DHCSR: Secure unprivileged halting debug enabled Position */ +#define DCB_DHCSR_S_SUIDE_Msk (0x1UL << DCB_DHCSR_S_SUIDE_Pos) /*!< DCB DHCSR: Secure unprivileged halting debug enabled Mask */ + +#define DCB_DHCSR_S_NSUIDE_Pos 21U /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Position */ +#define DCB_DHCSR_S_NSUIDE_Msk (0x1UL << DCB_DHCSR_S_NSUIDE_Pos) /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Mask */ + +#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ +#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ + +#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ +#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ + +#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ +#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ + +#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ +#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ + +#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ +#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ + +#define DCB_DHCSR_C_PMOV_Pos 6U /*!< DCB DHCSR: Halt on PMU overflow control Position */ +#define DCB_DHCSR_C_PMOV_Msk (0x1UL << DCB_DHCSR_C_PMOV_Pos) /*!< DCB DHCSR: Halt on PMU overflow control Mask */ + +#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ +#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ + +#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ +#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ + +#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ +#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ + +#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ +#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ + +#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ +#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ + +/* DCRSR, Debug Core Register Select Register Definitions */ +#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ +#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ + +#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ +#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ + +/* DCRDR, Debug Core Register Data Register Definitions */ +#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ +#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ + +/* DEMCR, Debug Exception and Monitor Control Register Definitions */ +#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ +#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ + +#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ +#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ + +#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ +#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ + +#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ +#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ + +#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ +#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ + +#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ +#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ + +#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ +#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ + +#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ +#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ + +#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ +#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ + +#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ +#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ + +#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ +#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ + +#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ +#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ + +#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ +#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ + +#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ +#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ + +#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ +#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ + +#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ +#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ + +#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ +#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ + +/* DSCEMCR, Debug Set Clear Exception and Monitor Control Register Definitions */ +#define DCB_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< DCB DSCEMCR: Clear monitor request Position */ +#define DCB_DSCEMCR_CLR_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_REQ_Pos) /*!< DCB DSCEMCR: Clear monitor request Mask */ + +#define DCB_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< DCB DSCEMCR: Clear monitor pend Position */ +#define DCB_DSCEMCR_CLR_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_PEND_Pos) /*!< DCB DSCEMCR: Clear monitor pend Mask */ + +#define DCB_DSCEMCR_SET_MON_REQ_Pos 3U /*!< DCB DSCEMCR: Set monitor request Position */ +#define DCB_DSCEMCR_SET_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_SET_MON_REQ_Pos) /*!< DCB DSCEMCR: Set monitor request Mask */ + +#define DCB_DSCEMCR_SET_MON_PEND_Pos 1U /*!< DCB DSCEMCR: Set monitor pend Position */ +#define DCB_DSCEMCR_SET_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_SET_MON_PEND_Pos) /*!< DCB DSCEMCR: Set monitor pend Mask */ + +/* DAUTHCTRL, Debug Authentication Control Register Definitions */ +#define DCB_DAUTHCTRL_UIDEN_Pos 10U /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Position */ +#define DCB_DAUTHCTRL_UIDEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Mask */ + +#define DCB_DAUTHCTRL_UIDAPEN_Pos 9U /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Position */ +#define DCB_DAUTHCTRL_UIDAPEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDAPEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Mask */ + +#define DCB_DAUTHCTRL_FSDMA_Pos 8U /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Position */ +#define DCB_DAUTHCTRL_FSDMA_Msk (0x1UL << DCB_DAUTHCTRL_FSDMA_Pos) /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Mask */ + +#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ +#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ + +#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ +#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ + +#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ +#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ + +#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ +#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ + +/* DSCSR, Debug Security Control and Status Register Definitions */ +#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ +#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ + +#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ +#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ + +#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ +#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ + +#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ +#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ + +/*@} end of group CMSIS_DCB */ + + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DIB Debug Identification Block + \brief Type definitions for the Debug Identification Block Registers + @{ + */ + +/** + \brief Structure type to access the Debug Identification Block Registers (DIB). + */ +typedef struct +{ + __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ + __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ + __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ + __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ + __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ +} DIB_Type; + +/* DLAR, SCS Software Lock Access Register Definitions */ +#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ +#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ + +/* DLSR, SCS Software Lock Status Register Definitions */ +#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ +#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ + +#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ +#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ + +#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ +#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ + +/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ +#define DIB_DAUTHSTATUS_SUNID_Pos 22U /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Position */ +#define DIB_DAUTHSTATUS_SUNID_Msk (0x3UL << DIB_DAUTHSTATUS_SUNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Mask */ + +#define DIB_DAUTHSTATUS_SUID_Pos 20U /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Position */ +#define DIB_DAUTHSTATUS_SUID_Msk (0x3UL << DIB_DAUTHSTATUS_SUID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Mask */ + +#define DIB_DAUTHSTATUS_NSUNID_Pos 18U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Position */ +#define DIB_DAUTHSTATUS_NSUNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Mask */ + +#define DIB_DAUTHSTATUS_NSUID_Pos 16U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Position */ +#define DIB_DAUTHSTATUS_NSUID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Mask */ + +#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ +#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ +#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ +#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ +#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ + +/* DDEVARCH, SCS Device Architecture Register Definitions */ +#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ +#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ + +#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ +#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ + +#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ +#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ + +#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ +#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ + +#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ +#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ + +/* DDEVTYPE, SCS Device Type Register Definitions */ +#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ +#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ + +#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ +#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ + + +/*@} end of group CMSIS_DIB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define MEMSYSCTL_BASE (0xE001E000UL) /*!< Memory System Control Base Address */ + #define ERRBNK_BASE (0xE001E100UL) /*!< Error Banking Base Address */ + #define PWRMODCTL_BASE (0xE001E300UL) /*!< Power Mode Control Base Address */ + #define EWIC_BASE (0xE001E400UL) /*!< External Wakeup Interrupt Controller Base Address */ + #define PRCCFGINF_BASE (0xE001E700UL) /*!< Processor Configuration Information Base Address */ + #define STL_BASE (0xE001E800UL) /*!< Software Test Library Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ + #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ + #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + #define ICB ((ICB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define MEMSYSCTL ((MemSysCtl_Type *) MEMSYSCTL_BASE ) /*!< Memory System Control configuration struct */ + #define ERRBNK ((ErrBnk_Type *) ERRBNK_BASE ) /*!< Error Banking configuration struct */ + #define PWRMODCTL ((PwrModCtl_Type *) PWRMODCTL_BASE ) /*!< Power Mode Control configuration struct */ + #define EWIC ((EWIC_Type *) EWIC_BASE ) /*!< EWIC configuration struct */ + #define PRCCFGINF ((PrcCfgInf_Type *) PRCCFGINF_BASE ) /*!< Processor Configuration Information configuration struct */ + #define STL ((STL_Type *) STL_BASE ) /*!< Software Test Library configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ + #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ + #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) + #define PMU_BASE (0xE0003000UL) /*!< PMU Base Address */ + #define PMU ((PMU_Type *) PMU_BASE ) /*!< PMU configuration struct */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ + #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ + #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define ICB_NS ((ICB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ + #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ + #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_register_aliases Backwards Compatibility Aliases + \brief Register alias definitions for backwards compatibility. + @{ + */ +#define ID_ADR (ID_AFR) /*!< SCB Auxiliary Feature Register */ + +/* 'SCnSCB' is deprecated and replaced by 'ICB' */ +typedef ICB_Type SCnSCB_Type; + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISCRITAXIRUW_Pos (ICB_ACTLR_DISCRITAXIRUW_Pos) +#define SCnSCB_ACTLR_DISCRITAXIRUW_Msk (ICB_ACTLR_DISCRITAXIRUW_Msk) + +#define SCnSCB_ACTLR_DISDI_Pos (ICB_ACTLR_DISDI_Pos) +#define SCnSCB_ACTLR_DISDI_Msk (ICB_ACTLR_DISDI_Msk) + +#define SCnSCB_ACTLR_DISCRITAXIRUR_Pos (ICB_ACTLR_DISCRITAXIRUR_Pos) +#define SCnSCB_ACTLR_DISCRITAXIRUR_Msk (ICB_ACTLR_DISCRITAXIRUR_Msk) + +#define SCnSCB_ACTLR_EVENTBUSEN_Pos (ICB_ACTLR_EVENTBUSEN_Pos) +#define SCnSCB_ACTLR_EVENTBUSEN_Msk (ICB_ACTLR_EVENTBUSEN_Msk) + +#define SCnSCB_ACTLR_EVENTBUSEN_S_Pos (ICB_ACTLR_EVENTBUSEN_S_Pos) +#define SCnSCB_ACTLR_EVENTBUSEN_S_Msk (ICB_ACTLR_EVENTBUSEN_S_Msk) + +#define SCnSCB_ACTLR_DISITMATBFLUSH_Pos (ICB_ACTLR_DISITMATBFLUSH_Pos) +#define SCnSCB_ACTLR_DISITMATBFLUSH_Msk (ICB_ACTLR_DISITMATBFLUSH_Msk) + +#define SCnSCB_ACTLR_DISNWAMODE_Pos (ICB_ACTLR_DISNWAMODE_Pos) +#define SCnSCB_ACTLR_DISNWAMODE_Msk (ICB_ACTLR_DISNWAMODE_Msk) + +#define SCnSCB_ACTLR_FPEXCODIS_Pos (ICB_ACTLR_FPEXCODIS_Pos) +#define SCnSCB_ACTLR_FPEXCODIS_Msk (ICB_ACTLR_FPEXCODIS_Msk) + +#define SCnSCB_ACTLR_DISOLAP_Pos (ICB_ACTLR_DISOLAP_Pos) +#define SCnSCB_ACTLR_DISOLAP_Msk (ICB_ACTLR_DISOLAP_Msk) + +#define SCnSCB_ACTLR_DISOLAPS_Pos (ICB_ACTLR_DISOLAPS_Pos) +#define SCnSCB_ACTLR_DISOLAPS_Msk (ICB_ACTLR_DISOLAPS_Msk) + +#define SCnSCB_ACTLR_DISLOBR_Pos (ICB_ACTLR_DISLOBR_Pos) +#define SCnSCB_ACTLR_DISLOBR_Msk (ICB_ACTLR_DISLOBR_Msk) + +#define SCnSCB_ACTLR_DISLO_Pos (ICB_ACTLR_DISLO_Pos) +#define SCnSCB_ACTLR_DISLO_Msk (ICB_ACTLR_DISLO_Msk) + +#define SCnSCB_ACTLR_DISLOLEP_Pos (ICB_ACTLR_DISLOLEP_Pos) +#define SCnSCB_ACTLR_DISLOLEP_Msk (ICB_ACTLR_DISLOLEP_Msk) + +#define SCnSCB_ACTLR_DISFOLD_Pos (ICB_ACTLR_DISFOLD_Pos) +#define SCnSCB_ACTLR_DISFOLD_Msk (ICB_ACTLR_DISFOLD_Msk) + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos (ICB_ICTR_INTLINESNUM_Pos) +#define SCnSCB_ICTR_INTLINESNUM_Msk (ICB_ICTR_INTLINESNUM_Msk) + +#define SCnSCB (ICB) +#define SCnSCB_NS (ICB_NS) + +/*@} */ + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## PMU functions and events #################################### */ + +#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) + +#include "pmu_armv8.h" + +/** + \brief Cortex-M55 PMU events + \note Architectural PMU events can be found in pmu_armv8.h +*/ + +#define ARMCM55_PMU_ECC_ERR 0xC000 /*!< Any ECC error */ +#define ARMCM55_PMU_ECC_ERR_FATAL 0xC001 /*!< Any fatal ECC error */ +#define ARMCM55_PMU_ECC_ERR_DCACHE 0xC010 /*!< Any ECC error in the data cache */ +#define ARMCM55_PMU_ECC_ERR_ICACHE 0xC011 /*!< Any ECC error in the instruction cache */ +#define ARMCM55_PMU_ECC_ERR_FATAL_DCACHE 0xC012 /*!< Any fatal ECC error in the data cache */ +#define ARMCM55_PMU_ECC_ERR_FATAL_ICACHE 0xC013 /*!< Any fatal ECC error in the instruction cache*/ +#define ARMCM55_PMU_ECC_ERR_DTCM 0xC020 /*!< Any ECC error in the DTCM */ +#define ARMCM55_PMU_ECC_ERR_ITCM 0xC021 /*!< Any ECC error in the ITCM */ +#define ARMCM55_PMU_ECC_ERR_FATAL_DTCM 0xC022 /*!< Any fatal ECC error in the DTCM */ +#define ARMCM55_PMU_ECC_ERR_FATAL_ITCM 0xC023 /*!< Any fatal ECC error in the ITCM */ +#define ARMCM55_PMU_PF_LINEFILL 0xC100 /*!< A prefetcher starts a line-fill */ +#define ARMCM55_PMU_PF_CANCEL 0xC101 /*!< A prefetcher stops prefetching */ +#define ARMCM55_PMU_PF_DROP_LINEFILL 0xC102 /*!< A linefill triggered by a prefetcher has been dropped because of lack of buffering */ +#define ARMCM55_PMU_NWAMODE_ENTER 0xC200 /*!< No write-allocate mode entry */ +#define ARMCM55_PMU_NWAMODE 0xC201 /*!< Write-allocate store is not allocated into the data cache due to no-write-allocate mode */ +#define ARMCM55_PMU_SAHB_ACCESS 0xC300 /*!< Read or write access on the S-AHB interface to the TCM */ +#define ARMCM55_PMU_PAHB_ACCESS 0xC301 /*!< Read or write access to the P-AHB write interface */ +#define ARMCM55_PMU_AXI_WRITE_ACCESS 0xC302 /*!< Any beat access to M-AXI write interface */ +#define ARMCM55_PMU_AXI_READ_ACCESS 0xC303 /*!< Any beat access to M-AXI read interface */ +#define ARMCM55_PMU_DOSTIMEOUT_DOUBLE 0xC400 /*!< Denial of Service timeout has fired twice and caused buffers to drain to allow forward progress */ +#define ARMCM55_PMU_DOSTIMEOUT_TRIPLE 0xC401 /*!< Denial of Service timeout has fired three times and blocked the LSU to force forward progress */ + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + +/* ########################## MVE functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_MveFunctions MVE Functions + \brief Function that provides MVE type. + @{ + */ + +/** + \brief get MVE type + \details returns the MVE type + \returns + - \b 0: No Vector Extension (MVE) + - \b 1: Integer Vector Extension (MVE-I) + - \b 2: Floating-point Vector Extension (MVE-F) + */ +__STATIC_INLINE uint32_t SCB_GetMVEType(void) +{ + const uint32_t mvfr1 = FPU->MVFR1; + if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x2U << FPU_MVFR1_MVE_Pos)) + { + return 2U; + } + else if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x1U << FPU_MVFR1_MVE_Pos)) + { + return 1U; + } + else + { + return 0U; + } +} + + +/*@} end of CMSIS_Core_MveFunctions */ + + +/* ########################## Cache functions #################################### */ + +#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ + (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) +#include "cachel1_armv7.h" +#endif + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## Debug Control function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_DCBFunctions Debug Control Functions + \brief Functions that access the Debug Control Block. + @{ + */ + + +/** + \brief Set Debug Authentication Control Register + \details writes to Debug Authentication Control register. + \param [in] value value to be writen. + */ +__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) +{ + __DSB(); + __ISB(); + DCB->DAUTHCTRL = value; + __DSB(); + __ISB(); +} + + +/** + \brief Get Debug Authentication Control Register + \details Reads Debug Authentication Control register. + \return Debug Authentication Control Register. + */ +__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) +{ + return (DCB->DAUTHCTRL); +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Debug Authentication Control Register (non-secure) + \details writes to non-secure Debug Authentication Control register when in secure state. + \param [in] value value to be writen + */ +__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) +{ + __DSB(); + __ISB(); + DCB_NS->DAUTHCTRL = value; + __DSB(); + __ISB(); +} + + +/** + \brief Get Debug Authentication Control Register (non-secure) + \details Reads non-secure Debug Authentication Control register when in secure state. + \return Debug Authentication Control Register. + */ +__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) +{ + return (DCB_NS->DAUTHCTRL); +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_DCBFunctions */ + + + + +/* ################################## Debug Identification function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions + \brief Functions that access the Debug Identification Block. + @{ + */ + + +/** + \brief Get Debug Authentication Status Register + \details Reads Debug Authentication Status register. + \return Debug Authentication Status Register. + */ +__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) +{ + return (DIB->DAUTHSTATUS); +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Debug Authentication Status Register (non-secure) + \details Reads non-secure Debug Authentication Status register when in secure state. + \return Debug Authentication Status Register. + */ +__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) +{ + return (DIB_NS->DAUTHSTATUS); +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_DCBFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM55_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Include/core_cm7.h b/Drivers/CMSIS/Include/core_cm7.h new file mode 100644 index 0000000..010506e --- /dev/null +++ b/Drivers/CMSIS/Include/core_cm7.h @@ -0,0 +1,2366 @@ +/**************************************************************************//** + * @file core_cm7.h + * @brief CMSIS Cortex-M7 Core Peripheral Access Layer Header File + * @version V5.1.6 + * @date 04. June 2021 + ******************************************************************************/ +/* + * Copyright (c) 2009-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM7_H_GENERIC +#define __CORE_CM7_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M7 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM7 definitions */ +#define __CM7_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM7_CMSIS_VERSION_SUB ( __CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM7_CMSIS_VERSION ((__CM7_CMSIS_VERSION_MAIN << 16U) | \ + __CM7_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (7U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM7_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM7_H_DEPENDANT +#define __CORE_CM7_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM7_REV + #define __CM7_REV 0x0000U + #warning "__CM7_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __ICACHE_PRESENT + #define __ICACHE_PRESENT 0U + #warning "__ICACHE_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DCACHE_PRESENT + #define __DCACHE_PRESENT 0U + #warning "__DCACHE_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DTCM_PRESENT + #define __DTCM_PRESENT 0U + #warning "__DTCM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 1U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M7 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RESERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[1U]; + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + uint32_t RESERVED3[93U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ + uint32_t RESERVED7[5U]; + __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ + __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ + __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ + __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ + uint32_t RESERVED8[1U]; + __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: Branch prediction enable bit Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: Branch prediction enable bit Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: Instruction cache enable bit Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: Instruction cache enable bit Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: Cache enable bit Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: Cache enable bit Mask */ + +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/* Instruction Tightly-Coupled Memory Control Register Definitions */ +#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ +#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ + +#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ +#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ + +#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ +#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ + +#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ +#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ + +/* Data Tightly-Coupled Memory Control Register Definitions */ +#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ +#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ + +#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ +#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ + +#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ +#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ + +#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ +#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ + +/* AHBP Control Register Definitions */ +#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ +#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ + +#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ +#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ + +/* L1 Cache Control Register Definitions */ +#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ +#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ + +#define SCB_CACR_ECCEN_Pos 1U /*!< \deprecated SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< \deprecated SCB CACR: ECCEN Mask */ + +#define SCB_CACR_ECCDIS_Pos 1U /*!< SCB CACR: ECCDIS Position */ +#define SCB_CACR_ECCDIS_Msk (1UL << SCB_CACR_ECCDIS_Pos) /*!< SCB CACR: ECCDIS Mask */ + +#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ +#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ + +/* AHBS Control Register Definitions */ +#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ +#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBSCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ + +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBSCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ + +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBSCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ + +/* Auxiliary Bus Fault Status Register Definitions */ +#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ +#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ + +#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ +#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ + +#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ +#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ + +#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ +#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ + +#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ +#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ + +#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ +#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISDYNADD_Pos 26U /*!< ACTLR: DISDYNADD Position */ +#define SCnSCB_ACTLR_DISDYNADD_Msk (1UL << SCnSCB_ACTLR_DISDYNADD_Pos) /*!< ACTLR: DISDYNADD Mask */ + +#define SCnSCB_ACTLR_DISISSCH1_Pos 21U /*!< ACTLR: DISISSCH1 Position */ +#define SCnSCB_ACTLR_DISISSCH1_Msk (0x1FUL << SCnSCB_ACTLR_DISISSCH1_Pos) /*!< ACTLR: DISISSCH1 Mask */ + +#define SCnSCB_ACTLR_DISDI_Pos 16U /*!< ACTLR: DISDI Position */ +#define SCnSCB_ACTLR_DISDI_Msk (0x1FUL << SCnSCB_ACTLR_DISDI_Pos) /*!< ACTLR: DISDI Mask */ + +#define SCnSCB_ACTLR_DISCRITAXIRUR_Pos 15U /*!< ACTLR: DISCRITAXIRUR Position */ +#define SCnSCB_ACTLR_DISCRITAXIRUR_Msk (1UL << SCnSCB_ACTLR_DISCRITAXIRUR_Pos) /*!< ACTLR: DISCRITAXIRUR Mask */ + +#define SCnSCB_ACTLR_DISBTACALLOC_Pos 14U /*!< ACTLR: DISBTACALLOC Position */ +#define SCnSCB_ACTLR_DISBTACALLOC_Msk (1UL << SCnSCB_ACTLR_DISBTACALLOC_Pos) /*!< ACTLR: DISBTACALLOC Mask */ + +#define SCnSCB_ACTLR_DISBTACREAD_Pos 13U /*!< ACTLR: DISBTACREAD Position */ +#define SCnSCB_ACTLR_DISBTACREAD_Msk (1UL << SCnSCB_ACTLR_DISBTACREAD_Pos) /*!< ACTLR: DISBTACREAD Mask */ + +#define SCnSCB_ACTLR_DISITMATBFLUSH_Pos 12U /*!< ACTLR: DISITMATBFLUSH Position */ +#define SCnSCB_ACTLR_DISITMATBFLUSH_Msk (1UL << SCnSCB_ACTLR_DISITMATBFLUSH_Pos) /*!< ACTLR: DISITMATBFLUSH Mask */ + +#define SCnSCB_ACTLR_DISRAMODE_Pos 11U /*!< ACTLR: DISRAMODE Position */ +#define SCnSCB_ACTLR_DISRAMODE_Msk (1UL << SCnSCB_ACTLR_DISRAMODE_Pos) /*!< ACTLR: DISRAMODE Mask */ + +#define SCnSCB_ACTLR_FPEXCODIS_Pos 10U /*!< ACTLR: FPEXCODIS Position */ +#define SCnSCB_ACTLR_FPEXCODIS_Msk (1UL << SCnSCB_ACTLR_FPEXCODIS_Pos) /*!< ACTLR: FPEXCODIS Mask */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[32U]; + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED3[981U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( W) Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ +#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ + +#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ +#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ +#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ + +#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ +#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and FP Feature Register 2 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/* Media and FP Feature Register 2 Definitions */ + +#define FPU_MVFR2_VFP_Misc_Pos 4U /*!< MVFR2: VFP Misc bits Position */ +#define FPU_MVFR2_VFP_Misc_Msk (0xFUL << FPU_MVFR2_VFP_Misc_Pos) /*!< MVFR2: VFP Misc bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ +#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ +#define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after return, restore floating-point state */ + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = SCB->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + +/*@} end of CMSIS_Core_FpuFunctions */ + + +/* ########################## Cache functions #################################### */ + +#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ + (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) +#include "cachel1_armv7.h" +#endif + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM7_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Include/core_cm85.h b/Drivers/CMSIS/Include/core_cm85.h new file mode 100644 index 0000000..6046311 --- /dev/null +++ b/Drivers/CMSIS/Include/core_cm85.h @@ -0,0 +1,4672 @@ +/**************************************************************************//** + * @file core_cm85.h + * @brief CMSIS Cortex-M85 Core Peripheral Access Layer Header File + * @version V1.0.4 + * @date 21. April 2022 + ******************************************************************************/ +/* + * Copyright (c) 2022 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#elif defined ( __GNUC__ ) + #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ +#endif + +#ifndef __CORE_CM85_H_GENERIC +#define __CORE_CM85_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M85 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM85 definitions */ + +#define __CORTEX_M (85U) /*!< Cortex-M Core */ + +#if defined ( __CC_ARM ) + #error Legacy Arm Compiler does not support Armv8.1-M target architecture. +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM85_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM85_H_DEPENDANT +#define __CORE_CM85_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM85_REV + #define __CM85_REV 0x0001U + #warning "__CM85_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #if __FPU_PRESENT != 0U + #ifndef __FPU_DP + #define __FPU_DP 0U + #warning "__FPU_DP not defined in device header file; using default!" + #endif + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __ICACHE_PRESENT + #define __ICACHE_PRESENT 0U + #warning "__ICACHE_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DCACHE_PRESENT + #define __DCACHE_PRESENT 0U + #warning "__DCACHE_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 1U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __PMU_PRESENT + #define __PMU_PRESENT 0U + #warning "__PMU_PRESENT not defined in device header file; using default!" + #endif + + #if __PMU_PRESENT != 0U + #ifndef __PMU_NUM_EVENTCNT + #define __PMU_NUM_EVENTCNT 8U + #warning "__PMU_NUM_EVENTCNT not defined in device header file; using default!" + #elif (__PMU_NUM_EVENTCNT > 8 || __PMU_NUM_EVENTCNT < 2) + #error "__PMU_NUM_EVENTCNT is out of range in device header file!" */ + #endif + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M85 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core EWIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core PMU Register + - Core MPU Register + - Core SAU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:1; /*!< bit: 20 Reserved */ + uint32_t B:1; /*!< bit: 21 BTI active (read 0) */ + uint32_t _reserved2:2; /*!< bit: 22..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_B_Pos 21U /*!< xPSR: B Position */ +#define xPSR_B_Msk (1UL << xPSR_B_Pos) /*!< xPSR: B Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t BTI_EN:1; /*!< bit: 4 Privileged branch target identification enable */ + uint32_t UBTI_EN:1; /*!< bit: 5 Unprivileged branch target identification enable */ + uint32_t PAC_EN:1; /*!< bit: 6 Privileged pointer authentication enable */ + uint32_t UPAC_EN:1; /*!< bit: 7 Unprivileged pointer authentication enable */ + uint32_t _reserved1:24; /*!< bit: 8..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_UPAC_EN_Pos 7U /*!< CONTROL: UPAC_EN Position */ +#define CONTROL_UPAC_EN_Msk (1UL << CONTROL_UPAC_EN_Pos) /*!< CONTROL: UPAC_EN Mask */ + +#define CONTROL_PAC_EN_Pos 6U /*!< CONTROL: PAC_EN Position */ +#define CONTROL_PAC_EN_Msk (1UL << CONTROL_PAC_EN_Pos) /*!< CONTROL: PAC_EN Mask */ + +#define CONTROL_UBTI_EN_Pos 5U /*!< CONTROL: UBTI_EN Position */ +#define CONTROL_UBTI_EN_Msk (1UL << CONTROL_UBTI_EN_Pos) /*!< CONTROL: UBTI_EN Mask */ + +#define CONTROL_BTI_EN_Pos 4U /*!< CONTROL: BTI_EN Position */ +#define CONTROL_BTI_EN_Msk (1UL << CONTROL_BTI_EN_Pos) /*!< CONTROL: BTI_EN Mask */ + +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED7[21U]; + __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ + uint32_t RESERVED3[69U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + __IOM uint32_t RFSR; /*!< Offset: 0x204 (R/W) RAS Fault Status Register */ + uint32_t RESERVED4[14U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + __OM uint32_t BPIALL; /*!< Offset: 0x278 ( /W) Branch Predictor Invalidate All */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_IESB_Pos 5U /*!< SCB AIRCR: Implicit ESB Enable Position */ +#define SCB_AIRCR_IESB_Msk (1UL << SCB_AIRCR_IESB_Pos) /*!< SCB AIRCR: Implicit ESB Enable Mask */ + +#define SCB_AIRCR_DIT_Pos 4U /*!< SCB AIRCR: Data Independent Timing Position */ +#define SCB_AIRCR_DIT_Msk (1UL << SCB_AIRCR_DIT_Pos) /*!< SCB AIRCR: Data Independent Timing Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_TRD_Pos 20U /*!< SCB CCR: TRD Position */ +#define SCB_CCR_TRD_Msk (1UL << SCB_CCR_TRD_Pos) /*!< SCB CCR: TRD Mask */ + +#define SCB_CCR_LOB_Pos 19U /*!< SCB CCR: LOB Position */ +#define SCB_CCR_LOB_Msk (1UL << SCB_CCR_LOB_Pos) /*!< SCB CCR: LOB Mask */ + +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_PMU_Pos 5U /*!< SCB DFSR: PMU Position */ +#define SCB_DFSR_PMU_Msk (1UL << SCB_DFSR_PMU_Pos) /*!< SCB DFSR: PMU Mask */ + +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CP7_Pos 7U /*!< SCB NSACR: CP7 Position */ +#define SCB_NSACR_CP7_Msk (1UL << SCB_NSACR_CP7_Pos) /*!< SCB NSACR: CP7 Mask */ + +#define SCB_NSACR_CP6_Pos 6U /*!< SCB NSACR: CP6 Position */ +#define SCB_NSACR_CP6_Msk (1UL << SCB_NSACR_CP6_Pos) /*!< SCB NSACR: CP6 Mask */ + +#define SCB_NSACR_CP5_Pos 5U /*!< SCB NSACR: CP5 Position */ +#define SCB_NSACR_CP5_Msk (1UL << SCB_NSACR_CP5_Pos) /*!< SCB NSACR: CP5 Mask */ + +#define SCB_NSACR_CP4_Pos 4U /*!< SCB NSACR: CP4 Position */ +#define SCB_NSACR_CP4_Msk (1UL << SCB_NSACR_CP4_Pos) /*!< SCB NSACR: CP4 Mask */ + +#define SCB_NSACR_CP3_Pos 3U /*!< SCB NSACR: CP3 Position */ +#define SCB_NSACR_CP3_Msk (1UL << SCB_NSACR_CP3_Pos) /*!< SCB NSACR: CP3 Mask */ + +#define SCB_NSACR_CP2_Pos 2U /*!< SCB NSACR: CP2 Position */ +#define SCB_NSACR_CP2_Msk (1UL << SCB_NSACR_CP2_Pos) /*!< SCB NSACR: CP2 Mask */ + +#define SCB_NSACR_CP1_Pos 1U /*!< SCB NSACR: CP1 Position */ +#define SCB_NSACR_CP1_Msk (1UL << SCB_NSACR_CP1_Pos) /*!< SCB NSACR: CP1 Mask */ + +#define SCB_NSACR_CP0_Pos 0U /*!< SCB NSACR: CP0 Position */ +#define SCB_NSACR_CP0_Msk (1UL /*<< SCB_NSACR_CP0_Pos*/) /*!< SCB NSACR: CP0 Mask */ + +/* SCB Debug Feature Register 0 Definitions */ +#define SCB_ID_DFR_UDE_Pos 28U /*!< SCB ID_DFR: UDE Position */ +#define SCB_ID_DFR_UDE_Msk (0xFUL << SCB_ID_DFR_UDE_Pos) /*!< SCB ID_DFR: UDE Mask */ + +#define SCB_ID_DFR_MProfDbg_Pos 20U /*!< SCB ID_DFR: MProfDbg Position */ +#define SCB_ID_DFR_MProfDbg_Msk (0xFUL << SCB_ID_DFR_MProfDbg_Pos) /*!< SCB ID_DFR: MProfDbg Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB RAS Fault Status Register Definitions */ +#define SCB_RFSR_V_Pos 31U /*!< SCB RFSR: V Position */ +#define SCB_RFSR_V_Msk (1UL << SCB_RFSR_V_Pos) /*!< SCB RFSR: V Mask */ + +#define SCB_RFSR_IS_Pos 16U /*!< SCB RFSR: IS Position */ +#define SCB_RFSR_IS_Msk (0x7FFFUL << SCB_RFSR_IS_Pos) /*!< SCB RFSR: IS Mask */ + +#define SCB_RFSR_UET_Pos 0U /*!< SCB RFSR: UET Position */ +#define SCB_RFSR_UET_Msk (3UL /*<< SCB_RFSR_UET_Pos*/) /*!< SCB RFSR: UET Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ICB Implementation Control Block register (ICB) + \brief Type definitions for the Implementation Control Block Register + @{ + */ + +/** + \brief Structure type to access the Implementation Control Block (ICB). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} ICB_Type; + +/* Auxiliary Control Register Definitions */ +#define ICB_ACTLR_DISCRITAXIRUW_Pos 27U /*!< ACTLR: DISCRITAXIRUW Position */ +#define ICB_ACTLR_DISCRITAXIRUW_Msk (1UL << ICB_ACTLR_DISCRITAXIRUW_Pos) /*!< ACTLR: DISCRITAXIRUW Mask */ + +#define ICB_ACTLR_DISCRITAXIRUR_Pos 15U /*!< ACTLR: DISCRITAXIRUR Position */ +#define ICB_ACTLR_DISCRITAXIRUR_Msk (1UL << ICB_ACTLR_DISCRITAXIRUR_Pos) /*!< ACTLR: DISCRITAXIRUR Mask */ + +#define ICB_ACTLR_EVENTBUSEN_Pos 14U /*!< ACTLR: EVENTBUSEN Position */ +#define ICB_ACTLR_EVENTBUSEN_Msk (1UL << ICB_ACTLR_EVENTBUSEN_Pos) /*!< ACTLR: EVENTBUSEN Mask */ + +#define ICB_ACTLR_EVENTBUSEN_S_Pos 13U /*!< ACTLR: EVENTBUSEN_S Position */ +#define ICB_ACTLR_EVENTBUSEN_S_Msk (1UL << ICB_ACTLR_EVENTBUSEN_S_Pos) /*!< ACTLR: EVENTBUSEN_S Mask */ + +#define ICB_ACTLR_DISITMATBFLUSH_Pos 12U /*!< ACTLR: DISITMATBFLUSH Position */ +#define ICB_ACTLR_DISITMATBFLUSH_Msk (1UL << ICB_ACTLR_DISITMATBFLUSH_Pos) /*!< ACTLR: DISITMATBFLUSH Mask */ + +#define ICB_ACTLR_DISNWAMODE_Pos 11U /*!< ACTLR: DISNWAMODE Position */ +#define ICB_ACTLR_DISNWAMODE_Msk (1UL << ICB_ACTLR_DISNWAMODE_Pos) /*!< ACTLR: DISNWAMODE Mask */ + +#define ICB_ACTLR_FPEXCODIS_Pos 10U /*!< ACTLR: FPEXCODIS Position */ +#define ICB_ACTLR_FPEXCODIS_Msk (1UL << ICB_ACTLR_FPEXCODIS_Pos) /*!< ACTLR: FPEXCODIS Mask */ + +/* Interrupt Controller Type Register Definitions */ +#define ICB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define ICB_ICTR_INTLINESNUM_Msk (0xFUL /*<< ICB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_ICB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[32U]; + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[3U]; + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) ITM Device Type Register */ + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ +#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ + +#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup MemSysCtl_Type Memory System Control Registers (IMPLEMENTATION DEFINED) + \brief Type definitions for the Memory System Control Registers (MEMSYSCTL) + @{ + */ + +/** + \brief Structure type to access the Memory System Control Registers (MEMSYSCTL). + */ +typedef struct +{ + __IOM uint32_t MSCR; /*!< Offset: 0x000 (R/W) Memory System Control Register */ + __IOM uint32_t PFCR; /*!< Offset: 0x004 (R/W) Prefetcher Control Register */ + uint32_t RESERVED1[2U]; + __IOM uint32_t ITCMCR; /*!< Offset: 0x010 (R/W) ITCM Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x014 (R/W) DTCM Control Register */ + __IOM uint32_t PAHBCR; /*!< Offset: 0x018 (R/W) P-AHB Control Register */ + uint32_t RESERVED2[313U]; + __IOM uint32_t ITGU_CTRL; /*!< Offset: 0x500 (R/W) ITGU Control Register */ + __IOM uint32_t ITGU_CFG; /*!< Offset: 0x504 (R/W) ITGU Configuration Register */ + uint32_t RESERVED3[2U]; + __IOM uint32_t ITGU_LUT[16U]; /*!< Offset: 0x510 (R/W) ITGU Look Up Table Register */ + uint32_t RESERVED4[44U]; + __IOM uint32_t DTGU_CTRL; /*!< Offset: 0x600 (R/W) DTGU Control Registers */ + __IOM uint32_t DTGU_CFG; /*!< Offset: 0x604 (R/W) DTGU Configuration Register */ + uint32_t RESERVED5[2U]; + __IOM uint32_t DTGU_LUT[16U]; /*!< Offset: 0x610 (R/W) DTGU Look Up Table Register */ +} MemSysCtl_Type; + +/* MEMSYSCTL Memory System Control Register (MSCR) Register Definitions */ +#define MEMSYSCTL_MSCR_CPWRDN_Pos 17U /*!< MEMSYSCTL MSCR: CPWRDN Position */ +#define MEMSYSCTL_MSCR_CPWRDN_Msk (0x1UL << MEMSYSCTL_MSCR_CPWRDN_Pos) /*!< MEMSYSCTL MSCR: CPWRDN Mask */ + +#define MEMSYSCTL_MSCR_DCCLEAN_Pos 16U /*!< MEMSYSCTL MSCR: DCCLEAN Position */ +#define MEMSYSCTL_MSCR_DCCLEAN_Msk (0x1UL << MEMSYSCTL_MSCR_DCCLEAN_Pos) /*!< MEMSYSCTL MSCR: DCCLEAN Mask */ + +#define MEMSYSCTL_MSCR_ICACTIVE_Pos 13U /*!< MEMSYSCTL MSCR: ICACTIVE Position */ +#define MEMSYSCTL_MSCR_ICACTIVE_Msk (0x1UL << MEMSYSCTL_MSCR_ICACTIVE_Pos) /*!< MEMSYSCTL MSCR: ICACTIVE Mask */ + +#define MEMSYSCTL_MSCR_DCACTIVE_Pos 12U /*!< MEMSYSCTL MSCR: DCACTIVE Position */ +#define MEMSYSCTL_MSCR_DCACTIVE_Msk (0x1UL << MEMSYSCTL_MSCR_DCACTIVE_Pos) /*!< MEMSYSCTL MSCR: DCACTIVE Mask */ + +#define MEMSYSCTL_MSCR_EVECCFAULT_Pos 3U /*!< MEMSYSCTL MSCR: EVECCFAULT Position */ +#define MEMSYSCTL_MSCR_EVECCFAULT_Msk (0x1UL << MEMSYSCTL_MSCR_EVECCFAULT_Pos) /*!< MEMSYSCTL MSCR: EVECCFAULT Mask */ + +#define MEMSYSCTL_MSCR_FORCEWT_Pos 2U /*!< MEMSYSCTL MSCR: FORCEWT Position */ +#define MEMSYSCTL_MSCR_FORCEWT_Msk (0x1UL << MEMSYSCTL_MSCR_FORCEWT_Pos) /*!< MEMSYSCTL MSCR: FORCEWT Mask */ + +#define MEMSYSCTL_MSCR_ECCEN_Pos 1U /*!< MEMSYSCTL MSCR: ECCEN Position */ +#define MEMSYSCTL_MSCR_ECCEN_Msk (0x1UL << MEMSYSCTL_MSCR_ECCEN_Pos) /*!< MEMSYSCTL MSCR: ECCEN Mask */ + +/* MEMSYSCTL Prefetcher Control Register (PFCR) Register Definitions */ +#define MEMSYSCTL_PFCR_DIS_NLP_Pos 7U /*!< MEMSYSCTL PFCR: DIS_NLP Position */ +#define MEMSYSCTL_PFCR_DIS_NLP_Msk (0x1UL << MEMSYSCTL_PFCR_DIS_NLP_Pos) /*!< MEMSYSCTL PFCR: DIS_NLP Mask */ + +#define MEMSYSCTL_PFCR_ENABLE_Pos 0U /*!< MEMSYSCTL PFCR: ENABLE Position */ +#define MEMSYSCTL_PFCR_ENABLE_Msk (0x1UL /*<< MEMSYSCTL_PFCR_ENABLE_Pos*/) /*!< MEMSYSCTL PFCR: ENABLE Mask */ + +/* MEMSYSCTL ITCM Control Register (ITCMCR) Register Definitions */ +#define MEMSYSCTL_ITCMCR_SZ_Pos 3U /*!< MEMSYSCTL ITCMCR: SZ Position */ +#define MEMSYSCTL_ITCMCR_SZ_Msk (0xFUL << MEMSYSCTL_ITCMCR_SZ_Pos) /*!< MEMSYSCTL ITCMCR: SZ Mask */ + +#define MEMSYSCTL_ITCMCR_EN_Pos 0U /*!< MEMSYSCTL ITCMCR: EN Position */ +#define MEMSYSCTL_ITCMCR_EN_Msk (0x1UL /*<< MEMSYSCTL_ITCMCR_EN_Pos*/) /*!< MEMSYSCTL ITCMCR: EN Mask */ + +/* MEMSYSCTL DTCM Control Register (DTCMCR) Register Definitions */ +#define MEMSYSCTL_DTCMCR_SZ_Pos 3U /*!< MEMSYSCTL DTCMCR: SZ Position */ +#define MEMSYSCTL_DTCMCR_SZ_Msk (0xFUL << MEMSYSCTL_DTCMCR_SZ_Pos) /*!< MEMSYSCTL DTCMCR: SZ Mask */ + +#define MEMSYSCTL_DTCMCR_EN_Pos 0U /*!< MEMSYSCTL DTCMCR: EN Position */ +#define MEMSYSCTL_DTCMCR_EN_Msk (0x1UL /*<< MEMSYSCTL_DTCMCR_EN_Pos*/) /*!< MEMSYSCTL DTCMCR: EN Mask */ + +/* MEMSYSCTL P-AHB Control Register (PAHBCR) Register Definitions */ +#define MEMSYSCTL_PAHBCR_SZ_Pos 1U /*!< MEMSYSCTL PAHBCR: SZ Position */ +#define MEMSYSCTL_PAHBCR_SZ_Msk (0x7UL << MEMSYSCTL_PAHBCR_SZ_Pos) /*!< MEMSYSCTL PAHBCR: SZ Mask */ + +#define MEMSYSCTL_PAHBCR_EN_Pos 0U /*!< MEMSYSCTL PAHBCR: EN Position */ +#define MEMSYSCTL_PAHBCR_EN_Msk (0x1UL /*<< MEMSYSCTL_PAHBCR_EN_Pos*/) /*!< MEMSYSCTL PAHBCR: EN Mask */ + +/* MEMSYSCTL ITGU Control Register (ITGU_CTRL) Register Definitions */ +#define MEMSYSCTL_ITGU_CTRL_DEREN_Pos 1U /*!< MEMSYSCTL ITGU_CTRL: DEREN Position */ +#define MEMSYSCTL_ITGU_CTRL_DEREN_Msk (0x1UL << MEMSYSCTL_ITGU_CTRL_DEREN_Pos) /*!< MEMSYSCTL ITGU_CTRL: DEREN Mask */ + +#define MEMSYSCTL_ITGU_CTRL_DBFEN_Pos 0U /*!< MEMSYSCTL ITGU_CTRL: DBFEN Position */ +#define MEMSYSCTL_ITGU_CTRL_DBFEN_Msk (0x1UL /*<< MEMSYSCTL_ITGU_CTRL_DBFEN_Pos*/) /*!< MEMSYSCTL ITGU_CTRL: DBFEN Mask */ + +/* MEMSYSCTL ITGU Configuration Register (ITGU_CFG) Register Definitions */ +#define MEMSYSCTL_ITGU_CFG_PRESENT_Pos 31U /*!< MEMSYSCTL ITGU_CFG: PRESENT Position */ +#define MEMSYSCTL_ITGU_CFG_PRESENT_Msk (0x1UL << MEMSYSCTL_ITGU_CFG_PRESENT_Pos) /*!< MEMSYSCTL ITGU_CFG: PRESENT Mask */ + +#define MEMSYSCTL_ITGU_CFG_NUMBLKS_Pos 8U /*!< MEMSYSCTL ITGU_CFG: NUMBLKS Position */ +#define MEMSYSCTL_ITGU_CFG_NUMBLKS_Msk (0xFUL << MEMSYSCTL_ITGU_CFG_NUMBLKS_Pos) /*!< MEMSYSCTL ITGU_CFG: NUMBLKS Mask */ + +#define MEMSYSCTL_ITGU_CFG_BLKSZ_Pos 0U /*!< MEMSYSCTL ITGU_CFG: BLKSZ Position */ +#define MEMSYSCTL_ITGU_CFG_BLKSZ_Msk (0xFUL /*<< MEMSYSCTL_ITGU_CFG_BLKSZ_Pos*/) /*!< MEMSYSCTL ITGU_CFG: BLKSZ Mask */ + +/* MEMSYSCTL DTGU Control Registers (DTGU_CTRL) Register Definitions */ +#define MEMSYSCTL_DTGU_CTRL_DEREN_Pos 1U /*!< MEMSYSCTL DTGU_CTRL: DEREN Position */ +#define MEMSYSCTL_DTGU_CTRL_DEREN_Msk (0x1UL << MEMSYSCTL_DTGU_CTRL_DEREN_Pos) /*!< MEMSYSCTL DTGU_CTRL: DEREN Mask */ + +#define MEMSYSCTL_DTGU_CTRL_DBFEN_Pos 0U /*!< MEMSYSCTL DTGU_CTRL: DBFEN Position */ +#define MEMSYSCTL_DTGU_CTRL_DBFEN_Msk (0x1UL /*<< MEMSYSCTL_DTGU_CTRL_DBFEN_Pos*/) /*!< MEMSYSCTL DTGU_CTRL: DBFEN Mask */ + +/* MEMSYSCTL DTGU Configuration Register (DTGU_CFG) Register Definitions */ +#define MEMSYSCTL_DTGU_CFG_PRESENT_Pos 31U /*!< MEMSYSCTL DTGU_CFG: PRESENT Position */ +#define MEMSYSCTL_DTGU_CFG_PRESENT_Msk (0x1UL << MEMSYSCTL_DTGU_CFG_PRESENT_Pos) /*!< MEMSYSCTL DTGU_CFG: PRESENT Mask */ + +#define MEMSYSCTL_DTGU_CFG_NUMBLKS_Pos 8U /*!< MEMSYSCTL DTGU_CFG: NUMBLKS Position */ +#define MEMSYSCTL_DTGU_CFG_NUMBLKS_Msk (0xFUL << MEMSYSCTL_DTGU_CFG_NUMBLKS_Pos) /*!< MEMSYSCTL DTGU_CFG: NUMBLKS Mask */ + +#define MEMSYSCTL_DTGU_CFG_BLKSZ_Pos 0U /*!< MEMSYSCTL DTGU_CFG: BLKSZ Position */ +#define MEMSYSCTL_DTGU_CFG_BLKSZ_Msk (0xFUL /*<< MEMSYSCTL_DTGU_CFG_BLKSZ_Pos*/) /*!< MEMSYSCTL DTGU_CFG: BLKSZ Mask */ + + +/*@}*/ /* end of group MemSysCtl_Type */ + + +/** + \ingroup CMSIS_core_register + \defgroup PwrModCtl_Type Power Mode Control Registers + \brief Type definitions for the Power Mode Control Registers (PWRMODCTL) + @{ + */ + +/** + \brief Structure type to access the Power Mode Control Registers (PWRMODCTL). + */ +typedef struct +{ + __IOM uint32_t CPDLPSTATE; /*!< Offset: 0x000 (R/W) Core Power Domain Low Power State Register */ + __IOM uint32_t DPDLPSTATE; /*!< Offset: 0x004 (R/W) Debug Power Domain Low Power State Register */ +} PwrModCtl_Type; + +/* PWRMODCTL Core Power Domain Low Power State (CPDLPSTATE) Register Definitions */ +#define PWRMODCTL_CPDLPSTATE_RLPSTATE_Pos 8U /*!< PWRMODCTL CPDLPSTATE: RLPSTATE Position */ +#define PWRMODCTL_CPDLPSTATE_RLPSTATE_Msk (0x3UL << PWRMODCTL_CPDLPSTATE_RLPSTATE_Pos) /*!< PWRMODCTL CPDLPSTATE: RLPSTATE Mask */ + +#define PWRMODCTL_CPDLPSTATE_ELPSTATE_Pos 4U /*!< PWRMODCTL CPDLPSTATE: ELPSTATE Position */ +#define PWRMODCTL_CPDLPSTATE_ELPSTATE_Msk (0x3UL << PWRMODCTL_CPDLPSTATE_ELPSTATE_Pos) /*!< PWRMODCTL CPDLPSTATE: ELPSTATE Mask */ + +#define PWRMODCTL_CPDLPSTATE_CLPSTATE_Pos 0U /*!< PWRMODCTL CPDLPSTATE: CLPSTATE Position */ +#define PWRMODCTL_CPDLPSTATE_CLPSTATE_Msk (0x3UL /*<< PWRMODCTL_CPDLPSTATE_CLPSTATE_Pos*/) /*!< PWRMODCTL CPDLPSTATE: CLPSTATE Mask */ + +/* PWRMODCTL Debug Power Domain Low Power State (DPDLPSTATE) Register Definitions */ +#define PWRMODCTL_DPDLPSTATE_DLPSTATE_Pos 0U /*!< PWRMODCTL DPDLPSTATE: DLPSTATE Position */ +#define PWRMODCTL_DPDLPSTATE_DLPSTATE_Msk (0x3UL /*<< PWRMODCTL_DPDLPSTATE_DLPSTATE_Pos*/) /*!< PWRMODCTL DPDLPSTATE: DLPSTATE Mask */ + +/*@}*/ /* end of group PwrModCtl_Type */ + + +/** + \ingroup CMSIS_core_register + \defgroup EWIC_Type External Wakeup Interrupt Controller Registers + \brief Type definitions for the External Wakeup Interrupt Controller Registers (EWIC) + @{ + */ + +/** + \brief Structure type to access the External Wakeup Interrupt Controller Registers (EWIC). + */ +typedef struct +{ + __OM uint32_t EVENTSPR; /*!< Offset: 0x000 ( /W) Event Set Pending Register */ + uint32_t RESERVED0[31U]; + __IM uint32_t EVENTMASKA; /*!< Offset: 0x080 (R/W) Event Mask A Register */ + __IM uint32_t EVENTMASK[15]; /*!< Offset: 0x084 (R/W) Event Mask Register */ +} EWIC_Type; + +/* EWIC External Wakeup Interrupt Controller (EVENTSPR) Register Definitions */ +#define EWIC_EVENTSPR_EDBGREQ_Pos 2U /*!< EWIC EVENTSPR: EDBGREQ Position */ +#define EWIC_EVENTSPR_EDBGREQ_Msk (0x1UL << EWIC_EVENTSPR_EDBGREQ_Pos) /*!< EWIC EVENTSPR: EDBGREQ Mask */ + +#define EWIC_EVENTSPR_NMI_Pos 1U /*!< EWIC EVENTSPR: NMI Position */ +#define EWIC_EVENTSPR_NMI_Msk (0x1UL << EWIC_EVENTSPR_NMI_Pos) /*!< EWIC EVENTSPR: NMI Mask */ + +#define EWIC_EVENTSPR_EVENT_Pos 0U /*!< EWIC EVENTSPR: EVENT Position */ +#define EWIC_EVENTSPR_EVENT_Msk (0x1UL /*<< EWIC_EVENTSPR_EVENT_Pos*/) /*!< EWIC EVENTSPR: EVENT Mask */ + +/* EWIC External Wakeup Interrupt Controller (EVENTMASKA) Register Definitions */ +#define EWIC_EVENTMASKA_EDBGREQ_Pos 2U /*!< EWIC EVENTMASKA: EDBGREQ Position */ +#define EWIC_EVENTMASKA_EDBGREQ_Msk (0x1UL << EWIC_EVENTMASKA_EDBGREQ_Pos) /*!< EWIC EVENTMASKA: EDBGREQ Mask */ + +#define EWIC_EVENTMASKA_NMI_Pos 1U /*!< EWIC EVENTMASKA: NMI Position */ +#define EWIC_EVENTMASKA_NMI_Msk (0x1UL << EWIC_EVENTMASKA_NMI_Pos) /*!< EWIC EVENTMASKA: NMI Mask */ + +#define EWIC_EVENTMASKA_EVENT_Pos 0U /*!< EWIC EVENTMASKA: EVENT Position */ +#define EWIC_EVENTMASKA_EVENT_Msk (0x1UL /*<< EWIC_EVENTMASKA_EVENT_Pos*/) /*!< EWIC EVENTMASKA: EVENT Mask */ + +/* EWIC External Wakeup Interrupt Controller (EVENTMASK) Register Definitions */ +#define EWIC_EVENTMASK_IRQ_Pos 0U /*!< EWIC EVENTMASKA: IRQ Position */ +#define EWIC_EVENTMASK_IRQ_Msk (0xFFFFFFFFUL /*<< EWIC_EVENTMASKA_IRQ_Pos*/) /*!< EWIC EVENTMASKA: IRQ Mask */ + +/*@}*/ /* end of group EWIC_Type */ + + +/** + \ingroup CMSIS_core_register + \defgroup ErrBnk_Type Error Banking Registers (IMPLEMENTATION DEFINED) + \brief Type definitions for the Error Banking Registers (ERRBNK) + @{ + */ + +/** + \brief Structure type to access the Error Banking Registers (ERRBNK). + */ +typedef struct +{ + __IOM uint32_t IEBR0; /*!< Offset: 0x000 (R/W) Instruction Cache Error Bank Register 0 */ + __IOM uint32_t IEBR1; /*!< Offset: 0x004 (R/W) Instruction Cache Error Bank Register 1 */ + uint32_t RESERVED0[2U]; + __IOM uint32_t DEBR0; /*!< Offset: 0x010 (R/W) Data Cache Error Bank Register 0 */ + __IOM uint32_t DEBR1; /*!< Offset: 0x014 (R/W) Data Cache Error Bank Register 1 */ + uint32_t RESERVED1[2U]; + __IOM uint32_t TEBR0; /*!< Offset: 0x020 (R/W) TCM Error Bank Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t TEBR1; /*!< Offset: 0x028 (R/W) TCM Error Bank Register 1 */ +} ErrBnk_Type; + +/* ERRBNK Instruction Cache Error Bank Register 0 (IEBR0) Register Definitions */ +#define ERRBNK_IEBR0_SWDEF_Pos 30U /*!< ERRBNK IEBR0: SWDEF Position */ +#define ERRBNK_IEBR0_SWDEF_Msk (0x3UL << ERRBNK_IEBR0_SWDEF_Pos) /*!< ERRBNK IEBR0: SWDEF Mask */ + +#define ERRBNK_IEBR0_BANK_Pos 16U /*!< ERRBNK IEBR0: BANK Position */ +#define ERRBNK_IEBR0_BANK_Msk (0x1UL << ERRBNK_IEBR0_BANK_Pos) /*!< ERRBNK IEBR0: BANK Mask */ + +#define ERRBNK_IEBR0_LOCATION_Pos 2U /*!< ERRBNK IEBR0: LOCATION Position */ +#define ERRBNK_IEBR0_LOCATION_Msk (0x3FFFUL << ERRBNK_IEBR0_LOCATION_Pos) /*!< ERRBNK IEBR0: LOCATION Mask */ + +#define ERRBNK_IEBR0_LOCKED_Pos 1U /*!< ERRBNK IEBR0: LOCKED Position */ +#define ERRBNK_IEBR0_LOCKED_Msk (0x1UL << ERRBNK_IEBR0_LOCKED_Pos) /*!< ERRBNK IEBR0: LOCKED Mask */ + +#define ERRBNK_IEBR0_VALID_Pos 0U /*!< ERRBNK IEBR0: VALID Position */ +#define ERRBNK_IEBR0_VALID_Msk (0x1UL << /*ERRBNK_IEBR0_VALID_Pos*/) /*!< ERRBNK IEBR0: VALID Mask */ + +/* ERRBNK Instruction Cache Error Bank Register 1 (IEBR1) Register Definitions */ +#define ERRBNK_IEBR1_SWDEF_Pos 30U /*!< ERRBNK IEBR1: SWDEF Position */ +#define ERRBNK_IEBR1_SWDEF_Msk (0x3UL << ERRBNK_IEBR1_SWDEF_Pos) /*!< ERRBNK IEBR1: SWDEF Mask */ + +#define ERRBNK_IEBR1_BANK_Pos 16U /*!< ERRBNK IEBR1: BANK Position */ +#define ERRBNK_IEBR1_BANK_Msk (0x1UL << ERRBNK_IEBR1_BANK_Pos) /*!< ERRBNK IEBR1: BANK Mask */ + +#define ERRBNK_IEBR1_LOCATION_Pos 2U /*!< ERRBNK IEBR1: LOCATION Position */ +#define ERRBNK_IEBR1_LOCATION_Msk (0x3FFFUL << ERRBNK_IEBR1_LOCATION_Pos) /*!< ERRBNK IEBR1: LOCATION Mask */ + +#define ERRBNK_IEBR1_LOCKED_Pos 1U /*!< ERRBNK IEBR1: LOCKED Position */ +#define ERRBNK_IEBR1_LOCKED_Msk (0x1UL << ERRBNK_IEBR1_LOCKED_Pos) /*!< ERRBNK IEBR1: LOCKED Mask */ + +#define ERRBNK_IEBR1_VALID_Pos 0U /*!< ERRBNK IEBR1: VALID Position */ +#define ERRBNK_IEBR1_VALID_Msk (0x1UL << /*ERRBNK_IEBR1_VALID_Pos*/) /*!< ERRBNK IEBR1: VALID Mask */ + +/* ERRBNK Data Cache Error Bank Register 0 (DEBR0) Register Definitions */ +#define ERRBNK_DEBR0_SWDEF_Pos 30U /*!< ERRBNK DEBR0: SWDEF Position */ +#define ERRBNK_DEBR0_SWDEF_Msk (0x3UL << ERRBNK_DEBR0_SWDEF_Pos) /*!< ERRBNK DEBR0: SWDEF Mask */ + +#define ERRBNK_DEBR0_TYPE_Pos 17U /*!< ERRBNK DEBR0: TYPE Position */ +#define ERRBNK_DEBR0_TYPE_Msk (0x1UL << ERRBNK_DEBR0_TYPE_Pos) /*!< ERRBNK DEBR0: TYPE Mask */ + +#define ERRBNK_DEBR0_BANK_Pos 16U /*!< ERRBNK DEBR0: BANK Position */ +#define ERRBNK_DEBR0_BANK_Msk (0x1UL << ERRBNK_DEBR0_BANK_Pos) /*!< ERRBNK DEBR0: BANK Mask */ + +#define ERRBNK_DEBR0_LOCATION_Pos 2U /*!< ERRBNK DEBR0: LOCATION Position */ +#define ERRBNK_DEBR0_LOCATION_Msk (0x3FFFUL << ERRBNK_DEBR0_LOCATION_Pos) /*!< ERRBNK DEBR0: LOCATION Mask */ + +#define ERRBNK_DEBR0_LOCKED_Pos 1U /*!< ERRBNK DEBR0: LOCKED Position */ +#define ERRBNK_DEBR0_LOCKED_Msk (0x1UL << ERRBNK_DEBR0_LOCKED_Pos) /*!< ERRBNK DEBR0: LOCKED Mask */ + +#define ERRBNK_DEBR0_VALID_Pos 0U /*!< ERRBNK DEBR0: VALID Position */ +#define ERRBNK_DEBR0_VALID_Msk (0x1UL << /*ERRBNK_DEBR0_VALID_Pos*/) /*!< ERRBNK DEBR0: VALID Mask */ + +/* ERRBNK Data Cache Error Bank Register 1 (DEBR1) Register Definitions */ +#define ERRBNK_DEBR1_SWDEF_Pos 30U /*!< ERRBNK DEBR1: SWDEF Position */ +#define ERRBNK_DEBR1_SWDEF_Msk (0x3UL << ERRBNK_DEBR1_SWDEF_Pos) /*!< ERRBNK DEBR1: SWDEF Mask */ + +#define ERRBNK_DEBR1_TYPE_Pos 17U /*!< ERRBNK DEBR1: TYPE Position */ +#define ERRBNK_DEBR1_TYPE_Msk (0x1UL << ERRBNK_DEBR1_TYPE_Pos) /*!< ERRBNK DEBR1: TYPE Mask */ + +#define ERRBNK_DEBR1_BANK_Pos 16U /*!< ERRBNK DEBR1: BANK Position */ +#define ERRBNK_DEBR1_BANK_Msk (0x1UL << ERRBNK_DEBR1_BANK_Pos) /*!< ERRBNK DEBR1: BANK Mask */ + +#define ERRBNK_DEBR1_LOCATION_Pos 2U /*!< ERRBNK DEBR1: LOCATION Position */ +#define ERRBNK_DEBR1_LOCATION_Msk (0x3FFFUL << ERRBNK_DEBR1_LOCATION_Pos) /*!< ERRBNK DEBR1: LOCATION Mask */ + +#define ERRBNK_DEBR1_LOCKED_Pos 1U /*!< ERRBNK DEBR1: LOCKED Position */ +#define ERRBNK_DEBR1_LOCKED_Msk (0x1UL << ERRBNK_DEBR1_LOCKED_Pos) /*!< ERRBNK DEBR1: LOCKED Mask */ + +#define ERRBNK_DEBR1_VALID_Pos 0U /*!< ERRBNK DEBR1: VALID Position */ +#define ERRBNK_DEBR1_VALID_Msk (0x1UL << /*ERRBNK_DEBR1_VALID_Pos*/) /*!< ERRBNK DEBR1: VALID Mask */ + +/* ERRBNK TCM Error Bank Register 0 (TEBR0) Register Definitions */ +#define ERRBNK_TEBR0_SWDEF_Pos 30U /*!< ERRBNK TEBR0: SWDEF Position */ +#define ERRBNK_TEBR0_SWDEF_Msk (0x3UL << ERRBNK_TEBR0_SWDEF_Pos) /*!< ERRBNK TEBR0: SWDEF Mask */ + +#define ERRBNK_TEBR0_POISON_Pos 28U /*!< ERRBNK TEBR0: POISON Position */ +#define ERRBNK_TEBR0_POISON_Msk (0x1UL << ERRBNK_TEBR0_POISON_Pos) /*!< ERRBNK TEBR0: POISON Mask */ + +#define ERRBNK_TEBR0_TYPE_Pos 27U /*!< ERRBNK TEBR0: TYPE Position */ +#define ERRBNK_TEBR0_TYPE_Msk (0x1UL << ERRBNK_TEBR0_TYPE_Pos) /*!< ERRBNK TEBR0: TYPE Mask */ + +#define ERRBNK_TEBR0_BANK_Pos 24U /*!< ERRBNK TEBR0: BANK Position */ +#define ERRBNK_TEBR0_BANK_Msk (0x3UL << ERRBNK_TEBR0_BANK_Pos) /*!< ERRBNK TEBR0: BANK Mask */ + +#define ERRBNK_TEBR0_LOCATION_Pos 2U /*!< ERRBNK TEBR0: LOCATION Position */ +#define ERRBNK_TEBR0_LOCATION_Msk (0x3FFFFFUL << ERRBNK_TEBR0_LOCATION_Pos) /*!< ERRBNK TEBR0: LOCATION Mask */ + +#define ERRBNK_TEBR0_LOCKED_Pos 1U /*!< ERRBNK TEBR0: LOCKED Position */ +#define ERRBNK_TEBR0_LOCKED_Msk (0x1UL << ERRBNK_TEBR0_LOCKED_Pos) /*!< ERRBNK TEBR0: LOCKED Mask */ + +#define ERRBNK_TEBR0_VALID_Pos 0U /*!< ERRBNK TEBR0: VALID Position */ +#define ERRBNK_TEBR0_VALID_Msk (0x1UL << /*ERRBNK_TEBR0_VALID_Pos*/) /*!< ERRBNK TEBR0: VALID Mask */ + +/* ERRBNK TCM Error Bank Register 1 (TEBR1) Register Definitions */ +#define ERRBNK_TEBR1_SWDEF_Pos 30U /*!< ERRBNK TEBR1: SWDEF Position */ +#define ERRBNK_TEBR1_SWDEF_Msk (0x3UL << ERRBNK_TEBR1_SWDEF_Pos) /*!< ERRBNK TEBR1: SWDEF Mask */ + +#define ERRBNK_TEBR1_POISON_Pos 28U /*!< ERRBNK TEBR1: POISON Position */ +#define ERRBNK_TEBR1_POISON_Msk (0x1UL << ERRBNK_TEBR1_POISON_Pos) /*!< ERRBNK TEBR1: POISON Mask */ + +#define ERRBNK_TEBR1_TYPE_Pos 27U /*!< ERRBNK TEBR1: TYPE Position */ +#define ERRBNK_TEBR1_TYPE_Msk (0x1UL << ERRBNK_TEBR1_TYPE_Pos) /*!< ERRBNK TEBR1: TYPE Mask */ + +#define ERRBNK_TEBR1_BANK_Pos 24U /*!< ERRBNK TEBR1: BANK Position */ +#define ERRBNK_TEBR1_BANK_Msk (0x3UL << ERRBNK_TEBR1_BANK_Pos) /*!< ERRBNK TEBR1: BANK Mask */ + +#define ERRBNK_TEBR1_LOCATION_Pos 2U /*!< ERRBNK TEBR1: LOCATION Position */ +#define ERRBNK_TEBR1_LOCATION_Msk (0x3FFFFFUL << ERRBNK_TEBR1_LOCATION_Pos) /*!< ERRBNK TEBR1: LOCATION Mask */ + +#define ERRBNK_TEBR1_LOCKED_Pos 1U /*!< ERRBNK TEBR1: LOCKED Position */ +#define ERRBNK_TEBR1_LOCKED_Msk (0x1UL << ERRBNK_TEBR1_LOCKED_Pos) /*!< ERRBNK TEBR1: LOCKED Mask */ + +#define ERRBNK_TEBR1_VALID_Pos 0U /*!< ERRBNK TEBR1: VALID Position */ +#define ERRBNK_TEBR1_VALID_Msk (0x1UL << /*ERRBNK_TEBR1_VALID_Pos*/) /*!< ERRBNK TEBR1: VALID Mask */ + +/*@}*/ /* end of group ErrBnk_Type */ + + +/** + \ingroup CMSIS_core_register + \defgroup PrcCfgInf_Type Processor Configuration Information Registers (IMPLEMENTATION DEFINED) + \brief Type definitions for the Processor Configuration Information Registerss (PRCCFGINF) + @{ + */ + +/** + \brief Structure type to access the Processor Configuration Information Registerss (PRCCFGINF). + */ +typedef struct +{ + __OM uint32_t CFGINFOSEL; /*!< Offset: 0x000 ( /W) Processor Configuration Information Selection Register */ + __IM uint32_t CFGINFORD; /*!< Offset: 0x004 (R/ ) Processor Configuration Information Read Data Register */ +} PrcCfgInf_Type; + +/* PRCCFGINF Processor Configuration Information Selection Register (CFGINFOSEL) Definitions */ + +/* PRCCFGINF Processor Configuration Information Read Data Register (CFGINFORD) Definitions */ + +/*@}*/ /* end of group PrcCfgInf_Type */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[809U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ + uint32_t RESERVED4[4U]; + __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ +#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFmt_Pos 0U /*!< TPI FFCR: EnFmt Position */ +#define TPI_FFCR_EnFmt_Msk (0x3UL << /*TPI_FFCR_EnFmt_Pos*/) /*!< TPI FFCR: EnFmt Mask */ + +/* TPI Periodic Synchronization Control Register Definitions */ +#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ +#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ + +/* TPI Software Lock Status Register Definitions */ +#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ +#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ + +#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ +#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ + +#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ +#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + +#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_PMU Performance Monitoring Unit (PMU) + \brief Type definitions for the Performance Monitoring Unit (PMU) + @{ + */ + +/** + \brief Structure type to access the Performance Monitoring Unit (PMU). + */ +typedef struct +{ + __IOM uint32_t EVCNTR[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x0 (R/W) PMU Event Counter Registers */ +#if __PMU_NUM_EVENTCNT<31 + uint32_t RESERVED0[31U-__PMU_NUM_EVENTCNT]; +#endif + __IOM uint32_t CCNTR; /*!< Offset: 0x7C (R/W) PMU Cycle Counter Register */ + uint32_t RESERVED1[224]; + __IOM uint32_t EVTYPER[__PMU_NUM_EVENTCNT]; /*!< Offset: 0x400 (R/W) PMU Event Type and Filter Registers */ +#if __PMU_NUM_EVENTCNT<31 + uint32_t RESERVED2[31U-__PMU_NUM_EVENTCNT]; +#endif + __IOM uint32_t CCFILTR; /*!< Offset: 0x47C (R/W) PMU Cycle Counter Filter Register */ + uint32_t RESERVED3[480]; + __IOM uint32_t CNTENSET; /*!< Offset: 0xC00 (R/W) PMU Count Enable Set Register */ + uint32_t RESERVED4[7]; + __IOM uint32_t CNTENCLR; /*!< Offset: 0xC20 (R/W) PMU Count Enable Clear Register */ + uint32_t RESERVED5[7]; + __IOM uint32_t INTENSET; /*!< Offset: 0xC40 (R/W) PMU Interrupt Enable Set Register */ + uint32_t RESERVED6[7]; + __IOM uint32_t INTENCLR; /*!< Offset: 0xC60 (R/W) PMU Interrupt Enable Clear Register */ + uint32_t RESERVED7[7]; + __IOM uint32_t OVSCLR; /*!< Offset: 0xC80 (R/W) PMU Overflow Flag Status Clear Register */ + uint32_t RESERVED8[7]; + __IOM uint32_t SWINC; /*!< Offset: 0xCA0 (R/W) PMU Software Increment Register */ + uint32_t RESERVED9[7]; + __IOM uint32_t OVSSET; /*!< Offset: 0xCC0 (R/W) PMU Overflow Flag Status Set Register */ + uint32_t RESERVED10[79]; + __IOM uint32_t TYPE; /*!< Offset: 0xE00 (R/W) PMU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0xE04 (R/W) PMU Control Register */ + uint32_t RESERVED11[108]; + __IOM uint32_t AUTHSTATUS; /*!< Offset: 0xFB8 (R/W) PMU Authentication Status Register */ + __IOM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/W) PMU Device Architecture Register */ + uint32_t RESERVED12[3]; + __IOM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/W) PMU Device Type Register */ + __IOM uint32_t PIDR4; /*!< Offset: 0xFD0 (R/W) PMU Peripheral Identification Register 4 */ + uint32_t RESERVED13[3]; + __IOM uint32_t PIDR0; /*!< Offset: 0xFE0 (R/W) PMU Peripheral Identification Register 0 */ + __IOM uint32_t PIDR1; /*!< Offset: 0xFE4 (R/W) PMU Peripheral Identification Register 1 */ + __IOM uint32_t PIDR2; /*!< Offset: 0xFE8 (R/W) PMU Peripheral Identification Register 2 */ + __IOM uint32_t PIDR3; /*!< Offset: 0xFEC (R/W) PMU Peripheral Identification Register 3 */ + __IOM uint32_t CIDR0; /*!< Offset: 0xFF0 (R/W) PMU Component Identification Register 0 */ + __IOM uint32_t CIDR1; /*!< Offset: 0xFF4 (R/W) PMU Component Identification Register 1 */ + __IOM uint32_t CIDR2; /*!< Offset: 0xFF8 (R/W) PMU Component Identification Register 2 */ + __IOM uint32_t CIDR3; /*!< Offset: 0xFFC (R/W) PMU Component Identification Register 3 */ +} PMU_Type; + +/** \brief PMU Event Counter Registers (0-30) Definitions */ + +#define PMU_EVCNTR_CNT_Pos 0U /*!< PMU EVCNTR: Counter Position */ +#define PMU_EVCNTR_CNT_Msk (0xFFFFUL /*<< PMU_EVCNTRx_CNT_Pos*/) /*!< PMU EVCNTR: Counter Mask */ + +/** \brief PMU Event Type and Filter Registers (0-30) Definitions */ + +#define PMU_EVTYPER_EVENTTOCNT_Pos 0U /*!< PMU EVTYPER: Event to Count Position */ +#define PMU_EVTYPER_EVENTTOCNT_Msk (0xFFFFUL /*<< EVTYPERx_EVENTTOCNT_Pos*/) /*!< PMU EVTYPER: Event to Count Mask */ + +/** \brief PMU Count Enable Set Register Definitions */ + +#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENSET: Event Counter 0 Enable Set Position */ +#define PMU_CNTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENSET_CNT0_ENABLE_Pos*/) /*!< PMU CNTENSET: Event Counter 0 Enable Set Mask */ + +#define PMU_CNTENSET_CNT1_ENABLE_Pos 1U /*!< PMU CNTENSET: Event Counter 1 Enable Set Position */ +#define PMU_CNTENSET_CNT1_ENABLE_Msk (1UL << PMU_CNTENSET_CNT1_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 1 Enable Set Mask */ + +#define PMU_CNTENSET_CNT2_ENABLE_Pos 2U /*!< PMU CNTENSET: Event Counter 2 Enable Set Position */ +#define PMU_CNTENSET_CNT2_ENABLE_Msk (1UL << PMU_CNTENSET_CNT2_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 2 Enable Set Mask */ + +#define PMU_CNTENSET_CNT3_ENABLE_Pos 3U /*!< PMU CNTENSET: Event Counter 3 Enable Set Position */ +#define PMU_CNTENSET_CNT3_ENABLE_Msk (1UL << PMU_CNTENSET_CNT3_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 3 Enable Set Mask */ + +#define PMU_CNTENSET_CNT4_ENABLE_Pos 4U /*!< PMU CNTENSET: Event Counter 4 Enable Set Position */ +#define PMU_CNTENSET_CNT4_ENABLE_Msk (1UL << PMU_CNTENSET_CNT4_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 4 Enable Set Mask */ + +#define PMU_CNTENSET_CNT5_ENABLE_Pos 5U /*!< PMU CNTENSET: Event Counter 5 Enable Set Position */ +#define PMU_CNTENSET_CNT5_ENABLE_Msk (1UL << PMU_CNTENSET_CNT5_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 5 Enable Set Mask */ + +#define PMU_CNTENSET_CNT6_ENABLE_Pos 6U /*!< PMU CNTENSET: Event Counter 6 Enable Set Position */ +#define PMU_CNTENSET_CNT6_ENABLE_Msk (1UL << PMU_CNTENSET_CNT6_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 6 Enable Set Mask */ + +#define PMU_CNTENSET_CNT7_ENABLE_Pos 7U /*!< PMU CNTENSET: Event Counter 7 Enable Set Position */ +#define PMU_CNTENSET_CNT7_ENABLE_Msk (1UL << PMU_CNTENSET_CNT7_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 7 Enable Set Mask */ + +#define PMU_CNTENSET_CNT8_ENABLE_Pos 8U /*!< PMU CNTENSET: Event Counter 8 Enable Set Position */ +#define PMU_CNTENSET_CNT8_ENABLE_Msk (1UL << PMU_CNTENSET_CNT8_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 8 Enable Set Mask */ + +#define PMU_CNTENSET_CNT9_ENABLE_Pos 9U /*!< PMU CNTENSET: Event Counter 9 Enable Set Position */ +#define PMU_CNTENSET_CNT9_ENABLE_Msk (1UL << PMU_CNTENSET_CNT9_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 9 Enable Set Mask */ + +#define PMU_CNTENSET_CNT10_ENABLE_Pos 10U /*!< PMU CNTENSET: Event Counter 10 Enable Set Position */ +#define PMU_CNTENSET_CNT10_ENABLE_Msk (1UL << PMU_CNTENSET_CNT10_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 10 Enable Set Mask */ + +#define PMU_CNTENSET_CNT11_ENABLE_Pos 11U /*!< PMU CNTENSET: Event Counter 11 Enable Set Position */ +#define PMU_CNTENSET_CNT11_ENABLE_Msk (1UL << PMU_CNTENSET_CNT11_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 11 Enable Set Mask */ + +#define PMU_CNTENSET_CNT12_ENABLE_Pos 12U /*!< PMU CNTENSET: Event Counter 12 Enable Set Position */ +#define PMU_CNTENSET_CNT12_ENABLE_Msk (1UL << PMU_CNTENSET_CNT12_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 12 Enable Set Mask */ + +#define PMU_CNTENSET_CNT13_ENABLE_Pos 13U /*!< PMU CNTENSET: Event Counter 13 Enable Set Position */ +#define PMU_CNTENSET_CNT13_ENABLE_Msk (1UL << PMU_CNTENSET_CNT13_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 13 Enable Set Mask */ + +#define PMU_CNTENSET_CNT14_ENABLE_Pos 14U /*!< PMU CNTENSET: Event Counter 14 Enable Set Position */ +#define PMU_CNTENSET_CNT14_ENABLE_Msk (1UL << PMU_CNTENSET_CNT14_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 14 Enable Set Mask */ + +#define PMU_CNTENSET_CNT15_ENABLE_Pos 15U /*!< PMU CNTENSET: Event Counter 15 Enable Set Position */ +#define PMU_CNTENSET_CNT15_ENABLE_Msk (1UL << PMU_CNTENSET_CNT15_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 15 Enable Set Mask */ + +#define PMU_CNTENSET_CNT16_ENABLE_Pos 16U /*!< PMU CNTENSET: Event Counter 16 Enable Set Position */ +#define PMU_CNTENSET_CNT16_ENABLE_Msk (1UL << PMU_CNTENSET_CNT16_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 16 Enable Set Mask */ + +#define PMU_CNTENSET_CNT17_ENABLE_Pos 17U /*!< PMU CNTENSET: Event Counter 17 Enable Set Position */ +#define PMU_CNTENSET_CNT17_ENABLE_Msk (1UL << PMU_CNTENSET_CNT17_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 17 Enable Set Mask */ + +#define PMU_CNTENSET_CNT18_ENABLE_Pos 18U /*!< PMU CNTENSET: Event Counter 18 Enable Set Position */ +#define PMU_CNTENSET_CNT18_ENABLE_Msk (1UL << PMU_CNTENSET_CNT18_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 18 Enable Set Mask */ + +#define PMU_CNTENSET_CNT19_ENABLE_Pos 19U /*!< PMU CNTENSET: Event Counter 19 Enable Set Position */ +#define PMU_CNTENSET_CNT19_ENABLE_Msk (1UL << PMU_CNTENSET_CNT19_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 19 Enable Set Mask */ + +#define PMU_CNTENSET_CNT20_ENABLE_Pos 20U /*!< PMU CNTENSET: Event Counter 20 Enable Set Position */ +#define PMU_CNTENSET_CNT20_ENABLE_Msk (1UL << PMU_CNTENSET_CNT20_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 20 Enable Set Mask */ + +#define PMU_CNTENSET_CNT21_ENABLE_Pos 21U /*!< PMU CNTENSET: Event Counter 21 Enable Set Position */ +#define PMU_CNTENSET_CNT21_ENABLE_Msk (1UL << PMU_CNTENSET_CNT21_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 21 Enable Set Mask */ + +#define PMU_CNTENSET_CNT22_ENABLE_Pos 22U /*!< PMU CNTENSET: Event Counter 22 Enable Set Position */ +#define PMU_CNTENSET_CNT22_ENABLE_Msk (1UL << PMU_CNTENSET_CNT22_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 22 Enable Set Mask */ + +#define PMU_CNTENSET_CNT23_ENABLE_Pos 23U /*!< PMU CNTENSET: Event Counter 23 Enable Set Position */ +#define PMU_CNTENSET_CNT23_ENABLE_Msk (1UL << PMU_CNTENSET_CNT23_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 23 Enable Set Mask */ + +#define PMU_CNTENSET_CNT24_ENABLE_Pos 24U /*!< PMU CNTENSET: Event Counter 24 Enable Set Position */ +#define PMU_CNTENSET_CNT24_ENABLE_Msk (1UL << PMU_CNTENSET_CNT24_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 24 Enable Set Mask */ + +#define PMU_CNTENSET_CNT25_ENABLE_Pos 25U /*!< PMU CNTENSET: Event Counter 25 Enable Set Position */ +#define PMU_CNTENSET_CNT25_ENABLE_Msk (1UL << PMU_CNTENSET_CNT25_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 25 Enable Set Mask */ + +#define PMU_CNTENSET_CNT26_ENABLE_Pos 26U /*!< PMU CNTENSET: Event Counter 26 Enable Set Position */ +#define PMU_CNTENSET_CNT26_ENABLE_Msk (1UL << PMU_CNTENSET_CNT26_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 26 Enable Set Mask */ + +#define PMU_CNTENSET_CNT27_ENABLE_Pos 27U /*!< PMU CNTENSET: Event Counter 27 Enable Set Position */ +#define PMU_CNTENSET_CNT27_ENABLE_Msk (1UL << PMU_CNTENSET_CNT27_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 27 Enable Set Mask */ + +#define PMU_CNTENSET_CNT28_ENABLE_Pos 28U /*!< PMU CNTENSET: Event Counter 28 Enable Set Position */ +#define PMU_CNTENSET_CNT28_ENABLE_Msk (1UL << PMU_CNTENSET_CNT28_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 28 Enable Set Mask */ + +#define PMU_CNTENSET_CNT29_ENABLE_Pos 29U /*!< PMU CNTENSET: Event Counter 29 Enable Set Position */ +#define PMU_CNTENSET_CNT29_ENABLE_Msk (1UL << PMU_CNTENSET_CNT29_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 29 Enable Set Mask */ + +#define PMU_CNTENSET_CNT30_ENABLE_Pos 30U /*!< PMU CNTENSET: Event Counter 30 Enable Set Position */ +#define PMU_CNTENSET_CNT30_ENABLE_Msk (1UL << PMU_CNTENSET_CNT30_ENABLE_Pos) /*!< PMU CNTENSET: Event Counter 30 Enable Set Mask */ + +#define PMU_CNTENSET_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENSET: Cycle Counter Enable Set Position */ +#define PMU_CNTENSET_CCNTR_ENABLE_Msk (1UL << PMU_CNTENSET_CCNTR_ENABLE_Pos) /*!< PMU CNTENSET: Cycle Counter Enable Set Mask */ + +/** \brief PMU Count Enable Clear Register Definitions */ + +#define PMU_CNTENSET_CNT0_ENABLE_Pos 0U /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Position */ +#define PMU_CNTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_CNTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU CNTENCLR: Event Counter 0 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU CNTENCLR: Event Counter 1 Enable Clear Position */ +#define PMU_CNTENCLR_CNT1_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT1_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 1 Enable Clear */ + +#define PMU_CNTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Position */ +#define PMU_CNTENCLR_CNT2_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT2_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 2 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Position */ +#define PMU_CNTENCLR_CNT3_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT3_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 3 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Position */ +#define PMU_CNTENCLR_CNT4_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT4_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 4 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Position */ +#define PMU_CNTENCLR_CNT5_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT5_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 5 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Position */ +#define PMU_CNTENCLR_CNT6_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT6_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 6 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Position */ +#define PMU_CNTENCLR_CNT7_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT7_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 7 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Position */ +#define PMU_CNTENCLR_CNT8_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT8_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 8 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Position */ +#define PMU_CNTENCLR_CNT9_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT9_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 9 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Position */ +#define PMU_CNTENCLR_CNT10_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT10_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 10 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Position */ +#define PMU_CNTENCLR_CNT11_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT11_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 11 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Position */ +#define PMU_CNTENCLR_CNT12_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT12_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 12 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Position */ +#define PMU_CNTENCLR_CNT13_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT13_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 13 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Position */ +#define PMU_CNTENCLR_CNT14_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT14_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 14 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Position */ +#define PMU_CNTENCLR_CNT15_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT15_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 15 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Position */ +#define PMU_CNTENCLR_CNT16_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT16_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 16 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Position */ +#define PMU_CNTENCLR_CNT17_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT17_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 17 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Position */ +#define PMU_CNTENCLR_CNT18_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT18_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 18 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Position */ +#define PMU_CNTENCLR_CNT19_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT19_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 19 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Position */ +#define PMU_CNTENCLR_CNT20_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT20_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 20 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Position */ +#define PMU_CNTENCLR_CNT21_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT21_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 21 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Position */ +#define PMU_CNTENCLR_CNT22_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT22_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 22 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Position */ +#define PMU_CNTENCLR_CNT23_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT23_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 23 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Position */ +#define PMU_CNTENCLR_CNT24_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT24_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 24 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Position */ +#define PMU_CNTENCLR_CNT25_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT25_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 25 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Position */ +#define PMU_CNTENCLR_CNT26_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT26_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 26 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Position */ +#define PMU_CNTENCLR_CNT27_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT27_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 27 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Position */ +#define PMU_CNTENCLR_CNT28_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT28_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 28 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Position */ +#define PMU_CNTENCLR_CNT29_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT29_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 29 Enable Clear Mask */ + +#define PMU_CNTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Position */ +#define PMU_CNTENCLR_CNT30_ENABLE_Msk (1UL << PMU_CNTENCLR_CNT30_ENABLE_Pos) /*!< PMU CNTENCLR: Event Counter 30 Enable Clear Mask */ + +#define PMU_CNTENCLR_CCNTR_ENABLE_Pos 31U /*!< PMU CNTENCLR: Cycle Counter Enable Clear Position */ +#define PMU_CNTENCLR_CCNTR_ENABLE_Msk (1UL << PMU_CNTENCLR_CCNTR_ENABLE_Pos) /*!< PMU CNTENCLR: Cycle Counter Enable Clear Mask */ + +/** \brief PMU Interrupt Enable Set Register Definitions */ + +#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENSET_CNT0_ENABLE_Pos*/) /*!< PMU INTENSET: Event Counter 0 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT1_ENABLE_Pos 1U /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT1_ENABLE_Msk (1UL << PMU_INTENSET_CNT1_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 1 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT2_ENABLE_Pos 2U /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT2_ENABLE_Msk (1UL << PMU_INTENSET_CNT2_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 2 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT3_ENABLE_Pos 3U /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT3_ENABLE_Msk (1UL << PMU_INTENSET_CNT3_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 3 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT4_ENABLE_Pos 4U /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT4_ENABLE_Msk (1UL << PMU_INTENSET_CNT4_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 4 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT5_ENABLE_Pos 5U /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT5_ENABLE_Msk (1UL << PMU_INTENSET_CNT5_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 5 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT6_ENABLE_Pos 6U /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT6_ENABLE_Msk (1UL << PMU_INTENSET_CNT6_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 6 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT7_ENABLE_Pos 7U /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT7_ENABLE_Msk (1UL << PMU_INTENSET_CNT7_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 7 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT8_ENABLE_Pos 8U /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT8_ENABLE_Msk (1UL << PMU_INTENSET_CNT8_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 8 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT9_ENABLE_Pos 9U /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT9_ENABLE_Msk (1UL << PMU_INTENSET_CNT9_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 9 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT10_ENABLE_Pos 10U /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT10_ENABLE_Msk (1UL << PMU_INTENSET_CNT10_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 10 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT11_ENABLE_Pos 11U /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT11_ENABLE_Msk (1UL << PMU_INTENSET_CNT11_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 11 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT12_ENABLE_Pos 12U /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT12_ENABLE_Msk (1UL << PMU_INTENSET_CNT12_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 12 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT13_ENABLE_Pos 13U /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT13_ENABLE_Msk (1UL << PMU_INTENSET_CNT13_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 13 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT14_ENABLE_Pos 14U /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT14_ENABLE_Msk (1UL << PMU_INTENSET_CNT14_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 14 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT15_ENABLE_Pos 15U /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT15_ENABLE_Msk (1UL << PMU_INTENSET_CNT15_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 15 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT16_ENABLE_Pos 16U /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT16_ENABLE_Msk (1UL << PMU_INTENSET_CNT16_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 16 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT17_ENABLE_Pos 17U /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT17_ENABLE_Msk (1UL << PMU_INTENSET_CNT17_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 17 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT18_ENABLE_Pos 18U /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT18_ENABLE_Msk (1UL << PMU_INTENSET_CNT18_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 18 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT19_ENABLE_Pos 19U /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT19_ENABLE_Msk (1UL << PMU_INTENSET_CNT19_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 19 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT20_ENABLE_Pos 20U /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT20_ENABLE_Msk (1UL << PMU_INTENSET_CNT20_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 20 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT21_ENABLE_Pos 21U /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT21_ENABLE_Msk (1UL << PMU_INTENSET_CNT21_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 21 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT22_ENABLE_Pos 22U /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT22_ENABLE_Msk (1UL << PMU_INTENSET_CNT22_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 22 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT23_ENABLE_Pos 23U /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT23_ENABLE_Msk (1UL << PMU_INTENSET_CNT23_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 23 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT24_ENABLE_Pos 24U /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT24_ENABLE_Msk (1UL << PMU_INTENSET_CNT24_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 24 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT25_ENABLE_Pos 25U /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT25_ENABLE_Msk (1UL << PMU_INTENSET_CNT25_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 25 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT26_ENABLE_Pos 26U /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT26_ENABLE_Msk (1UL << PMU_INTENSET_CNT26_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 26 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT27_ENABLE_Pos 27U /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT27_ENABLE_Msk (1UL << PMU_INTENSET_CNT27_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 27 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT28_ENABLE_Pos 28U /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT28_ENABLE_Msk (1UL << PMU_INTENSET_CNT28_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 28 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT29_ENABLE_Pos 29U /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT29_ENABLE_Msk (1UL << PMU_INTENSET_CNT29_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 29 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CNT30_ENABLE_Pos 30U /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Position */ +#define PMU_INTENSET_CNT30_ENABLE_Msk (1UL << PMU_INTENSET_CNT30_ENABLE_Pos) /*!< PMU INTENSET: Event Counter 30 Interrupt Enable Set Mask */ + +#define PMU_INTENSET_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Position */ +#define PMU_INTENSET_CCYCNT_ENABLE_Msk (1UL << PMU_INTENSET_CYCCNT_ENABLE_Pos) /*!< PMU INTENSET: Cycle Counter Interrupt Enable Set Mask */ + +/** \brief PMU Interrupt Enable Clear Register Definitions */ + +#define PMU_INTENSET_CNT0_ENABLE_Pos 0U /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT0_ENABLE_Msk (1UL /*<< PMU_INTENCLR_CNT0_ENABLE_Pos*/) /*!< PMU INTENCLR: Event Counter 0 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT1_ENABLE_Pos 1U /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT1_ENABLE_Msk (1UL << PMU_INTENCLR_CNT1_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 1 Interrupt Enable Clear */ + +#define PMU_INTENCLR_CNT2_ENABLE_Pos 2U /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT2_ENABLE_Msk (1UL << PMU_INTENCLR_CNT2_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 2 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT3_ENABLE_Pos 3U /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT3_ENABLE_Msk (1UL << PMU_INTENCLR_CNT3_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 3 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT4_ENABLE_Pos 4U /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT4_ENABLE_Msk (1UL << PMU_INTENCLR_CNT4_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 4 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT5_ENABLE_Pos 5U /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT5_ENABLE_Msk (1UL << PMU_INTENCLR_CNT5_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 5 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT6_ENABLE_Pos 6U /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT6_ENABLE_Msk (1UL << PMU_INTENCLR_CNT6_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 6 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT7_ENABLE_Pos 7U /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT7_ENABLE_Msk (1UL << PMU_INTENCLR_CNT7_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 7 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT8_ENABLE_Pos 8U /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT8_ENABLE_Msk (1UL << PMU_INTENCLR_CNT8_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 8 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT9_ENABLE_Pos 9U /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT9_ENABLE_Msk (1UL << PMU_INTENCLR_CNT9_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 9 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT10_ENABLE_Pos 10U /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT10_ENABLE_Msk (1UL << PMU_INTENCLR_CNT10_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 10 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT11_ENABLE_Pos 11U /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT11_ENABLE_Msk (1UL << PMU_INTENCLR_CNT11_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 11 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT12_ENABLE_Pos 12U /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT12_ENABLE_Msk (1UL << PMU_INTENCLR_CNT12_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 12 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT13_ENABLE_Pos 13U /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT13_ENABLE_Msk (1UL << PMU_INTENCLR_CNT13_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 13 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT14_ENABLE_Pos 14U /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT14_ENABLE_Msk (1UL << PMU_INTENCLR_CNT14_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 14 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT15_ENABLE_Pos 15U /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT15_ENABLE_Msk (1UL << PMU_INTENCLR_CNT15_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 15 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT16_ENABLE_Pos 16U /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT16_ENABLE_Msk (1UL << PMU_INTENCLR_CNT16_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 16 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT17_ENABLE_Pos 17U /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT17_ENABLE_Msk (1UL << PMU_INTENCLR_CNT17_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 17 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT18_ENABLE_Pos 18U /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT18_ENABLE_Msk (1UL << PMU_INTENCLR_CNT18_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 18 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT19_ENABLE_Pos 19U /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT19_ENABLE_Msk (1UL << PMU_INTENCLR_CNT19_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 19 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT20_ENABLE_Pos 20U /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT20_ENABLE_Msk (1UL << PMU_INTENCLR_CNT20_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 20 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT21_ENABLE_Pos 21U /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT21_ENABLE_Msk (1UL << PMU_INTENCLR_CNT21_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 21 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT22_ENABLE_Pos 22U /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT22_ENABLE_Msk (1UL << PMU_INTENCLR_CNT22_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 22 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT23_ENABLE_Pos 23U /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT23_ENABLE_Msk (1UL << PMU_INTENCLR_CNT23_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 23 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT24_ENABLE_Pos 24U /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT24_ENABLE_Msk (1UL << PMU_INTENCLR_CNT24_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 24 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT25_ENABLE_Pos 25U /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT25_ENABLE_Msk (1UL << PMU_INTENCLR_CNT25_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 25 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT26_ENABLE_Pos 26U /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT26_ENABLE_Msk (1UL << PMU_INTENCLR_CNT26_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 26 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT27_ENABLE_Pos 27U /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT27_ENABLE_Msk (1UL << PMU_INTENCLR_CNT27_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 27 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT28_ENABLE_Pos 28U /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT28_ENABLE_Msk (1UL << PMU_INTENCLR_CNT28_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 28 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT29_ENABLE_Pos 29U /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT29_ENABLE_Msk (1UL << PMU_INTENCLR_CNT29_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 29 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CNT30_ENABLE_Pos 30U /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CNT30_ENABLE_Msk (1UL << PMU_INTENCLR_CNT30_ENABLE_Pos) /*!< PMU INTENCLR: Event Counter 30 Interrupt Enable Clear Mask */ + +#define PMU_INTENCLR_CYCCNT_ENABLE_Pos 31U /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Position */ +#define PMU_INTENCLR_CYCCNT_ENABLE_Msk (1UL << PMU_INTENCLR_CYCCNT_ENABLE_Pos) /*!< PMU INTENCLR: Cycle Counter Interrupt Enable Clear Mask */ + +/** \brief PMU Overflow Flag Status Set Register Definitions */ + +#define PMU_OVSSET_CNT0_STATUS_Pos 0U /*!< PMU OVSSET: Event Counter 0 Overflow Set Position */ +#define PMU_OVSSET_CNT0_STATUS_Msk (1UL /*<< PMU_OVSSET_CNT0_STATUS_Pos*/) /*!< PMU OVSSET: Event Counter 0 Overflow Set Mask */ + +#define PMU_OVSSET_CNT1_STATUS_Pos 1U /*!< PMU OVSSET: Event Counter 1 Overflow Set Position */ +#define PMU_OVSSET_CNT1_STATUS_Msk (1UL << PMU_OVSSET_CNT1_STATUS_Pos) /*!< PMU OVSSET: Event Counter 1 Overflow Set Mask */ + +#define PMU_OVSSET_CNT2_STATUS_Pos 2U /*!< PMU OVSSET: Event Counter 2 Overflow Set Position */ +#define PMU_OVSSET_CNT2_STATUS_Msk (1UL << PMU_OVSSET_CNT2_STATUS_Pos) /*!< PMU OVSSET: Event Counter 2 Overflow Set Mask */ + +#define PMU_OVSSET_CNT3_STATUS_Pos 3U /*!< PMU OVSSET: Event Counter 3 Overflow Set Position */ +#define PMU_OVSSET_CNT3_STATUS_Msk (1UL << PMU_OVSSET_CNT3_STATUS_Pos) /*!< PMU OVSSET: Event Counter 3 Overflow Set Mask */ + +#define PMU_OVSSET_CNT4_STATUS_Pos 4U /*!< PMU OVSSET: Event Counter 4 Overflow Set Position */ +#define PMU_OVSSET_CNT4_STATUS_Msk (1UL << PMU_OVSSET_CNT4_STATUS_Pos) /*!< PMU OVSSET: Event Counter 4 Overflow Set Mask */ + +#define PMU_OVSSET_CNT5_STATUS_Pos 5U /*!< PMU OVSSET: Event Counter 5 Overflow Set Position */ +#define PMU_OVSSET_CNT5_STATUS_Msk (1UL << PMU_OVSSET_CNT5_STATUS_Pos) /*!< PMU OVSSET: Event Counter 5 Overflow Set Mask */ + +#define PMU_OVSSET_CNT6_STATUS_Pos 6U /*!< PMU OVSSET: Event Counter 6 Overflow Set Position */ +#define PMU_OVSSET_CNT6_STATUS_Msk (1UL << PMU_OVSSET_CNT6_STATUS_Pos) /*!< PMU OVSSET: Event Counter 6 Overflow Set Mask */ + +#define PMU_OVSSET_CNT7_STATUS_Pos 7U /*!< PMU OVSSET: Event Counter 7 Overflow Set Position */ +#define PMU_OVSSET_CNT7_STATUS_Msk (1UL << PMU_OVSSET_CNT7_STATUS_Pos) /*!< PMU OVSSET: Event Counter 7 Overflow Set Mask */ + +#define PMU_OVSSET_CNT8_STATUS_Pos 8U /*!< PMU OVSSET: Event Counter 8 Overflow Set Position */ +#define PMU_OVSSET_CNT8_STATUS_Msk (1UL << PMU_OVSSET_CNT8_STATUS_Pos) /*!< PMU OVSSET: Event Counter 8 Overflow Set Mask */ + +#define PMU_OVSSET_CNT9_STATUS_Pos 9U /*!< PMU OVSSET: Event Counter 9 Overflow Set Position */ +#define PMU_OVSSET_CNT9_STATUS_Msk (1UL << PMU_OVSSET_CNT9_STATUS_Pos) /*!< PMU OVSSET: Event Counter 9 Overflow Set Mask */ + +#define PMU_OVSSET_CNT10_STATUS_Pos 10U /*!< PMU OVSSET: Event Counter 10 Overflow Set Position */ +#define PMU_OVSSET_CNT10_STATUS_Msk (1UL << PMU_OVSSET_CNT10_STATUS_Pos) /*!< PMU OVSSET: Event Counter 10 Overflow Set Mask */ + +#define PMU_OVSSET_CNT11_STATUS_Pos 11U /*!< PMU OVSSET: Event Counter 11 Overflow Set Position */ +#define PMU_OVSSET_CNT11_STATUS_Msk (1UL << PMU_OVSSET_CNT11_STATUS_Pos) /*!< PMU OVSSET: Event Counter 11 Overflow Set Mask */ + +#define PMU_OVSSET_CNT12_STATUS_Pos 12U /*!< PMU OVSSET: Event Counter 12 Overflow Set Position */ +#define PMU_OVSSET_CNT12_STATUS_Msk (1UL << PMU_OVSSET_CNT12_STATUS_Pos) /*!< PMU OVSSET: Event Counter 12 Overflow Set Mask */ + +#define PMU_OVSSET_CNT13_STATUS_Pos 13U /*!< PMU OVSSET: Event Counter 13 Overflow Set Position */ +#define PMU_OVSSET_CNT13_STATUS_Msk (1UL << PMU_OVSSET_CNT13_STATUS_Pos) /*!< PMU OVSSET: Event Counter 13 Overflow Set Mask */ + +#define PMU_OVSSET_CNT14_STATUS_Pos 14U /*!< PMU OVSSET: Event Counter 14 Overflow Set Position */ +#define PMU_OVSSET_CNT14_STATUS_Msk (1UL << PMU_OVSSET_CNT14_STATUS_Pos) /*!< PMU OVSSET: Event Counter 14 Overflow Set Mask */ + +#define PMU_OVSSET_CNT15_STATUS_Pos 15U /*!< PMU OVSSET: Event Counter 15 Overflow Set Position */ +#define PMU_OVSSET_CNT15_STATUS_Msk (1UL << PMU_OVSSET_CNT15_STATUS_Pos) /*!< PMU OVSSET: Event Counter 15 Overflow Set Mask */ + +#define PMU_OVSSET_CNT16_STATUS_Pos 16U /*!< PMU OVSSET: Event Counter 16 Overflow Set Position */ +#define PMU_OVSSET_CNT16_STATUS_Msk (1UL << PMU_OVSSET_CNT16_STATUS_Pos) /*!< PMU OVSSET: Event Counter 16 Overflow Set Mask */ + +#define PMU_OVSSET_CNT17_STATUS_Pos 17U /*!< PMU OVSSET: Event Counter 17 Overflow Set Position */ +#define PMU_OVSSET_CNT17_STATUS_Msk (1UL << PMU_OVSSET_CNT17_STATUS_Pos) /*!< PMU OVSSET: Event Counter 17 Overflow Set Mask */ + +#define PMU_OVSSET_CNT18_STATUS_Pos 18U /*!< PMU OVSSET: Event Counter 18 Overflow Set Position */ +#define PMU_OVSSET_CNT18_STATUS_Msk (1UL << PMU_OVSSET_CNT18_STATUS_Pos) /*!< PMU OVSSET: Event Counter 18 Overflow Set Mask */ + +#define PMU_OVSSET_CNT19_STATUS_Pos 19U /*!< PMU OVSSET: Event Counter 19 Overflow Set Position */ +#define PMU_OVSSET_CNT19_STATUS_Msk (1UL << PMU_OVSSET_CNT19_STATUS_Pos) /*!< PMU OVSSET: Event Counter 19 Overflow Set Mask */ + +#define PMU_OVSSET_CNT20_STATUS_Pos 20U /*!< PMU OVSSET: Event Counter 20 Overflow Set Position */ +#define PMU_OVSSET_CNT20_STATUS_Msk (1UL << PMU_OVSSET_CNT20_STATUS_Pos) /*!< PMU OVSSET: Event Counter 20 Overflow Set Mask */ + +#define PMU_OVSSET_CNT21_STATUS_Pos 21U /*!< PMU OVSSET: Event Counter 21 Overflow Set Position */ +#define PMU_OVSSET_CNT21_STATUS_Msk (1UL << PMU_OVSSET_CNT21_STATUS_Pos) /*!< PMU OVSSET: Event Counter 21 Overflow Set Mask */ + +#define PMU_OVSSET_CNT22_STATUS_Pos 22U /*!< PMU OVSSET: Event Counter 22 Overflow Set Position */ +#define PMU_OVSSET_CNT22_STATUS_Msk (1UL << PMU_OVSSET_CNT22_STATUS_Pos) /*!< PMU OVSSET: Event Counter 22 Overflow Set Mask */ + +#define PMU_OVSSET_CNT23_STATUS_Pos 23U /*!< PMU OVSSET: Event Counter 23 Overflow Set Position */ +#define PMU_OVSSET_CNT23_STATUS_Msk (1UL << PMU_OVSSET_CNT23_STATUS_Pos) /*!< PMU OVSSET: Event Counter 23 Overflow Set Mask */ + +#define PMU_OVSSET_CNT24_STATUS_Pos 24U /*!< PMU OVSSET: Event Counter 24 Overflow Set Position */ +#define PMU_OVSSET_CNT24_STATUS_Msk (1UL << PMU_OVSSET_CNT24_STATUS_Pos) /*!< PMU OVSSET: Event Counter 24 Overflow Set Mask */ + +#define PMU_OVSSET_CNT25_STATUS_Pos 25U /*!< PMU OVSSET: Event Counter 25 Overflow Set Position */ +#define PMU_OVSSET_CNT25_STATUS_Msk (1UL << PMU_OVSSET_CNT25_STATUS_Pos) /*!< PMU OVSSET: Event Counter 25 Overflow Set Mask */ + +#define PMU_OVSSET_CNT26_STATUS_Pos 26U /*!< PMU OVSSET: Event Counter 26 Overflow Set Position */ +#define PMU_OVSSET_CNT26_STATUS_Msk (1UL << PMU_OVSSET_CNT26_STATUS_Pos) /*!< PMU OVSSET: Event Counter 26 Overflow Set Mask */ + +#define PMU_OVSSET_CNT27_STATUS_Pos 27U /*!< PMU OVSSET: Event Counter 27 Overflow Set Position */ +#define PMU_OVSSET_CNT27_STATUS_Msk (1UL << PMU_OVSSET_CNT27_STATUS_Pos) /*!< PMU OVSSET: Event Counter 27 Overflow Set Mask */ + +#define PMU_OVSSET_CNT28_STATUS_Pos 28U /*!< PMU OVSSET: Event Counter 28 Overflow Set Position */ +#define PMU_OVSSET_CNT28_STATUS_Msk (1UL << PMU_OVSSET_CNT28_STATUS_Pos) /*!< PMU OVSSET: Event Counter 28 Overflow Set Mask */ + +#define PMU_OVSSET_CNT29_STATUS_Pos 29U /*!< PMU OVSSET: Event Counter 29 Overflow Set Position */ +#define PMU_OVSSET_CNT29_STATUS_Msk (1UL << PMU_OVSSET_CNT29_STATUS_Pos) /*!< PMU OVSSET: Event Counter 29 Overflow Set Mask */ + +#define PMU_OVSSET_CNT30_STATUS_Pos 30U /*!< PMU OVSSET: Event Counter 30 Overflow Set Position */ +#define PMU_OVSSET_CNT30_STATUS_Msk (1UL << PMU_OVSSET_CNT30_STATUS_Pos) /*!< PMU OVSSET: Event Counter 30 Overflow Set Mask */ + +#define PMU_OVSSET_CYCCNT_STATUS_Pos 31U /*!< PMU OVSSET: Cycle Counter Overflow Set Position */ +#define PMU_OVSSET_CYCCNT_STATUS_Msk (1UL << PMU_OVSSET_CYCCNT_STATUS_Pos) /*!< PMU OVSSET: Cycle Counter Overflow Set Mask */ + +/** \brief PMU Overflow Flag Status Clear Register Definitions */ + +#define PMU_OVSCLR_CNT0_STATUS_Pos 0U /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Position */ +#define PMU_OVSCLR_CNT0_STATUS_Msk (1UL /*<< PMU_OVSCLR_CNT0_STATUS_Pos*/) /*!< PMU OVSCLR: Event Counter 0 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT1_STATUS_Pos 1U /*!< PMU OVSCLR: Event Counter 1 Overflow Clear Position */ +#define PMU_OVSCLR_CNT1_STATUS_Msk (1UL << PMU_OVSCLR_CNT1_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 1 Overflow Clear */ + +#define PMU_OVSCLR_CNT2_STATUS_Pos 2U /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Position */ +#define PMU_OVSCLR_CNT2_STATUS_Msk (1UL << PMU_OVSCLR_CNT2_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 2 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT3_STATUS_Pos 3U /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Position */ +#define PMU_OVSCLR_CNT3_STATUS_Msk (1UL << PMU_OVSCLR_CNT3_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 3 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT4_STATUS_Pos 4U /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Position */ +#define PMU_OVSCLR_CNT4_STATUS_Msk (1UL << PMU_OVSCLR_CNT4_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 4 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT5_STATUS_Pos 5U /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Position */ +#define PMU_OVSCLR_CNT5_STATUS_Msk (1UL << PMU_OVSCLR_CNT5_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 5 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT6_STATUS_Pos 6U /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Position */ +#define PMU_OVSCLR_CNT6_STATUS_Msk (1UL << PMU_OVSCLR_CNT6_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 6 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT7_STATUS_Pos 7U /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Position */ +#define PMU_OVSCLR_CNT7_STATUS_Msk (1UL << PMU_OVSCLR_CNT7_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 7 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT8_STATUS_Pos 8U /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Position */ +#define PMU_OVSCLR_CNT8_STATUS_Msk (1UL << PMU_OVSCLR_CNT8_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 8 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT9_STATUS_Pos 9U /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Position */ +#define PMU_OVSCLR_CNT9_STATUS_Msk (1UL << PMU_OVSCLR_CNT9_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 9 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT10_STATUS_Pos 10U /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Position */ +#define PMU_OVSCLR_CNT10_STATUS_Msk (1UL << PMU_OVSCLR_CNT10_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 10 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT11_STATUS_Pos 11U /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Position */ +#define PMU_OVSCLR_CNT11_STATUS_Msk (1UL << PMU_OVSCLR_CNT11_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 11 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT12_STATUS_Pos 12U /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Position */ +#define PMU_OVSCLR_CNT12_STATUS_Msk (1UL << PMU_OVSCLR_CNT12_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 12 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT13_STATUS_Pos 13U /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Position */ +#define PMU_OVSCLR_CNT13_STATUS_Msk (1UL << PMU_OVSCLR_CNT13_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 13 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT14_STATUS_Pos 14U /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Position */ +#define PMU_OVSCLR_CNT14_STATUS_Msk (1UL << PMU_OVSCLR_CNT14_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 14 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT15_STATUS_Pos 15U /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Position */ +#define PMU_OVSCLR_CNT15_STATUS_Msk (1UL << PMU_OVSCLR_CNT15_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 15 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT16_STATUS_Pos 16U /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Position */ +#define PMU_OVSCLR_CNT16_STATUS_Msk (1UL << PMU_OVSCLR_CNT16_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 16 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT17_STATUS_Pos 17U /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Position */ +#define PMU_OVSCLR_CNT17_STATUS_Msk (1UL << PMU_OVSCLR_CNT17_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 17 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT18_STATUS_Pos 18U /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Position */ +#define PMU_OVSCLR_CNT18_STATUS_Msk (1UL << PMU_OVSCLR_CNT18_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 18 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT19_STATUS_Pos 19U /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Position */ +#define PMU_OVSCLR_CNT19_STATUS_Msk (1UL << PMU_OVSCLR_CNT19_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 19 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT20_STATUS_Pos 20U /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Position */ +#define PMU_OVSCLR_CNT20_STATUS_Msk (1UL << PMU_OVSCLR_CNT20_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 20 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT21_STATUS_Pos 21U /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Position */ +#define PMU_OVSCLR_CNT21_STATUS_Msk (1UL << PMU_OVSCLR_CNT21_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 21 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT22_STATUS_Pos 22U /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Position */ +#define PMU_OVSCLR_CNT22_STATUS_Msk (1UL << PMU_OVSCLR_CNT22_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 22 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT23_STATUS_Pos 23U /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Position */ +#define PMU_OVSCLR_CNT23_STATUS_Msk (1UL << PMU_OVSCLR_CNT23_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 23 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT24_STATUS_Pos 24U /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Position */ +#define PMU_OVSCLR_CNT24_STATUS_Msk (1UL << PMU_OVSCLR_CNT24_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 24 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT25_STATUS_Pos 25U /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Position */ +#define PMU_OVSCLR_CNT25_STATUS_Msk (1UL << PMU_OVSCLR_CNT25_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 25 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT26_STATUS_Pos 26U /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Position */ +#define PMU_OVSCLR_CNT26_STATUS_Msk (1UL << PMU_OVSCLR_CNT26_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 26 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT27_STATUS_Pos 27U /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Position */ +#define PMU_OVSCLR_CNT27_STATUS_Msk (1UL << PMU_OVSCLR_CNT27_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 27 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT28_STATUS_Pos 28U /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Position */ +#define PMU_OVSCLR_CNT28_STATUS_Msk (1UL << PMU_OVSCLR_CNT28_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 28 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT29_STATUS_Pos 29U /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Position */ +#define PMU_OVSCLR_CNT29_STATUS_Msk (1UL << PMU_OVSCLR_CNT29_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 29 Overflow Clear Mask */ + +#define PMU_OVSCLR_CNT30_STATUS_Pos 30U /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Position */ +#define PMU_OVSCLR_CNT30_STATUS_Msk (1UL << PMU_OVSCLR_CNT30_STATUS_Pos) /*!< PMU OVSCLR: Event Counter 30 Overflow Clear Mask */ + +#define PMU_OVSCLR_CYCCNT_STATUS_Pos 31U /*!< PMU OVSCLR: Cycle Counter Overflow Clear Position */ +#define PMU_OVSCLR_CYCCNT_STATUS_Msk (1UL << PMU_OVSCLR_CYCCNT_STATUS_Pos) /*!< PMU OVSCLR: Cycle Counter Overflow Clear Mask */ + +/** \brief PMU Software Increment Counter */ + +#define PMU_SWINC_CNT0_Pos 0U /*!< PMU SWINC: Event Counter 0 Software Increment Position */ +#define PMU_SWINC_CNT0_Msk (1UL /*<< PMU_SWINC_CNT0_Pos */) /*!< PMU SWINC: Event Counter 0 Software Increment Mask */ + +#define PMU_SWINC_CNT1_Pos 1U /*!< PMU SWINC: Event Counter 1 Software Increment Position */ +#define PMU_SWINC_CNT1_Msk (1UL << PMU_SWINC_CNT1_Pos) /*!< PMU SWINC: Event Counter 1 Software Increment Mask */ + +#define PMU_SWINC_CNT2_Pos 2U /*!< PMU SWINC: Event Counter 2 Software Increment Position */ +#define PMU_SWINC_CNT2_Msk (1UL << PMU_SWINC_CNT2_Pos) /*!< PMU SWINC: Event Counter 2 Software Increment Mask */ + +#define PMU_SWINC_CNT3_Pos 3U /*!< PMU SWINC: Event Counter 3 Software Increment Position */ +#define PMU_SWINC_CNT3_Msk (1UL << PMU_SWINC_CNT3_Pos) /*!< PMU SWINC: Event Counter 3 Software Increment Mask */ + +#define PMU_SWINC_CNT4_Pos 4U /*!< PMU SWINC: Event Counter 4 Software Increment Position */ +#define PMU_SWINC_CNT4_Msk (1UL << PMU_SWINC_CNT4_Pos) /*!< PMU SWINC: Event Counter 4 Software Increment Mask */ + +#define PMU_SWINC_CNT5_Pos 5U /*!< PMU SWINC: Event Counter 5 Software Increment Position */ +#define PMU_SWINC_CNT5_Msk (1UL << PMU_SWINC_CNT5_Pos) /*!< PMU SWINC: Event Counter 5 Software Increment Mask */ + +#define PMU_SWINC_CNT6_Pos 6U /*!< PMU SWINC: Event Counter 6 Software Increment Position */ +#define PMU_SWINC_CNT6_Msk (1UL << PMU_SWINC_CNT6_Pos) /*!< PMU SWINC: Event Counter 6 Software Increment Mask */ + +#define PMU_SWINC_CNT7_Pos 7U /*!< PMU SWINC: Event Counter 7 Software Increment Position */ +#define PMU_SWINC_CNT7_Msk (1UL << PMU_SWINC_CNT7_Pos) /*!< PMU SWINC: Event Counter 7 Software Increment Mask */ + +#define PMU_SWINC_CNT8_Pos 8U /*!< PMU SWINC: Event Counter 8 Software Increment Position */ +#define PMU_SWINC_CNT8_Msk (1UL << PMU_SWINC_CNT8_Pos) /*!< PMU SWINC: Event Counter 8 Software Increment Mask */ + +#define PMU_SWINC_CNT9_Pos 9U /*!< PMU SWINC: Event Counter 9 Software Increment Position */ +#define PMU_SWINC_CNT9_Msk (1UL << PMU_SWINC_CNT9_Pos) /*!< PMU SWINC: Event Counter 9 Software Increment Mask */ + +#define PMU_SWINC_CNT10_Pos 10U /*!< PMU SWINC: Event Counter 10 Software Increment Position */ +#define PMU_SWINC_CNT10_Msk (1UL << PMU_SWINC_CNT10_Pos) /*!< PMU SWINC: Event Counter 10 Software Increment Mask */ + +#define PMU_SWINC_CNT11_Pos 11U /*!< PMU SWINC: Event Counter 11 Software Increment Position */ +#define PMU_SWINC_CNT11_Msk (1UL << PMU_SWINC_CNT11_Pos) /*!< PMU SWINC: Event Counter 11 Software Increment Mask */ + +#define PMU_SWINC_CNT12_Pos 12U /*!< PMU SWINC: Event Counter 12 Software Increment Position */ +#define PMU_SWINC_CNT12_Msk (1UL << PMU_SWINC_CNT12_Pos) /*!< PMU SWINC: Event Counter 12 Software Increment Mask */ + +#define PMU_SWINC_CNT13_Pos 13U /*!< PMU SWINC: Event Counter 13 Software Increment Position */ +#define PMU_SWINC_CNT13_Msk (1UL << PMU_SWINC_CNT13_Pos) /*!< PMU SWINC: Event Counter 13 Software Increment Mask */ + +#define PMU_SWINC_CNT14_Pos 14U /*!< PMU SWINC: Event Counter 14 Software Increment Position */ +#define PMU_SWINC_CNT14_Msk (1UL << PMU_SWINC_CNT14_Pos) /*!< PMU SWINC: Event Counter 14 Software Increment Mask */ + +#define PMU_SWINC_CNT15_Pos 15U /*!< PMU SWINC: Event Counter 15 Software Increment Position */ +#define PMU_SWINC_CNT15_Msk (1UL << PMU_SWINC_CNT15_Pos) /*!< PMU SWINC: Event Counter 15 Software Increment Mask */ + +#define PMU_SWINC_CNT16_Pos 16U /*!< PMU SWINC: Event Counter 16 Software Increment Position */ +#define PMU_SWINC_CNT16_Msk (1UL << PMU_SWINC_CNT16_Pos) /*!< PMU SWINC: Event Counter 16 Software Increment Mask */ + +#define PMU_SWINC_CNT17_Pos 17U /*!< PMU SWINC: Event Counter 17 Software Increment Position */ +#define PMU_SWINC_CNT17_Msk (1UL << PMU_SWINC_CNT17_Pos) /*!< PMU SWINC: Event Counter 17 Software Increment Mask */ + +#define PMU_SWINC_CNT18_Pos 18U /*!< PMU SWINC: Event Counter 18 Software Increment Position */ +#define PMU_SWINC_CNT18_Msk (1UL << PMU_SWINC_CNT18_Pos) /*!< PMU SWINC: Event Counter 18 Software Increment Mask */ + +#define PMU_SWINC_CNT19_Pos 19U /*!< PMU SWINC: Event Counter 19 Software Increment Position */ +#define PMU_SWINC_CNT19_Msk (1UL << PMU_SWINC_CNT19_Pos) /*!< PMU SWINC: Event Counter 19 Software Increment Mask */ + +#define PMU_SWINC_CNT20_Pos 20U /*!< PMU SWINC: Event Counter 20 Software Increment Position */ +#define PMU_SWINC_CNT20_Msk (1UL << PMU_SWINC_CNT20_Pos) /*!< PMU SWINC: Event Counter 20 Software Increment Mask */ + +#define PMU_SWINC_CNT21_Pos 21U /*!< PMU SWINC: Event Counter 21 Software Increment Position */ +#define PMU_SWINC_CNT21_Msk (1UL << PMU_SWINC_CNT21_Pos) /*!< PMU SWINC: Event Counter 21 Software Increment Mask */ + +#define PMU_SWINC_CNT22_Pos 22U /*!< PMU SWINC: Event Counter 22 Software Increment Position */ +#define PMU_SWINC_CNT22_Msk (1UL << PMU_SWINC_CNT22_Pos) /*!< PMU SWINC: Event Counter 22 Software Increment Mask */ + +#define PMU_SWINC_CNT23_Pos 23U /*!< PMU SWINC: Event Counter 23 Software Increment Position */ +#define PMU_SWINC_CNT23_Msk (1UL << PMU_SWINC_CNT23_Pos) /*!< PMU SWINC: Event Counter 23 Software Increment Mask */ + +#define PMU_SWINC_CNT24_Pos 24U /*!< PMU SWINC: Event Counter 24 Software Increment Position */ +#define PMU_SWINC_CNT24_Msk (1UL << PMU_SWINC_CNT24_Pos) /*!< PMU SWINC: Event Counter 24 Software Increment Mask */ + +#define PMU_SWINC_CNT25_Pos 25U /*!< PMU SWINC: Event Counter 25 Software Increment Position */ +#define PMU_SWINC_CNT25_Msk (1UL << PMU_SWINC_CNT25_Pos) /*!< PMU SWINC: Event Counter 25 Software Increment Mask */ + +#define PMU_SWINC_CNT26_Pos 26U /*!< PMU SWINC: Event Counter 26 Software Increment Position */ +#define PMU_SWINC_CNT26_Msk (1UL << PMU_SWINC_CNT26_Pos) /*!< PMU SWINC: Event Counter 26 Software Increment Mask */ + +#define PMU_SWINC_CNT27_Pos 27U /*!< PMU SWINC: Event Counter 27 Software Increment Position */ +#define PMU_SWINC_CNT27_Msk (1UL << PMU_SWINC_CNT27_Pos) /*!< PMU SWINC: Event Counter 27 Software Increment Mask */ + +#define PMU_SWINC_CNT28_Pos 28U /*!< PMU SWINC: Event Counter 28 Software Increment Position */ +#define PMU_SWINC_CNT28_Msk (1UL << PMU_SWINC_CNT28_Pos) /*!< PMU SWINC: Event Counter 28 Software Increment Mask */ + +#define PMU_SWINC_CNT29_Pos 29U /*!< PMU SWINC: Event Counter 29 Software Increment Position */ +#define PMU_SWINC_CNT29_Msk (1UL << PMU_SWINC_CNT29_Pos) /*!< PMU SWINC: Event Counter 29 Software Increment Mask */ + +#define PMU_SWINC_CNT30_Pos 30U /*!< PMU SWINC: Event Counter 30 Software Increment Position */ +#define PMU_SWINC_CNT30_Msk (1UL << PMU_SWINC_CNT30_Pos) /*!< PMU SWINC: Event Counter 30 Software Increment Mask */ + +/** \brief PMU Control Register Definitions */ + +#define PMU_CTRL_ENABLE_Pos 0U /*!< PMU CTRL: ENABLE Position */ +#define PMU_CTRL_ENABLE_Msk (1UL /*<< PMU_CTRL_ENABLE_Pos*/) /*!< PMU CTRL: ENABLE Mask */ + +#define PMU_CTRL_EVENTCNT_RESET_Pos 1U /*!< PMU CTRL: Event Counter Reset Position */ +#define PMU_CTRL_EVENTCNT_RESET_Msk (1UL << PMU_CTRL_EVENTCNT_RESET_Pos) /*!< PMU CTRL: Event Counter Reset Mask */ + +#define PMU_CTRL_CYCCNT_RESET_Pos 2U /*!< PMU CTRL: Cycle Counter Reset Position */ +#define PMU_CTRL_CYCCNT_RESET_Msk (1UL << PMU_CTRL_CYCCNT_RESET_Pos) /*!< PMU CTRL: Cycle Counter Reset Mask */ + +#define PMU_CTRL_CYCCNT_DISABLE_Pos 5U /*!< PMU CTRL: Disable Cycle Counter Position */ +#define PMU_CTRL_CYCCNT_DISABLE_Msk (1UL << PMU_CTRL_CYCCNT_DISABLE_Pos) /*!< PMU CTRL: Disable Cycle Counter Mask */ + +#define PMU_CTRL_FRZ_ON_OV_Pos 9U /*!< PMU CTRL: Freeze-on-overflow Position */ +#define PMU_CTRL_FRZ_ON_OV_Msk (1UL << PMU_CTRL_FRZ_ON_OVERFLOW_Pos) /*!< PMU CTRL: Freeze-on-overflow Mask */ + +#define PMU_CTRL_TRACE_ON_OV_Pos 11U /*!< PMU CTRL: Trace-on-overflow Position */ +#define PMU_CTRL_TRACE_ON_OV_Msk (1UL << PMU_CTRL_TRACE_ON_OVERFLOW_Pos) /*!< PMU CTRL: Trace-on-overflow Mask */ + +/** \brief PMU Type Register Definitions */ + +#define PMU_TYPE_NUM_CNTS_Pos 0U /*!< PMU TYPE: Number of Counters Position */ +#define PMU_TYPE_NUM_CNTS_Msk (0xFFUL /*<< PMU_TYPE_NUM_CNTS_Pos*/) /*!< PMU TYPE: Number of Counters Mask */ + +#define PMU_TYPE_SIZE_CNTS_Pos 8U /*!< PMU TYPE: Size of Counters Position */ +#define PMU_TYPE_SIZE_CNTS_Msk (0x3FUL << PMU_TYPE_SIZE_CNTS_Pos) /*!< PMU TYPE: Size of Counters Mask */ + +#define PMU_TYPE_CYCCNT_PRESENT_Pos 14U /*!< PMU TYPE: Cycle Counter Present Position */ +#define PMU_TYPE_CYCCNT_PRESENT_Msk (1UL << PMU_TYPE_CYCCNT_PRESENT_Pos) /*!< PMU TYPE: Cycle Counter Present Mask */ + +#define PMU_TYPE_FRZ_OV_SUPPORT_Pos 21U /*!< PMU TYPE: Freeze-on-overflow Support Position */ +#define PMU_TYPE_FRZ_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Freeze-on-overflow Support Mask */ + +#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Pos 23U /*!< PMU TYPE: Trace-on-overflow Support Position */ +#define PMU_TYPE_TRACE_ON_OV_SUPPORT_Msk (1UL << PMU_TYPE_FRZ_OV_SUPPORT_Pos) /*!< PMU TYPE: Trace-on-overflow Support Mask */ + +/** \brief PMU Authentication Status Register Definitions */ + +#define PMU_AUTHSTATUS_NSID_Pos 0U /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Position */ +#define PMU_AUTHSTATUS_NSID_Msk (0x3UL /*<< PMU_AUTHSTATUS_NSID_Pos*/) /*!< PMU AUTHSTATUS: Non-secure Invasive Debug Mask */ + +#define PMU_AUTHSTATUS_NSNID_Pos 2U /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Position */ +#define PMU_AUTHSTATUS_NSNID_Msk (0x3UL << PMU_AUTHSTATUS_NSNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Non-invasive Debug Mask */ + +#define PMU_AUTHSTATUS_SID_Pos 4U /*!< PMU AUTHSTATUS: Secure Invasive Debug Position */ +#define PMU_AUTHSTATUS_SID_Msk (0x3UL << PMU_AUTHSTATUS_SID_Pos) /*!< PMU AUTHSTATUS: Secure Invasive Debug Mask */ + +#define PMU_AUTHSTATUS_SNID_Pos 6U /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Position */ +#define PMU_AUTHSTATUS_SNID_Msk (0x3UL << PMU_AUTHSTATUS_SNID_Pos) /*!< PMU AUTHSTATUS: Secure Non-invasive Debug Mask */ + +#define PMU_AUTHSTATUS_NSUID_Pos 16U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Position */ +#define PMU_AUTHSTATUS_NSUID_Msk (0x3UL << PMU_AUTHSTATUS_NSUID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Invasive Debug Mask */ + +#define PMU_AUTHSTATUS_NSUNID_Pos 18U /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Position */ +#define PMU_AUTHSTATUS_NSUNID_Msk (0x3UL << PMU_AUTHSTATUS_NSUNID_Pos) /*!< PMU AUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Mask */ + +#define PMU_AUTHSTATUS_SUID_Pos 20U /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Position */ +#define PMU_AUTHSTATUS_SUID_Msk (0x3UL << PMU_AUTHSTATUS_SUID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Invasive Debug Mask */ + +#define PMU_AUTHSTATUS_SUNID_Pos 22U /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Position */ +#define PMU_AUTHSTATUS_SUNID_Msk (0x3UL << PMU_AUTHSTATUS_SUNID_Pos) /*!< PMU AUTHSTATUS: Secure Unprivileged Non-invasive Debug Mask */ + + +/*@} end of group CMSIS_PMU */ +#endif + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_PXN_Pos 4U /*!< MPU RLAR: PXN Position */ +#define MPU_RLAR_PXN_Msk (1UL << MPU_RLAR_PXN_Pos) /*!< MPU RLAR: PXN Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +#define FPU_FPDSCR_FZ16_Pos 19U /*!< FPDSCR: FZ16 bit Position */ +#define FPU_FPDSCR_FZ16_Msk (1UL << FPU_FPDSCR_FZ16_Pos) /*!< FPDSCR: FZ16 bit Mask */ + +#define FPU_FPDSCR_LTPSIZE_Pos 16U /*!< FPDSCR: LTPSIZE bit Position */ +#define FPU_FPDSCR_LTPSIZE_Msk (7UL << FPU_FPDSCR_LTPSIZE_Pos) /*!< FPDSCR: LTPSIZE bit Mask */ + +/* Media and VFP Feature Register 0 Definitions */ +#define FPU_MVFR0_FPRound_Pos 28U /*!< MVFR0: FPRound bits Position */ +#define FPU_MVFR0_FPRound_Msk (0xFUL << FPU_MVFR0_FPRound_Pos) /*!< MVFR0: FPRound bits Mask */ + +#define FPU_MVFR0_FPSqrt_Pos 20U /*!< MVFR0: FPSqrt bits Position */ +#define FPU_MVFR0_FPSqrt_Msk (0xFUL << FPU_MVFR0_FPSqrt_Pos) /*!< MVFR0: FPSqrt bits Mask */ + +#define FPU_MVFR0_FPDivide_Pos 16U /*!< MVFR0: FPDivide bits Position */ +#define FPU_MVFR0_FPDivide_Msk (0xFUL << FPU_MVFR0_FPDivide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FPDP_Pos 8U /*!< MVFR0: FPDP bits Position */ +#define FPU_MVFR0_FPDP_Msk (0xFUL << FPU_MVFR0_FPDP_Pos) /*!< MVFR0: FPDP bits Mask */ + +#define FPU_MVFR0_FPSP_Pos 4U /*!< MVFR0: FPSP bits Position */ +#define FPU_MVFR0_FPSP_Msk (0xFUL << FPU_MVFR0_FPSP_Pos) /*!< MVFR0: FPSP bits Mask */ + +#define FPU_MVFR0_SIMDReg_Pos 0U /*!< MVFR0: SIMDReg bits Position */ +#define FPU_MVFR0_SIMDReg_Msk (0xFUL /*<< FPU_MVFR0_SIMDReg_Pos*/) /*!< MVFR0: SIMDReg bits Mask */ + +/* Media and VFP Feature Register 1 Definitions */ +#define FPU_MVFR1_FMAC_Pos 28U /*!< MVFR1: FMAC bits Position */ +#define FPU_MVFR1_FMAC_Msk (0xFUL << FPU_MVFR1_FMAC_Pos) /*!< MVFR1: FMAC bits Mask */ + +#define FPU_MVFR1_FPHP_Pos 24U /*!< MVFR1: FPHP bits Position */ +#define FPU_MVFR1_FPHP_Msk (0xFUL << FPU_MVFR1_FPHP_Pos) /*!< MVFR1: FPHP bits Mask */ + +#define FPU_MVFR1_FP16_Pos 20U /*!< MVFR1: FP16 bits Position */ +#define FPU_MVFR1_FP16_Msk (0xFUL << FPU_MVFR1_FP16_Pos) /*!< MVFR1: FP16 bits Mask */ + +#define FPU_MVFR1_MVE_Pos 8U /*!< MVFR1: MVE bits Position */ +#define FPU_MVFR1_MVE_Msk (0xFUL << FPU_MVFR1_MVE_Pos) /*!< MVFR1: MVE bits Mask */ + +#define FPU_MVFR1_FPDNaN_Pos 4U /*!< MVFR1: FPDNaN bits Position */ +#define FPU_MVFR1_FPDNaN_Msk (0xFUL << FPU_MVFR1_FPDNaN_Pos) /*!< MVFR1: FPDNaN bits Mask */ + +#define FPU_MVFR1_FPFtZ_Pos 0U /*!< MVFR1: FPFtZ bits Position */ +#define FPU_MVFR1_FPFtZ_Msk (0xFUL /*<< FPU_MVFR1_FPFtZ_Pos*/) /*!< MVFR1: FPFtZ bits Mask */ + +/* Media and VFP Feature Register 2 Definitions */ +#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ +#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ + +/*@} end of group CMSIS_FPU */ + +/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */ +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief \deprecated Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< \deprecated CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< \deprecated CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< \deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_FPD_Pos 23U /*!< \deprecated CoreDebug DHCSR: S_FPD Position */ +#define CoreDebug_DHCSR_S_FPD_Msk (1UL << CoreDebug_DHCSR_S_FPD_Pos) /*!< \deprecated CoreDebug DHCSR: S_FPD Mask */ + +#define CoreDebug_DHCSR_S_SUIDE_Pos 22U /*!< \deprecated CoreDebug DHCSR: S_SUIDE Position */ +#define CoreDebug_DHCSR_S_SUIDE_Msk (1UL << CoreDebug_DHCSR_S_SUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SUIDE Mask */ + +#define CoreDebug_DHCSR_S_NSUIDE_Pos 21U /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Position */ +#define CoreDebug_DHCSR_S_NSUIDE_Msk (1UL << CoreDebug_DHCSR_S_NSUIDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_NSUIDE Mask */ + +#define CoreDebug_DHCSR_S_SDE_Pos 20U /*!< \deprecated CoreDebug DHCSR: S_SDE Position */ +#define CoreDebug_DHCSR_S_SDE_Msk (1UL << CoreDebug_DHCSR_S_SDE_Pos) /*!< \deprecated CoreDebug DHCSR: S_SDE Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< \deprecated CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< \deprecated CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< \deprecated CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< \deprecated CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< \deprecated CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< \deprecated CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_PMOV_Pos 6U /*!< \deprecated CoreDebug DHCSR: C_PMOV Position */ +#define CoreDebug_DHCSR_C_PMOV_Msk (1UL << CoreDebug_DHCSR_C_PMOV_Pos) /*!< \deprecated CoreDebug DHCSR: C_PMOV Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< \deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< \deprecated CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< \deprecated CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< \deprecated CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< \deprecated CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< \deprecated CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< \deprecated CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< \deprecated CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< \deprecated CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< \deprecated CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< \deprecated CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< \deprecated CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< \deprecated CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< \deprecated CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< \deprecated CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< \deprecated CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< \deprecated CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< \deprecated CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< \deprecated CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< \deprecated CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< \deprecated CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< \deprecated CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< \deprecated CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< \deprecated CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Set Clear Exception and Monitor Control Register Definitions */ +#define CoreDebug_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Position */ +#define CoreDebug_DSCEMCR_CLR_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_REQ, Mask */ + +#define CoreDebug_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Position */ +#define CoreDebug_DSCEMCR_CLR_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_CLR_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: CLR_MON_PEND, Mask */ + +#define CoreDebug_DSCEMCR_SET_MON_REQ_Pos 3U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Position */ +#define CoreDebug_DSCEMCR_SET_MON_REQ_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_REQ_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_REQ, Mask */ + +#define CoreDebug_DSCEMCR_SET_MON_PEND_Pos 1U /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Position */ +#define CoreDebug_DSCEMCR_SET_MON_PEND_Msk (1UL << CoreDebug_DSCEMCR_SET_MON_PEND_Pos) /*!< \deprecated CoreDebug DSCEMCR: SET_MON_PEND, Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_UIDEN_Pos 10U /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Position */ +#define CoreDebug_DAUTHCTRL_UIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_UIDAPEN_Pos 9U /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Position */ +#define CoreDebug_DAUTHCTRL_UIDAPEN_Msk (1UL << CoreDebug_DAUTHCTRL_UIDAPEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: UIDAPEN, Mask */ + +#define CoreDebug_DAUTHCTRL_FSDMA_Pos 8U /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Position */ +#define CoreDebug_DAUTHCTRL_FSDMA_Msk (1UL << CoreDebug_DAUTHCTRL_FSDMA_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: FSDMA, Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< \deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< \deprecated CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< \deprecated CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< \deprecated CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< \deprecated CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< \deprecated CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< \deprecated CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DCB Debug Control Block + \brief Type definitions for the Debug Control Block Registers + @{ + */ + +/** + \brief Structure type to access the Debug Control Block Registers (DCB). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + __OM uint32_t DSCEMCR; /*!< Offset: 0x010 ( /W) Debug Set Clear Exception and Monitor Control Register */ + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} DCB_Type; + +/* DHCSR, Debug Halting Control and Status Register Definitions */ +#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ +#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ + +#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ +#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ + +#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ +#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ + +#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ +#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ + +#define DCB_DHCSR_S_FPD_Pos 23U /*!< DCB DHCSR: Floating-point registers Debuggable Position */ +#define DCB_DHCSR_S_FPD_Msk (0x1UL << DCB_DHCSR_S_FPD_Pos) /*!< DCB DHCSR: Floating-point registers Debuggable Mask */ + +#define DCB_DHCSR_S_SUIDE_Pos 22U /*!< DCB DHCSR: Secure unprivileged halting debug enabled Position */ +#define DCB_DHCSR_S_SUIDE_Msk (0x1UL << DCB_DHCSR_S_SUIDE_Pos) /*!< DCB DHCSR: Secure unprivileged halting debug enabled Mask */ + +#define DCB_DHCSR_S_NSUIDE_Pos 21U /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Position */ +#define DCB_DHCSR_S_NSUIDE_Msk (0x1UL << DCB_DHCSR_S_NSUIDE_Pos) /*!< DCB DHCSR: Non-secure unprivileged halting debug enabled Mask */ + +#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ +#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ + +#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ +#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ + +#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ +#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ + +#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ +#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ + +#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ +#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ + +#define DCB_DHCSR_C_PMOV_Pos 6U /*!< DCB DHCSR: Halt on PMU overflow control Position */ +#define DCB_DHCSR_C_PMOV_Msk (0x1UL << DCB_DHCSR_C_PMOV_Pos) /*!< DCB DHCSR: Halt on PMU overflow control Mask */ + +#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ +#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ + +#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ +#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ + +#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ +#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ + +#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ +#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ + +#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ +#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ + +/* DCRSR, Debug Core Register Select Register Definitions */ +#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ +#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ + +#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ +#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ + +/* DCRDR, Debug Core Register Data Register Definitions */ +#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ +#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ + +/* DEMCR, Debug Exception and Monitor Control Register Definitions */ +#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ +#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ + +#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ +#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ + +#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ +#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ + +#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ +#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ + +#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ +#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ + +#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ +#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ + +#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ +#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ + +#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ +#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ + +#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ +#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ + +#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ +#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ + +#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ +#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ + +#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ +#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ + +#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ +#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ + +#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ +#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ + +#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ +#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ + +#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ +#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ + +#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ +#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ + +/* DSCEMCR, Debug Set Clear Exception and Monitor Control Register Definitions */ +#define DCB_DSCEMCR_CLR_MON_REQ_Pos 19U /*!< DCB DSCEMCR: Clear monitor request Position */ +#define DCB_DSCEMCR_CLR_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_REQ_Pos) /*!< DCB DSCEMCR: Clear monitor request Mask */ + +#define DCB_DSCEMCR_CLR_MON_PEND_Pos 17U /*!< DCB DSCEMCR: Clear monitor pend Position */ +#define DCB_DSCEMCR_CLR_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_CLR_MON_PEND_Pos) /*!< DCB DSCEMCR: Clear monitor pend Mask */ + +#define DCB_DSCEMCR_SET_MON_REQ_Pos 3U /*!< DCB DSCEMCR: Set monitor request Position */ +#define DCB_DSCEMCR_SET_MON_REQ_Msk (0x1UL << DCB_DSCEMCR_SET_MON_REQ_Pos) /*!< DCB DSCEMCR: Set monitor request Mask */ + +#define DCB_DSCEMCR_SET_MON_PEND_Pos 1U /*!< DCB DSCEMCR: Set monitor pend Position */ +#define DCB_DSCEMCR_SET_MON_PEND_Msk (0x1UL << DCB_DSCEMCR_SET_MON_PEND_Pos) /*!< DCB DSCEMCR: Set monitor pend Mask */ + +/* DAUTHCTRL, Debug Authentication Control Register Definitions */ +#define DCB_DAUTHCTRL_UIDEN_Pos 10U /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Position */ +#define DCB_DAUTHCTRL_UIDEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive Debug Enable Mask */ + +#define DCB_DAUTHCTRL_UIDAPEN_Pos 9U /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Position */ +#define DCB_DAUTHCTRL_UIDAPEN_Msk (0x1UL << DCB_DAUTHCTRL_UIDAPEN_Pos) /*!< DCB DAUTHCTRL: Unprivileged Invasive DAP Access Enable Mask */ + +#define DCB_DAUTHCTRL_FSDMA_Pos 8U /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Position */ +#define DCB_DAUTHCTRL_FSDMA_Msk (0x1UL << DCB_DAUTHCTRL_FSDMA_Pos) /*!< DCB DAUTHCTRL: Force Secure DebugMonitor Allowed Mask */ + +#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ +#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ + +#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ +#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ + +#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ +#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ + +#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ +#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ + +/* DSCSR, Debug Security Control and Status Register Definitions */ +#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ +#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ + +#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ +#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ + +#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ +#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ + +#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ +#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ + +/*@} end of group CMSIS_DCB */ + + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DIB Debug Identification Block + \brief Type definitions for the Debug Identification Block Registers + @{ + */ + +/** + \brief Structure type to access the Debug Identification Block Registers (DIB). + */ +typedef struct +{ + __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ + __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ + __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ + __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ + __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ +} DIB_Type; + +/* DLAR, SCS Software Lock Access Register Definitions */ +#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ +#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ + +/* DLSR, SCS Software Lock Status Register Definitions */ +#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ +#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ + +#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ +#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ + +#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ +#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ + +/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ +#define DIB_DAUTHSTATUS_SUNID_Pos 22U /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Position */ +#define DIB_DAUTHSTATUS_SUNID_Msk (0x3UL << DIB_DAUTHSTATUS_SUNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Non-invasive Debug Allowed Mask */ + +#define DIB_DAUTHSTATUS_SUID_Pos 20U /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Position */ +#define DIB_DAUTHSTATUS_SUID_Msk (0x3UL << DIB_DAUTHSTATUS_SUID_Pos ) /*!< DIB DAUTHSTATUS: Secure Unprivileged Invasive Debug Allowed Mask */ + +#define DIB_DAUTHSTATUS_NSUNID_Pos 18U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Position */ +#define DIB_DAUTHSTATUS_NSUNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Non-invasive Debug Allo Mask */ + +#define DIB_DAUTHSTATUS_NSUID_Pos 16U /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Position */ +#define DIB_DAUTHSTATUS_NSUID_Msk (0x3UL << DIB_DAUTHSTATUS_NSUID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Unprivileged Invasive Debug Allowed Mask */ + +#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ +#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ +#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ +#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ +#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ + +/* DDEVARCH, SCS Device Architecture Register Definitions */ +#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ +#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ + +#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ +#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ + +#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ +#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ + +#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ +#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ + +#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ +#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ + +/* DDEVTYPE, SCS Device Type Register Definitions */ +#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ +#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ + +#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ +#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ + + +/*@} end of group CMSIS_DIB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define MEMSYSCTL_BASE (0xE001E000UL) /*!< Memory System Control Base Address */ + #define ERRBNK_BASE (0xE001E100UL) /*!< Error Banking Base Address */ + #define PWRMODCTL_BASE (0xE001E300UL) /*!< Power Mode Control Base Address */ + #define EWIC_BASE (0xE001E400UL) /*!< External Wakeup Interrupt Controller Base Address */ + #define PRCCFGINF_BASE (0xE001E700UL) /*!< Processor Configuration Information Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< \deprecated Core Debug Base Address */ + #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ + #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + #define ICB ((ICB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define MEMSYSCTL ((MemSysCtl_Type *) MEMSYSCTL_BASE ) /*!< Memory System Control configuration struct */ + #define ERRBNK ((ErrBnk_Type *) ERRBNK_BASE ) /*!< Error Banking configuration struct */ + #define PWRMODCTL ((PwrModCtl_Type *) PWRMODCTL_BASE ) /*!< Power Mode Control configuration struct */ + #define EWIC ((EWIC_Type *) EWIC_BASE ) /*!< EWIC configuration struct */ + #define PRCCFGINF ((PrcCfgInf_Type *) PRCCFGINF_BASE ) /*!< Processor Configuration Information configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< \deprecated Core Debug configuration struct */ + #define DCB ((DCB_Type *) DCB_BASE ) /*!< DCB configuration struct */ + #define DIB ((DIB_Type *) DIB_BASE ) /*!< DIB configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) + #define PMU_BASE (0xE0003000UL) /*!< PMU Base Address */ + #define PMU ((PMU_Type *) PMU_BASE ) /*!< PMU configuration struct */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< \deprecated Core Debug Base Address (non-secure address space) */ + #define DCB_BASE_NS (0xE002EDF0UL) /*!< DCB Base Address (non-secure address space) */ + #define DIB_BASE_NS (0xE002EFB0UL) /*!< DIB Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define ICB_NS ((ICB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< \deprecated Core Debug configuration struct (non-secure address space) */ + #define DCB_NS ((DCB_Type *) DCB_BASE_NS ) /*!< DCB configuration struct (non-secure address space) */ + #define DIB_NS ((DIB_Type *) DIB_BASE_NS ) /*!< DIB configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_register_aliases Backwards Compatibility Aliases + \brief Register alias definitions for backwards compatibility. + @{ + */ + +/*@} */ + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## PMU functions and events #################################### */ + +#if defined (__PMU_PRESENT) && (__PMU_PRESENT == 1U) + +#include "pmu_armv8.h" + +/** + \brief Cortex-M85 PMU events + \note Architectural PMU events can be found in pmu_armv8.h +*/ + +#define ARMCM85_PMU_ECC_ERR 0xC000 /*!< One or more Error Correcting Code (ECC) errors detected */ +#define ARMCM85_PMU_ECC_ERR_MBIT 0xC001 /*!< One or more multi-bit ECC errors detected */ +#define ARMCM85_PMU_ECC_ERR_DCACHE 0xC010 /*!< One or more ECC errors in the data cache */ +#define ARMCM85_PMU_ECC_ERR_ICACHE 0xC011 /*!< One or more ECC errors in the instruction cache */ +#define ARMCM85_PMU_ECC_ERR_MBIT_DCACHE 0xC012 /*!< One or more multi-bit ECC errors in the data cache */ +#define ARMCM85_PMU_ECC_ERR_MBIT_ICACHE 0xC013 /*!< One or more multi-bit ECC errors in the instruction cache */ +#define ARMCM85_PMU_ECC_ERR_DTCM 0xC020 /*!< One or more ECC errors in the Data Tightly Coupled Memory (DTCM) */ +#define ARMCM85_PMU_ECC_ERR_ITCM 0xC021 /*!< One or more ECC errors in the Instruction Tightly Coupled Memory (ITCM) */ +#define ARMCM85_PMU_ECC_ERR_MBIT_DTCM 0xC022 /*!< One or more multi-bit ECC errors in the DTCM */ +#define ARMCM85_PMU_ECC_ERR_MBIT_ITCM 0xC023 /*!< One or more multi-bit ECC errors in the ITCM */ +#define ARMCM85_PMU_PF_LINEFILL 0xC100 /*!< The prefetcher starts a line-fill */ +#define ARMCM85_PMU_PF_CANCEL 0xC101 /*!< The prefetcher stops prefetching */ +#define ARMCM85_PMU_PF_DROP_LINEFILL 0xC102 /*!< A linefill triggered by a prefetcher has been dropped because of lack of buffering */ +#define ARMCM85_PMU_NWAMODE_ENTER 0xC200 /*!< No write-allocate mode entry */ +#define ARMCM85_PMU_NWAMODE 0xC201 /*!< Write-allocate store is not allocated into the data cache due to no-write-allocate mode */ +#define ARMCM85_PMU_SAHB_ACCESS 0xC300 /*!< Read or write access on the S-AHB interface to the TCM */ +#define ARMCM85_PMU_PAHB_ACCESS 0xC301 /*!< Read or write access on the P-AHB write interface */ +#define ARMCM85_PMU_AXI_WRITE_ACCESS 0xC302 /*!< Any beat access to M-AXI write interface */ +#define ARMCM85_PMU_AXI_READ_ACCESS 0xC303 /*!< Any beat access to M-AXI read interface */ +#define ARMCM85_PMU_DOSTIMEOUT_DOUBLE 0xC400 /*!< Denial of Service timeout has fired twice and caused buffers to drain to allow forward progress */ +#define ARMCM85_PMU_DOSTIMEOUT_TRIPLE 0xC401 /*!< Denial of Service timeout has fired three times and blocked the LSU to force forward progress */ + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_FPSP_Msk | FPU_MVFR0_FPDP_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + +/* ########################## MVE functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_MveFunctions MVE Functions + \brief Function that provides MVE type. + @{ + */ + +/** + \brief get MVE type + \details returns the MVE type + \returns + - \b 0: No Vector Extension (MVE) + - \b 1: Integer Vector Extension (MVE-I) + - \b 2: Floating-point Vector Extension (MVE-F) + */ +__STATIC_INLINE uint32_t SCB_GetMVEType(void) +{ + const uint32_t mvfr1 = FPU->MVFR1; + if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x2U << FPU_MVFR1_MVE_Pos)) + { + return 2U; + } + else if ((mvfr1 & FPU_MVFR1_MVE_Msk) == (0x1U << FPU_MVFR1_MVE_Pos)) + { + return 1U; + } + else + { + return 0U; + } +} + + +/*@} end of CMSIS_Core_MveFunctions */ + + +/* ########################## Cache functions #################################### */ + +#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ + (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) +#include "cachel1_armv7.h" +#endif + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + +/* ################### PAC Key functions ########################### */ + +#if (defined (__ARM_FEATURE_PAUTH) && (__ARM_FEATURE_PAUTH == 1)) +#include "pac_armv81.h" +#endif + + +/* ################################## Debug Control function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_DCBFunctions Debug Control Functions + \brief Functions that access the Debug Control Block. + @{ + */ + + +/** + \brief Set Debug Authentication Control Register + \details writes to Debug Authentication Control register. + \param [in] value value to be writen. + */ +__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) +{ + __DSB(); + __ISB(); + DCB->DAUTHCTRL = value; + __DSB(); + __ISB(); +} + + +/** + \brief Get Debug Authentication Control Register + \details Reads Debug Authentication Control register. + \return Debug Authentication Control Register. + */ +__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) +{ + return (DCB->DAUTHCTRL); +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Debug Authentication Control Register (non-secure) + \details writes to non-secure Debug Authentication Control register when in secure state. + \param [in] value value to be writen + */ +__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) +{ + __DSB(); + __ISB(); + DCB_NS->DAUTHCTRL = value; + __DSB(); + __ISB(); +} + + +/** + \brief Get Debug Authentication Control Register (non-secure) + \details Reads non-secure Debug Authentication Control register when in secure state. + \return Debug Authentication Control Register. + */ +__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) +{ + return (DCB_NS->DAUTHCTRL); +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_DCBFunctions */ + + + + +/* ################################## Debug Identification function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions + \brief Functions that access the Debug Identification Block. + @{ + */ + + +/** + \brief Get Debug Authentication Status Register + \details Reads Debug Authentication Status register. + \return Debug Authentication Status Register. + */ +__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) +{ + return (DIB->DAUTHSTATUS); +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Debug Authentication Status Register (non-secure) + \details Reads non-secure Debug Authentication Status register when in secure state. + \return Debug Authentication Status Register. + */ +__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) +{ + return (DIB_NS->DAUTHSTATUS); +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_DCBFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM85_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Include/core_sc000.h b/Drivers/CMSIS/Include/core_sc000.h new file mode 100644 index 0000000..dbc755f --- /dev/null +++ b/Drivers/CMSIS/Include/core_sc000.h @@ -0,0 +1,1030 @@ +/**************************************************************************//** + * @file core_sc000.h + * @brief CMSIS SC000 Core Peripheral Access Layer Header File + * @version V5.0.7 + * @date 27. March 2020 + ******************************************************************************/ +/* + * Copyright (c) 2009-2020 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_SC000_H_GENERIC +#define __CORE_SC000_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup SC000 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS SC000 definitions */ +#define __SC000_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __SC000_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __SC000_CMSIS_VERSION ((__SC000_CMSIS_VERSION_MAIN << 16U) | \ + __SC000_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_SC (000U) /*!< Cortex secure core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC000_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_SC000_H_DEPENDANT +#define __CORE_SC000_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __SC000_REV + #define __SC000_REV 0x0000U + #warning "__SC000_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group SC000 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t _reserved0:1; /*!< bit: 0 Reserved */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED0[1U]; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + uint32_t RESERVED1[154U]; + __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief SC000 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the SC000 header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else +/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for SC000 */ +/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for SC000 */ + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for SC000 */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + /* ARM Application Note 321 states that the M0 and M0+ do not require the architectural barrier - assume SC000 is the same */ +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC000_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Include/core_sc300.h b/Drivers/CMSIS/Include/core_sc300.h new file mode 100644 index 0000000..d666210 --- /dev/null +++ b/Drivers/CMSIS/Include/core_sc300.h @@ -0,0 +1,1917 @@ +/**************************************************************************//** + * @file core_sc300.h + * @brief CMSIS SC300 Core Peripheral Access Layer Header File + * @version V5.0.10 + * @date 04. June 2021 + ******************************************************************************/ +/* + * Copyright (c) 2009-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_SC300_H_GENERIC +#define __CORE_SC300_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup SC3000 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS SC300 definitions */ +#define __SC300_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __SC300_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __SC300_CMSIS_VERSION ((__SC300_CMSIS_VERSION_MAIN << 16U) | \ + __SC300_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_SC (300U) /*!< Cortex secure core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC300_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_SC300_H_DEPENDANT +#define __CORE_SC300_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __SC300_REV + #define __SC300_REV 0x0000U + #warning "__SC300_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 1U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group SC300 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RESERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + uint32_t RESERVED1[129U]; + __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ +#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ + +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[32U]; + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ +#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ + +#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ +#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ +#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ + +#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ +#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + /* ARM Application Note 321 states that the M3 does not require the architectural barrier */ +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC300_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Include/core_starmc1.h b/Drivers/CMSIS/Include/core_starmc1.h new file mode 100644 index 0000000..d86c8d3 --- /dev/null +++ b/Drivers/CMSIS/Include/core_starmc1.h @@ -0,0 +1,3592 @@ +/**************************************************************************//** + * @file core_starmc1.h + * @brief CMSIS ArmChina STAR-MC1 Core Peripheral Access Layer Header File + * @version V1.0.2 + * @date 07. April 2022 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. + * Copyright (c) 2018-2022 Arm China. + * All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#elif defined ( __GNUC__ ) + #pragma GCC diagnostic ignored "-Wpedantic" /* disable pedantic warning due to unnamed structs/unions */ +#endif + +#ifndef __CORE_STAR_H_GENERIC +#define __CORE_STAR_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup STAR-MC1 + @{ + */ + +#include "cmsis_version.h" + +/* Macro Define for STAR-MC1 */ +#define __STAR_MC (1U) /*!< STAR-MC Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined (__TARGET_FPU_VFP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined (__ARM_FP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined (__ARMVFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined (__TI_VFP_SUPPORT__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined (__FPU_VFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_STAR_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_STAR_H_DEPENDANT +#define __CORE_STAR_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __STAR_REV + #define __STAR_REV 0x0000U + #warning "__STAR_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __ICACHE_PRESENT + #define __ICACHE_PRESENT 0U + #warning "__ICACHE_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DCACHE_PRESENT + #define __DCACHE_PRESENT 0U + #warning "__DCACHE_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DTCM_PRESENT + #define __DTCM_PRESENT 0U + #warning "__DTCM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group STAR-MC1 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for STAR-MC1 processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[1U]; + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED_ADD1[21U]; + __IOM uint32_t SFSR; /*!< Offset: 0x0E4 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x0E8 (R/W) Secure Fault Address Register */ + uint32_t RESERVED3[69U]; + __OM uint32_t STIR; /*!< Offset: F00-D00=0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ +} SCB_Type; + +typedef struct +{ + __IOM uint32_t CACR; /*!< Offset: 0x0 (R/W) L1 Cache Control Register */ + __IOM uint32_t ITCMCR; /*!< Offset: 0x10 (R/W) Instruction Tightly-Coupled Memory Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x14 (R/W) Data Tightly-Coupled Memory Control Registers */ +}EMSS_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_CFSR_MEMFAULTSR_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_CFSR_MEMFAULTSR_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_CFSR_MEMFAULTSR_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +#define SCB_CLIDR_IC_Pos 0U /*!< SCB CLIDR: IC Position */ +#define SCB_CLIDR_IC_Msk (1UL << SCB_CLIDR_IC_Pos) /*!< SCB CLIDR: IC Mask */ + +#define SCB_CLIDR_DC_Pos 1U /*!< SCB CLIDR: DC Position */ +#define SCB_CLIDR_DC_Msk (1UL << SCB_CLIDR_DC_Pos) /*!< SCB CLIDR: DC Mask */ + + + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache line Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_LEVEL_Pos 1U /*!< SCB DCISW: Level Position */ +#define SCB_DCISW_LEVEL_Msk (7UL << SCB_DCISW_LEVEL_Pos) /*!< SCB DCISW: Level Mask */ + +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0xFFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean line by Set-way Register Definitions */ +#define SCB_DCCSW_LEVEL_Pos 1U /*!< SCB DCCSW: Level Position */ +#define SCB_DCCSW_LEVEL_Msk (7UL << SCB_DCCSW_LEVEL_Pos) /*!< SCB DCCSW: Level Mask */ + +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0xFFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_LEVEL_Pos 1U /*!< SCB DCCISW: Level Position */ +#define SCB_DCCISW_LEVEL_Msk (7UL << SCB_DCCISW_LEVEL_Pos) /*!< SCB DCCISW: Level Mask */ + +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0xFFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/* ArmChina: Implementation Defined */ +/* Instruction Tightly-Coupled Memory Control Register Definitions */ +#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ +#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ + +#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ +#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ + +/* Data Tightly-Coupled Memory Control Register Definitions */ +#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ +#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ + +#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ +#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ + +/* L1 Cache Control Register Definitions */ +#define SCB_CACR_DCCLEAN_Pos 16U /*!< SCB CACR: DCCLEAN Position */ +#define SCB_CACR_DCCLEAN_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: DCCLEAN Mask */ + +#define SCB_CACR_ICACTIVE_Pos 13U /*!< SCB CACR: ICACTIVE Position */ +#define SCB_CACR_ICACTIVE_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: ICACTIVE Mask */ + +#define SCB_CACR_DCACTIVE_Pos 12U /*!< SCB CACR: DCACTIVE Position */ +#define SCB_CACR_DCACTIVE_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: DCACTIVE Mask */ + +#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ +#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[32U]; + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ +#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ + +#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ + __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ + __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration Test FIFO Test Data 0 Register Definitions */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ +#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ +#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ +#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ + +/* TPI Integration Test ATB Control Register 2 Register Definitions */ +#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ +#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ + +#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ +#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ + +#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ +#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ + +#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ +#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ + +/* TPI Integration Test FIFO Test Data 1 Register Definitions */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ +#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ +#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ +#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ + +/* TPI Integration Test ATB Control Register 0 Definitions */ +#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ +#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ + +#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ +#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ + +#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ +#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ + +#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ +#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and VFP Feature Register 2 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and VFP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and VFP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/* Media and VFP Feature Register 2 Definitions */ +#define FPU_MVFR2_FPMisc_Pos 4U /*!< MVFR2: FPMisc bits Position */ +#define FPU_MVFR2_FPMisc_Msk (0xFUL << FPU_MVFR2_FPMisc_Pos) /*!< MVFR2: FPMisc bits Mask */ + +/*@} end of group CMSIS_FPU */ + + + + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DCB Debug Control Block + \brief Type definitions for the Debug Control Block Registers + @{ + */ + +/** + \brief Structure type to access the Debug Control Block Registers (DCB). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED0[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} DCB_Type; + +/* DHCSR, Debug Halting Control and Status Register Definitions */ +#define DCB_DHCSR_DBGKEY_Pos 16U /*!< DCB DHCSR: Debug key Position */ +#define DCB_DHCSR_DBGKEY_Msk (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos) /*!< DCB DHCSR: Debug key Mask */ + +#define DCB_DHCSR_S_RESTART_ST_Pos 26U /*!< DCB DHCSR: Restart sticky status Position */ +#define DCB_DHCSR_S_RESTART_ST_Msk (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos) /*!< DCB DHCSR: Restart sticky status Mask */ + +#define DCB_DHCSR_S_RESET_ST_Pos 25U /*!< DCB DHCSR: Reset sticky status Position */ +#define DCB_DHCSR_S_RESET_ST_Msk (0x1UL << DCB_DHCSR_S_RESET_ST_Pos) /*!< DCB DHCSR: Reset sticky status Mask */ + +#define DCB_DHCSR_S_RETIRE_ST_Pos 24U /*!< DCB DHCSR: Retire sticky status Position */ +#define DCB_DHCSR_S_RETIRE_ST_Msk (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos) /*!< DCB DHCSR: Retire sticky status Mask */ + +#define DCB_DHCSR_S_SDE_Pos 20U /*!< DCB DHCSR: Secure debug enabled Position */ +#define DCB_DHCSR_S_SDE_Msk (0x1UL << DCB_DHCSR_S_SDE_Pos) /*!< DCB DHCSR: Secure debug enabled Mask */ + +#define DCB_DHCSR_S_LOCKUP_Pos 19U /*!< DCB DHCSR: Lockup status Position */ +#define DCB_DHCSR_S_LOCKUP_Msk (0x1UL << DCB_DHCSR_S_LOCKUP_Pos) /*!< DCB DHCSR: Lockup status Mask */ + +#define DCB_DHCSR_S_SLEEP_Pos 18U /*!< DCB DHCSR: Sleeping status Position */ +#define DCB_DHCSR_S_SLEEP_Msk (0x1UL << DCB_DHCSR_S_SLEEP_Pos) /*!< DCB DHCSR: Sleeping status Mask */ + +#define DCB_DHCSR_S_HALT_Pos 17U /*!< DCB DHCSR: Halted status Position */ +#define DCB_DHCSR_S_HALT_Msk (0x1UL << DCB_DHCSR_S_HALT_Pos) /*!< DCB DHCSR: Halted status Mask */ + +#define DCB_DHCSR_S_REGRDY_Pos 16U /*!< DCB DHCSR: Register ready status Position */ +#define DCB_DHCSR_S_REGRDY_Msk (0x1UL << DCB_DHCSR_S_REGRDY_Pos) /*!< DCB DHCSR: Register ready status Mask */ + +#define DCB_DHCSR_C_SNAPSTALL_Pos 5U /*!< DCB DHCSR: Snap stall control Position */ +#define DCB_DHCSR_C_SNAPSTALL_Msk (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos) /*!< DCB DHCSR: Snap stall control Mask */ + +#define DCB_DHCSR_C_MASKINTS_Pos 3U /*!< DCB DHCSR: Mask interrupts control Position */ +#define DCB_DHCSR_C_MASKINTS_Msk (0x1UL << DCB_DHCSR_C_MASKINTS_Pos) /*!< DCB DHCSR: Mask interrupts control Mask */ + +#define DCB_DHCSR_C_STEP_Pos 2U /*!< DCB DHCSR: Step control Position */ +#define DCB_DHCSR_C_STEP_Msk (0x1UL << DCB_DHCSR_C_STEP_Pos) /*!< DCB DHCSR: Step control Mask */ + +#define DCB_DHCSR_C_HALT_Pos 1U /*!< DCB DHCSR: Halt control Position */ +#define DCB_DHCSR_C_HALT_Msk (0x1UL << DCB_DHCSR_C_HALT_Pos) /*!< DCB DHCSR: Halt control Mask */ + +#define DCB_DHCSR_C_DEBUGEN_Pos 0U /*!< DCB DHCSR: Debug enable control Position */ +#define DCB_DHCSR_C_DEBUGEN_Msk (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/) /*!< DCB DHCSR: Debug enable control Mask */ + +/* DCRSR, Debug Core Register Select Register Definitions */ +#define DCB_DCRSR_REGWnR_Pos 16U /*!< DCB DCRSR: Register write/not-read Position */ +#define DCB_DCRSR_REGWnR_Msk (0x1UL << DCB_DCRSR_REGWnR_Pos) /*!< DCB DCRSR: Register write/not-read Mask */ + +#define DCB_DCRSR_REGSEL_Pos 0U /*!< DCB DCRSR: Register selector Position */ +#define DCB_DCRSR_REGSEL_Msk (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/) /*!< DCB DCRSR: Register selector Mask */ + +/* DCRDR, Debug Core Register Data Register Definitions */ +#define DCB_DCRDR_DBGTMP_Pos 0U /*!< DCB DCRDR: Data temporary buffer Position */ +#define DCB_DCRDR_DBGTMP_Msk (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/) /*!< DCB DCRDR: Data temporary buffer Mask */ + +/* DEMCR, Debug Exception and Monitor Control Register Definitions */ +#define DCB_DEMCR_TRCENA_Pos 24U /*!< DCB DEMCR: Trace enable Position */ +#define DCB_DEMCR_TRCENA_Msk (0x1UL << DCB_DEMCR_TRCENA_Pos) /*!< DCB DEMCR: Trace enable Mask */ + +#define DCB_DEMCR_MONPRKEY_Pos 23U /*!< DCB DEMCR: Monitor pend req key Position */ +#define DCB_DEMCR_MONPRKEY_Msk (0x1UL << DCB_DEMCR_MONPRKEY_Pos) /*!< DCB DEMCR: Monitor pend req key Mask */ + +#define DCB_DEMCR_UMON_EN_Pos 21U /*!< DCB DEMCR: Unprivileged monitor enable Position */ +#define DCB_DEMCR_UMON_EN_Msk (0x1UL << DCB_DEMCR_UMON_EN_Pos) /*!< DCB DEMCR: Unprivileged monitor enable Mask */ + +#define DCB_DEMCR_SDME_Pos 20U /*!< DCB DEMCR: Secure DebugMonitor enable Position */ +#define DCB_DEMCR_SDME_Msk (0x1UL << DCB_DEMCR_SDME_Pos) /*!< DCB DEMCR: Secure DebugMonitor enable Mask */ + +#define DCB_DEMCR_MON_REQ_Pos 19U /*!< DCB DEMCR: Monitor request Position */ +#define DCB_DEMCR_MON_REQ_Msk (0x1UL << DCB_DEMCR_MON_REQ_Pos) /*!< DCB DEMCR: Monitor request Mask */ + +#define DCB_DEMCR_MON_STEP_Pos 18U /*!< DCB DEMCR: Monitor step Position */ +#define DCB_DEMCR_MON_STEP_Msk (0x1UL << DCB_DEMCR_MON_STEP_Pos) /*!< DCB DEMCR: Monitor step Mask */ + +#define DCB_DEMCR_MON_PEND_Pos 17U /*!< DCB DEMCR: Monitor pend Position */ +#define DCB_DEMCR_MON_PEND_Msk (0x1UL << DCB_DEMCR_MON_PEND_Pos) /*!< DCB DEMCR: Monitor pend Mask */ + +#define DCB_DEMCR_MON_EN_Pos 16U /*!< DCB DEMCR: Monitor enable Position */ +#define DCB_DEMCR_MON_EN_Msk (0x1UL << DCB_DEMCR_MON_EN_Pos) /*!< DCB DEMCR: Monitor enable Mask */ + +#define DCB_DEMCR_VC_SFERR_Pos 11U /*!< DCB DEMCR: Vector Catch SecureFault Position */ +#define DCB_DEMCR_VC_SFERR_Msk (0x1UL << DCB_DEMCR_VC_SFERR_Pos) /*!< DCB DEMCR: Vector Catch SecureFault Mask */ + +#define DCB_DEMCR_VC_HARDERR_Pos 10U /*!< DCB DEMCR: Vector Catch HardFault errors Position */ +#define DCB_DEMCR_VC_HARDERR_Msk (0x1UL << DCB_DEMCR_VC_HARDERR_Pos) /*!< DCB DEMCR: Vector Catch HardFault errors Mask */ + +#define DCB_DEMCR_VC_INTERR_Pos 9U /*!< DCB DEMCR: Vector Catch interrupt errors Position */ +#define DCB_DEMCR_VC_INTERR_Msk (0x1UL << DCB_DEMCR_VC_INTERR_Pos) /*!< DCB DEMCR: Vector Catch interrupt errors Mask */ + +#define DCB_DEMCR_VC_BUSERR_Pos 8U /*!< DCB DEMCR: Vector Catch BusFault errors Position */ +#define DCB_DEMCR_VC_BUSERR_Msk (0x1UL << DCB_DEMCR_VC_BUSERR_Pos) /*!< DCB DEMCR: Vector Catch BusFault errors Mask */ + +#define DCB_DEMCR_VC_STATERR_Pos 7U /*!< DCB DEMCR: Vector Catch state errors Position */ +#define DCB_DEMCR_VC_STATERR_Msk (0x1UL << DCB_DEMCR_VC_STATERR_Pos) /*!< DCB DEMCR: Vector Catch state errors Mask */ + +#define DCB_DEMCR_VC_CHKERR_Pos 6U /*!< DCB DEMCR: Vector Catch check errors Position */ +#define DCB_DEMCR_VC_CHKERR_Msk (0x1UL << DCB_DEMCR_VC_CHKERR_Pos) /*!< DCB DEMCR: Vector Catch check errors Mask */ + +#define DCB_DEMCR_VC_NOCPERR_Pos 5U /*!< DCB DEMCR: Vector Catch NOCP errors Position */ +#define DCB_DEMCR_VC_NOCPERR_Msk (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos) /*!< DCB DEMCR: Vector Catch NOCP errors Mask */ + +#define DCB_DEMCR_VC_MMERR_Pos 4U /*!< DCB DEMCR: Vector Catch MemManage errors Position */ +#define DCB_DEMCR_VC_MMERR_Msk (0x1UL << DCB_DEMCR_VC_MMERR_Pos) /*!< DCB DEMCR: Vector Catch MemManage errors Mask */ + +#define DCB_DEMCR_VC_CORERESET_Pos 0U /*!< DCB DEMCR: Vector Catch Core reset Position */ +#define DCB_DEMCR_VC_CORERESET_Msk (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/) /*!< DCB DEMCR: Vector Catch Core reset Mask */ + +/* DAUTHCTRL, Debug Authentication Control Register Definitions */ +#define DCB_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */ +#define DCB_DAUTHCTRL_INTSPNIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */ + +#define DCB_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */ +#define DCB_DAUTHCTRL_SPNIDENSEL_Msk (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos) /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */ + +#define DCB_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */ +#define DCB_DAUTHCTRL_INTSPIDEN_Msk (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos) /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */ + +#define DCB_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */ +#define DCB_DAUTHCTRL_SPIDENSEL_Msk (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */ + +/* DSCSR, Debug Security Control and Status Register Definitions */ +#define DCB_DSCSR_CDSKEY_Pos 17U /*!< DCB DSCSR: CDS write-enable key Position */ +#define DCB_DSCSR_CDSKEY_Msk (0x1UL << DCB_DSCSR_CDSKEY_Pos) /*!< DCB DSCSR: CDS write-enable key Mask */ + +#define DCB_DSCSR_CDS_Pos 16U /*!< DCB DSCSR: Current domain Secure Position */ +#define DCB_DSCSR_CDS_Msk (0x1UL << DCB_DSCSR_CDS_Pos) /*!< DCB DSCSR: Current domain Secure Mask */ + +#define DCB_DSCSR_SBRSEL_Pos 1U /*!< DCB DSCSR: Secure banked register select Position */ +#define DCB_DSCSR_SBRSEL_Msk (0x1UL << DCB_DSCSR_SBRSEL_Pos) /*!< DCB DSCSR: Secure banked register select Mask */ + +#define DCB_DSCSR_SBRSELEN_Pos 0U /*!< DCB DSCSR: Secure banked register select enable Position */ +#define DCB_DSCSR_SBRSELEN_Msk (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/) /*!< DCB DSCSR: Secure banked register select enable Mask */ + +/*@} end of group CMSIS_DCB */ + + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DIB Debug Identification Block + \brief Type definitions for the Debug Identification Block Registers + @{ + */ + +/** + \brief Structure type to access the Debug Identification Block Registers (DIB). + */ +typedef struct +{ + __OM uint32_t DLAR; /*!< Offset: 0x000 ( /W) SCS Software Lock Access Register */ + __IM uint32_t DLSR; /*!< Offset: 0x004 (R/ ) SCS Software Lock Status Register */ + __IM uint32_t DAUTHSTATUS; /*!< Offset: 0x008 (R/ ) Debug Authentication Status Register */ + __IM uint32_t DDEVARCH; /*!< Offset: 0x00C (R/ ) SCS Device Architecture Register */ + __IM uint32_t DDEVTYPE; /*!< Offset: 0x010 (R/ ) SCS Device Type Register */ +} DIB_Type; + +/* DLAR, SCS Software Lock Access Register Definitions */ +#define DIB_DLAR_KEY_Pos 0U /*!< DIB DLAR: KEY Position */ +#define DIB_DLAR_KEY_Msk (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */) /*!< DIB DLAR: KEY Mask */ + +/* DLSR, SCS Software Lock Status Register Definitions */ +#define DIB_DLSR_nTT_Pos 2U /*!< DIB DLSR: Not thirty-two bit Position */ +#define DIB_DLSR_nTT_Msk (0x1UL << DIB_DLSR_nTT_Pos ) /*!< DIB DLSR: Not thirty-two bit Mask */ + +#define DIB_DLSR_SLK_Pos 1U /*!< DIB DLSR: Software Lock status Position */ +#define DIB_DLSR_SLK_Msk (0x1UL << DIB_DLSR_SLK_Pos ) /*!< DIB DLSR: Software Lock status Mask */ + +#define DIB_DLSR_SLI_Pos 0U /*!< DIB DLSR: Software Lock implemented Position */ +#define DIB_DLSR_SLI_Msk (0x1UL /*<< DIB_DLSR_SLI_Pos*/) /*!< DIB DLSR: Software Lock implemented Mask */ + +/* DAUTHSTATUS, Debug Authentication Status Register Definitions */ +#define DIB_DAUTHSTATUS_SNID_Pos 6U /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */ +#define DIB_DAUTHSTATUS_SNID_Msk (0x3UL << DIB_DAUTHSTATUS_SNID_Pos ) /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_SID_Pos 4U /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */ +#define DIB_DAUTHSTATUS_SID_Msk (0x3UL << DIB_DAUTHSTATUS_SID_Pos ) /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_NSNID_Pos 2U /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */ +#define DIB_DAUTHSTATUS_NSNID_Msk (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos ) /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */ + +#define DIB_DAUTHSTATUS_NSID_Pos 0U /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */ +#define DIB_DAUTHSTATUS_NSID_Msk (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/) /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */ + +/* DDEVARCH, SCS Device Architecture Register Definitions */ +#define DIB_DDEVARCH_ARCHITECT_Pos 21U /*!< DIB DDEVARCH: Architect Position */ +#define DIB_DDEVARCH_ARCHITECT_Msk (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos ) /*!< DIB DDEVARCH: Architect Mask */ + +#define DIB_DDEVARCH_PRESENT_Pos 20U /*!< DIB DDEVARCH: DEVARCH Present Position */ +#define DIB_DDEVARCH_PRESENT_Msk (0x1FUL << DIB_DDEVARCH_PRESENT_Pos ) /*!< DIB DDEVARCH: DEVARCH Present Mask */ + +#define DIB_DDEVARCH_REVISION_Pos 16U /*!< DIB DDEVARCH: Revision Position */ +#define DIB_DDEVARCH_REVISION_Msk (0xFUL << DIB_DDEVARCH_REVISION_Pos ) /*!< DIB DDEVARCH: Revision Mask */ + +#define DIB_DDEVARCH_ARCHVER_Pos 12U /*!< DIB DDEVARCH: Architecture Version Position */ +#define DIB_DDEVARCH_ARCHVER_Msk (0xFUL << DIB_DDEVARCH_ARCHVER_Pos ) /*!< DIB DDEVARCH: Architecture Version Mask */ + +#define DIB_DDEVARCH_ARCHPART_Pos 0U /*!< DIB DDEVARCH: Architecture Part Position */ +#define DIB_DDEVARCH_ARCHPART_Msk (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/) /*!< DIB DDEVARCH: Architecture Part Mask */ + +/* DDEVTYPE, SCS Device Type Register Definitions */ +#define DIB_DDEVTYPE_SUB_Pos 4U /*!< DIB DDEVTYPE: Sub-type Position */ +#define DIB_DDEVTYPE_SUB_Msk (0xFUL << DIB_DDEVTYPE_SUB_Pos ) /*!< DIB DDEVTYPE: Sub-type Mask */ + +#define DIB_DDEVTYPE_MAJOR_Pos 0U /*!< DIB DDEVTYPE: Major type Position */ +#define DIB_DDEVTYPE_MAJOR_Msk (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/) /*!< DIB DDEVTYPE: Major type Mask */ + + +/*@} end of group CMSIS_DIB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define DCB_BASE (0xE000EDF0UL) /*!< DCB Base Address */ + #define DIB_BASE (0xE000EFB0UL) /*!< DIB Base Address */ + #define EMSS_BASE (0xE001E000UL) /*!AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses including + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/** + \brief Software Reset + \details Initiates a system reset request to reset the CPU. + */ +__NO_RETURN __STATIC_INLINE void __SW_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses including + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_BFHFNMINS_Msk) | /* Keep BFHFNMINS unchanged. Use this Reset function in case your case need to keep it */ + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | /* Keep priority group unchanged */ + SCB_AIRCR_SYSRESETREQ_Msk ); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + +/* ################################## Debug Control function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_DCBFunctions Debug Control Functions + \brief Functions that access the Debug Control Block. + @{ + */ + + +/** + \brief Set Debug Authentication Control Register + \details writes to Debug Authentication Control register. + \param [in] value value to be writen. + */ +__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value) +{ + __DSB(); + __ISB(); + DCB->DAUTHCTRL = value; + __DSB(); + __ISB(); +} + + +/** + \brief Get Debug Authentication Control Register + \details Reads Debug Authentication Control register. + \return Debug Authentication Control Register. + */ +__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void) +{ + return (DCB->DAUTHCTRL); +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Debug Authentication Control Register (non-secure) + \details writes to non-secure Debug Authentication Control register when in secure state. + \param [in] value value to be writen + */ +__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value) +{ + __DSB(); + __ISB(); + DCB_NS->DAUTHCTRL = value; + __DSB(); + __ISB(); +} + + +/** + \brief Get Debug Authentication Control Register (non-secure) + \details Reads non-secure Debug Authentication Control register when in secure state. + \return Debug Authentication Control Register. + */ +__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void) +{ + return (DCB_NS->DAUTHCTRL); +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_DCBFunctions */ + + + + +/* ################################## Debug Identification function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_DIBFunctions Debug Identification Functions + \brief Functions that access the Debug Identification Block. + @{ + */ + + +/** + \brief Get Debug Authentication Status Register + \details Reads Debug Authentication Status register. + \return Debug Authentication Status Register. + */ +__STATIC_INLINE uint32_t DIB_GetAuthStatus(void) +{ + return (DIB->DAUTHSTATUS); +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Debug Authentication Status Register (non-secure) + \details Reads non-secure Debug Authentication Status register when in secure state. + \return Debug Authentication Status Register. + */ +__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void) +{ + return (DIB_NS->DAUTHSTATUS); +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_DCBFunctions */ + + +#if ((defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)) || \ + (defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U))) + +/* ########################## Cache functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_CacheFunctions Cache Functions + \brief Functions that configure Instruction and Data cache. + @{ + */ + +/* Cache Size ID Register Macros */ +#define CCSIDR_WAYS(x) (((x) & SCB_CCSIDR_ASSOCIATIVITY_Msk) >> SCB_CCSIDR_ASSOCIATIVITY_Pos) +#define CCSIDR_SETS(x) (((x) & SCB_CCSIDR_NUMSETS_Msk ) >> SCB_CCSIDR_NUMSETS_Pos ) + +#define __SCB_DCACHE_LINE_SIZE 32U /*!< STAR-MC1 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ +#define __SCB_ICACHE_LINE_SIZE 32U /*!< STAR-MC1 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ + +/** + \brief Enable I-Cache + \details Turns on I-Cache + */ +__STATIC_FORCEINLINE void SCB_EnableICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + if (SCB->CCR & SCB_CCR_IC_Msk) return; /* return if ICache is already enabled */ + + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ + __DSB(); + __ISB(); + SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; /* enable I-Cache */ + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Disable I-Cache + \details Turns off I-Cache + */ +__STATIC_FORCEINLINE void SCB_DisableICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk; /* disable I-Cache */ + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Invalidate I-Cache + \details Invalidates I-Cache + */ +__STATIC_FORCEINLINE void SCB_InvalidateICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; + __DSB(); + __ISB(); + #endif +} + + +/** + \brief I-Cache Invalidate by address + \details Invalidates I-Cache for the given address. + I-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. + I-Cache memory blocks which are part of given address + given size are invalidated. + \param[in] addr address + \param[in] isize size of memory block (in number of bytes) +*/ +__STATIC_FORCEINLINE void SCB_InvalidateICache_by_Addr (void *addr, int32_t isize) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + if ( isize > 0 ) { + int32_t op_size = isize + (((uint32_t)addr) & (__SCB_ICACHE_LINE_SIZE - 1U)); + uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_ICACHE_LINE_SIZE - 1U) */; + + __DSB(); + + do { + SCB->ICIMVAU = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ + op_addr += __SCB_ICACHE_LINE_SIZE; + op_size -= __SCB_ICACHE_LINE_SIZE; + } while ( op_size > 0 ); + + __DSB(); + __ISB(); + } + #endif +} + + +/** + \brief Enable D-Cache + \details Turns on D-Cache + */ +__STATIC_FORCEINLINE void SCB_EnableDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + if (SCB->CCR & SCB_CCR_DC_Msk) return; /* return if DCache is already enabled */ + + SCB->CSSELR = 0U; /* select Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | + ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + __DSB(); + + SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; /* enable D-Cache */ + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Disable D-Cache + \details Turns off D-Cache + */ +__STATIC_FORCEINLINE void SCB_DisableDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /* select Level 1 data cache */ + __DSB(); + + SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk; /* disable D-Cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean & invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | + ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Invalidate D-Cache + \details Invalidates D-Cache + */ +__STATIC_FORCEINLINE void SCB_InvalidateDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /* select Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | + ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Clean D-Cache + \details Cleans D-Cache + */ +__STATIC_FORCEINLINE void SCB_CleanDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /* select Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) | + ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Clean & Invalidate D-Cache + \details Cleans and Invalidates D-Cache + */ +__STATIC_FORCEINLINE void SCB_CleanInvalidateDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /* select Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean & invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | + ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief D-Cache Invalidate by address + \details Invalidates D-Cache for the given address. + D-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. + D-Cache memory blocks which are part of given address + given size are invalidated. + \param[in] addr address + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_FORCEINLINE void SCB_InvalidateDCache_by_Addr (void *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + if ( dsize > 0 ) { + int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); + uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; + + __DSB(); + + do { + SCB->DCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ + op_addr += __SCB_DCACHE_LINE_SIZE; + op_size -= __SCB_DCACHE_LINE_SIZE; + } while ( op_size > 0 ); + + __DSB(); + __ISB(); + } + #endif +} + + +/** + \brief D-Cache Clean by address + \details Cleans D-Cache for the given address + D-Cache is cleaned starting from a 32 byte aligned address in 32 byte granularity. + D-Cache memory blocks which are part of given address + given size are cleaned. + \param[in] addr address + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_FORCEINLINE void SCB_CleanDCache_by_Addr (uint32_t *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + if ( dsize > 0 ) { + int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); + uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; + + __DSB(); + + do { + SCB->DCCMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ + op_addr += __SCB_DCACHE_LINE_SIZE; + op_size -= __SCB_DCACHE_LINE_SIZE; + } while ( op_size > 0 ); + + __DSB(); + __ISB(); + } + #endif +} + + +/** + \brief D-Cache Clean and Invalidate by address + \details Cleans and invalidates D_Cache for the given address + D-Cache is cleaned and invalidated starting from a 32 byte aligned address in 32 byte granularity. + D-Cache memory blocks which are part of given address + given size are cleaned and invalidated. + \param[in] addr address (aligned to 32-byte boundary) + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_FORCEINLINE void SCB_CleanInvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + if ( dsize > 0 ) { + int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); + uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; + + __DSB(); + + do { + SCB->DCCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ + op_addr += __SCB_DCACHE_LINE_SIZE; + op_size -= __SCB_DCACHE_LINE_SIZE; + } while ( op_size > 0 ); + + __DSB(); + __ISB(); + } + #endif +} + +/*@} end of CMSIS_Core_CacheFunctions */ +#endif + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_STAR_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/Drivers/CMSIS/Include/mpu_armv7.h b/Drivers/CMSIS/Include/mpu_armv7.h new file mode 100644 index 0000000..d9eedf8 --- /dev/null +++ b/Drivers/CMSIS/Include/mpu_armv7.h @@ -0,0 +1,275 @@ +/****************************************************************************** + * @file mpu_armv7.h + * @brief CMSIS MPU API for Armv7-M MPU + * @version V5.1.2 + * @date 25. May 2020 + ******************************************************************************/ +/* + * Copyright (c) 2017-2020 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef ARM_MPU_ARMV7_H +#define ARM_MPU_ARMV7_H + +#define ARM_MPU_REGION_SIZE_32B ((uint8_t)0x04U) ///!< MPU Region Size 32 Bytes +#define ARM_MPU_REGION_SIZE_64B ((uint8_t)0x05U) ///!< MPU Region Size 64 Bytes +#define ARM_MPU_REGION_SIZE_128B ((uint8_t)0x06U) ///!< MPU Region Size 128 Bytes +#define ARM_MPU_REGION_SIZE_256B ((uint8_t)0x07U) ///!< MPU Region Size 256 Bytes +#define ARM_MPU_REGION_SIZE_512B ((uint8_t)0x08U) ///!< MPU Region Size 512 Bytes +#define ARM_MPU_REGION_SIZE_1KB ((uint8_t)0x09U) ///!< MPU Region Size 1 KByte +#define ARM_MPU_REGION_SIZE_2KB ((uint8_t)0x0AU) ///!< MPU Region Size 2 KBytes +#define ARM_MPU_REGION_SIZE_4KB ((uint8_t)0x0BU) ///!< MPU Region Size 4 KBytes +#define ARM_MPU_REGION_SIZE_8KB ((uint8_t)0x0CU) ///!< MPU Region Size 8 KBytes +#define ARM_MPU_REGION_SIZE_16KB ((uint8_t)0x0DU) ///!< MPU Region Size 16 KBytes +#define ARM_MPU_REGION_SIZE_32KB ((uint8_t)0x0EU) ///!< MPU Region Size 32 KBytes +#define ARM_MPU_REGION_SIZE_64KB ((uint8_t)0x0FU) ///!< MPU Region Size 64 KBytes +#define ARM_MPU_REGION_SIZE_128KB ((uint8_t)0x10U) ///!< MPU Region Size 128 KBytes +#define ARM_MPU_REGION_SIZE_256KB ((uint8_t)0x11U) ///!< MPU Region Size 256 KBytes +#define ARM_MPU_REGION_SIZE_512KB ((uint8_t)0x12U) ///!< MPU Region Size 512 KBytes +#define ARM_MPU_REGION_SIZE_1MB ((uint8_t)0x13U) ///!< MPU Region Size 1 MByte +#define ARM_MPU_REGION_SIZE_2MB ((uint8_t)0x14U) ///!< MPU Region Size 2 MBytes +#define ARM_MPU_REGION_SIZE_4MB ((uint8_t)0x15U) ///!< MPU Region Size 4 MBytes +#define ARM_MPU_REGION_SIZE_8MB ((uint8_t)0x16U) ///!< MPU Region Size 8 MBytes +#define ARM_MPU_REGION_SIZE_16MB ((uint8_t)0x17U) ///!< MPU Region Size 16 MBytes +#define ARM_MPU_REGION_SIZE_32MB ((uint8_t)0x18U) ///!< MPU Region Size 32 MBytes +#define ARM_MPU_REGION_SIZE_64MB ((uint8_t)0x19U) ///!< MPU Region Size 64 MBytes +#define ARM_MPU_REGION_SIZE_128MB ((uint8_t)0x1AU) ///!< MPU Region Size 128 MBytes +#define ARM_MPU_REGION_SIZE_256MB ((uint8_t)0x1BU) ///!< MPU Region Size 256 MBytes +#define ARM_MPU_REGION_SIZE_512MB ((uint8_t)0x1CU) ///!< MPU Region Size 512 MBytes +#define ARM_MPU_REGION_SIZE_1GB ((uint8_t)0x1DU) ///!< MPU Region Size 1 GByte +#define ARM_MPU_REGION_SIZE_2GB ((uint8_t)0x1EU) ///!< MPU Region Size 2 GBytes +#define ARM_MPU_REGION_SIZE_4GB ((uint8_t)0x1FU) ///!< MPU Region Size 4 GBytes + +#define ARM_MPU_AP_NONE 0U ///!< MPU Access Permission no access +#define ARM_MPU_AP_PRIV 1U ///!< MPU Access Permission privileged access only +#define ARM_MPU_AP_URO 2U ///!< MPU Access Permission unprivileged access read-only +#define ARM_MPU_AP_FULL 3U ///!< MPU Access Permission full access +#define ARM_MPU_AP_PRO 5U ///!< MPU Access Permission privileged access read-only +#define ARM_MPU_AP_RO 6U ///!< MPU Access Permission read-only access + +/** MPU Region Base Address Register Value +* +* \param Region The region to be configured, number 0 to 15. +* \param BaseAddress The base address for the region. +*/ +#define ARM_MPU_RBAR(Region, BaseAddress) \ + (((BaseAddress) & MPU_RBAR_ADDR_Msk) | \ + ((Region) & MPU_RBAR_REGION_Msk) | \ + (MPU_RBAR_VALID_Msk)) + +/** +* MPU Memory Access Attributes +* +* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. +* \param IsShareable Region is shareable between multiple bus masters. +* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. +* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. +*/ +#define ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable) \ + ((((TypeExtField) << MPU_RASR_TEX_Pos) & MPU_RASR_TEX_Msk) | \ + (((IsShareable) << MPU_RASR_S_Pos) & MPU_RASR_S_Msk) | \ + (((IsCacheable) << MPU_RASR_C_Pos) & MPU_RASR_C_Msk) | \ + (((IsBufferable) << MPU_RASR_B_Pos) & MPU_RASR_B_Msk)) + +/** +* MPU Region Attribute and Size Register Value +* +* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. +* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. +* \param AccessAttributes Memory access attribution, see \ref ARM_MPU_ACCESS_. +* \param SubRegionDisable Sub-region disable field. +* \param Size Region size of the region to be configured, for example 4K, 8K. +*/ +#define ARM_MPU_RASR_EX(DisableExec, AccessPermission, AccessAttributes, SubRegionDisable, Size) \ + ((((DisableExec) << MPU_RASR_XN_Pos) & MPU_RASR_XN_Msk) | \ + (((AccessPermission) << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk) | \ + (((AccessAttributes) & (MPU_RASR_TEX_Msk | MPU_RASR_S_Msk | MPU_RASR_C_Msk | MPU_RASR_B_Msk))) | \ + (((SubRegionDisable) << MPU_RASR_SRD_Pos) & MPU_RASR_SRD_Msk) | \ + (((Size) << MPU_RASR_SIZE_Pos) & MPU_RASR_SIZE_Msk) | \ + (((MPU_RASR_ENABLE_Msk)))) + +/** +* MPU Region Attribute and Size Register Value +* +* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. +* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. +* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. +* \param IsShareable Region is shareable between multiple bus masters. +* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. +* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. +* \param SubRegionDisable Sub-region disable field. +* \param Size Region size of the region to be configured, for example 4K, 8K. +*/ +#define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size) \ + ARM_MPU_RASR_EX(DisableExec, AccessPermission, ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable), SubRegionDisable, Size) + +/** +* MPU Memory Access Attribute for strongly ordered memory. +* - TEX: 000b +* - Shareable +* - Non-cacheable +* - Non-bufferable +*/ +#define ARM_MPU_ACCESS_ORDERED ARM_MPU_ACCESS_(0U, 1U, 0U, 0U) + +/** +* MPU Memory Access Attribute for device memory. +* - TEX: 000b (if shareable) or 010b (if non-shareable) +* - Shareable or non-shareable +* - Non-cacheable +* - Bufferable (if shareable) or non-bufferable (if non-shareable) +* +* \param IsShareable Configures the device memory as shareable or non-shareable. +*/ +#define ARM_MPU_ACCESS_DEVICE(IsShareable) ((IsShareable) ? ARM_MPU_ACCESS_(0U, 1U, 0U, 1U) : ARM_MPU_ACCESS_(2U, 0U, 0U, 0U)) + +/** +* MPU Memory Access Attribute for normal memory. +* - TEX: 1BBb (reflecting outer cacheability rules) +* - Shareable or non-shareable +* - Cacheable or non-cacheable (reflecting inner cacheability rules) +* - Bufferable or non-bufferable (reflecting inner cacheability rules) +* +* \param OuterCp Configures the outer cache policy. +* \param InnerCp Configures the inner cache policy. +* \param IsShareable Configures the memory as shareable or non-shareable. +*/ +#define ARM_MPU_ACCESS_NORMAL(OuterCp, InnerCp, IsShareable) ARM_MPU_ACCESS_((4U | (OuterCp)), IsShareable, ((InnerCp) >> 1U), ((InnerCp) & 1U)) + +/** +* MPU Memory Access Attribute non-cacheable policy. +*/ +#define ARM_MPU_CACHEP_NOCACHE 0U + +/** +* MPU Memory Access Attribute write-back, write and read allocate policy. +*/ +#define ARM_MPU_CACHEP_WB_WRA 1U + +/** +* MPU Memory Access Attribute write-through, no write allocate policy. +*/ +#define ARM_MPU_CACHEP_WT_NWA 2U + +/** +* MPU Memory Access Attribute write-back, no write allocate policy. +*/ +#define ARM_MPU_CACHEP_WB_NWA 3U + + +/** +* Struct for a single MPU Region +*/ +typedef struct { + uint32_t RBAR; //!< The region base address register value (RBAR) + uint32_t RASR; //!< The region attribute and size register value (RASR) \ref MPU_RASR +} ARM_MPU_Region_t; + +/** Enable the MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) +{ + __DMB(); + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif + __DSB(); + __ISB(); +} + +/** Disable the MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable(void) +{ + __DMB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; + __DSB(); + __ISB(); +} + +/** Clear and disable the given MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) +{ + MPU->RNR = rnr; + MPU->RASR = 0U; +} + +/** Configure an MPU region. +* \param rbar Value for RBAR register. +* \param rasr Value for RASR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr) +{ + MPU->RBAR = rbar; + MPU->RASR = rasr; +} + +/** Configure the given MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rasr Value for RASR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr) +{ + MPU->RNR = rnr; + MPU->RBAR = rbar; + MPU->RASR = rasr; +} + +/** Memcpy with strictly ordered memory access, e.g. used by code in ARM_MPU_Load(). +* \param dst Destination data is copied to. +* \param src Source data is copied from. +* \param len Amount of data words to be copied. +*/ +__STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) +{ + uint32_t i; + for (i = 0U; i < len; ++i) + { + dst[i] = src[i]; + } +} + +/** Load the given number of MPU regions from a table. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load(ARM_MPU_Region_t const* table, uint32_t cnt) +{ + const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; + while (cnt > MPU_TYPE_RALIASES) { + ARM_MPU_OrderedMemcpy(&(MPU->RBAR), &(table->RBAR), MPU_TYPE_RALIASES*rowWordSize); + table += MPU_TYPE_RALIASES; + cnt -= MPU_TYPE_RALIASES; + } + ARM_MPU_OrderedMemcpy(&(MPU->RBAR), &(table->RBAR), cnt*rowWordSize); +} + +#endif diff --git a/Drivers/CMSIS/Include/mpu_armv8.h b/Drivers/CMSIS/Include/mpu_armv8.h new file mode 100644 index 0000000..3de16ef --- /dev/null +++ b/Drivers/CMSIS/Include/mpu_armv8.h @@ -0,0 +1,352 @@ +/****************************************************************************** + * @file mpu_armv8.h + * @brief CMSIS MPU API for Armv8-M and Armv8.1-M MPU + * @version V5.1.3 + * @date 03. February 2021 + ******************************************************************************/ +/* + * Copyright (c) 2017-2021 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef ARM_MPU_ARMV8_H +#define ARM_MPU_ARMV8_H + +/** \brief Attribute for device memory (outer only) */ +#define ARM_MPU_ATTR_DEVICE ( 0U ) + +/** \brief Attribute for non-cacheable, normal memory */ +#define ARM_MPU_ATTR_NON_CACHEABLE ( 4U ) + +/** \brief Attribute for normal memory (outer and inner) +* \param NT Non-Transient: Set to 1 for non-transient data. +* \param WB Write-Back: Set to 1 to use write-back update policy. +* \param RA Read Allocation: Set to 1 to use cache allocation on read miss. +* \param WA Write Allocation: Set to 1 to use cache allocation on write miss. +*/ +#define ARM_MPU_ATTR_MEMORY_(NT, WB, RA, WA) \ + ((((NT) & 1U) << 3U) | (((WB) & 1U) << 2U) | (((RA) & 1U) << 1U) | ((WA) & 1U)) + +/** \brief Device memory type non Gathering, non Re-ordering, non Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGnRnE (0U) + +/** \brief Device memory type non Gathering, non Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGnRE (1U) + +/** \brief Device memory type non Gathering, Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGRE (2U) + +/** \brief Device memory type Gathering, Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_GRE (3U) + +/** \brief Memory Attribute +* \param O Outer memory attributes +* \param I O == ARM_MPU_ATTR_DEVICE: Device memory attributes, else: Inner memory attributes +*/ +#define ARM_MPU_ATTR(O, I) ((((O) & 0xFU) << 4U) | ((((O) & 0xFU) != 0U) ? ((I) & 0xFU) : (((I) & 0x3U) << 2U))) + +/** \brief Normal memory non-shareable */ +#define ARM_MPU_SH_NON (0U) + +/** \brief Normal memory outer shareable */ +#define ARM_MPU_SH_OUTER (2U) + +/** \brief Normal memory inner shareable */ +#define ARM_MPU_SH_INNER (3U) + +/** \brief Memory access permissions +* \param RO Read-Only: Set to 1 for read-only memory. +* \param NP Non-Privileged: Set to 1 for non-privileged memory. +*/ +#define ARM_MPU_AP_(RO, NP) ((((RO) & 1U) << 1U) | ((NP) & 1U)) + +/** \brief Region Base Address Register value +* \param BASE The base address bits [31:5] of a memory region. The value is zero extended. Effective address gets 32 byte aligned. +* \param SH Defines the Shareability domain for this memory region. +* \param RO Read-Only: Set to 1 for a read-only memory region. +* \param NP Non-Privileged: Set to 1 for a non-privileged memory region. +* \oaram XN eXecute Never: Set to 1 for a non-executable memory region. +*/ +#define ARM_MPU_RBAR(BASE, SH, RO, NP, XN) \ + (((BASE) & MPU_RBAR_BASE_Msk) | \ + (((SH) << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) | \ + ((ARM_MPU_AP_(RO, NP) << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) | \ + (((XN) << MPU_RBAR_XN_Pos) & MPU_RBAR_XN_Msk)) + +/** \brief Region Limit Address Register value +* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended. +* \param IDX The attribute index to be associated with this memory region. +*/ +#define ARM_MPU_RLAR(LIMIT, IDX) \ + (((LIMIT) & MPU_RLAR_LIMIT_Msk) | \ + (((IDX) << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \ + (MPU_RLAR_EN_Msk)) + +#if defined(MPU_RLAR_PXN_Pos) + +/** \brief Region Limit Address Register with PXN value +* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended. +* \param PXN Privileged execute never. Defines whether code can be executed from this privileged region. +* \param IDX The attribute index to be associated with this memory region. +*/ +#define ARM_MPU_RLAR_PXN(LIMIT, PXN, IDX) \ + (((LIMIT) & MPU_RLAR_LIMIT_Msk) | \ + (((PXN) << MPU_RLAR_PXN_Pos) & MPU_RLAR_PXN_Msk) | \ + (((IDX) << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \ + (MPU_RLAR_EN_Msk)) + +#endif + +/** +* Struct for a single MPU Region +*/ +typedef struct { + uint32_t RBAR; /*!< Region Base Address Register value */ + uint32_t RLAR; /*!< Region Limit Address Register value */ +} ARM_MPU_Region_t; + +/** Enable the MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) +{ + __DMB(); + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif + __DSB(); + __ISB(); +} + +/** Disable the MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable(void) +{ + __DMB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; + __DSB(); + __ISB(); +} + +#ifdef MPU_NS +/** Enable the Non-secure MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable_NS(uint32_t MPU_Control) +{ + __DMB(); + MPU_NS->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB_NS->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif + __DSB(); + __ISB(); +} + +/** Disable the Non-secure MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable_NS(void) +{ + __DMB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB_NS->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU_NS->CTRL &= ~MPU_CTRL_ENABLE_Msk; + __DSB(); + __ISB(); +} +#endif + +/** Set the memory attribute encoding to the given MPU. +* \param mpu Pointer to the MPU to be configured. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttrEx(MPU_Type* mpu, uint8_t idx, uint8_t attr) +{ + const uint8_t reg = idx / 4U; + const uint32_t pos = ((idx % 4U) * 8U); + const uint32_t mask = 0xFFU << pos; + + if (reg >= (sizeof(mpu->MAIR) / sizeof(mpu->MAIR[0]))) { + return; // invalid index + } + + mpu->MAIR[reg] = ((mpu->MAIR[reg] & ~mask) | ((attr << pos) & mask)); +} + +/** Set the memory attribute encoding. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttr(uint8_t idx, uint8_t attr) +{ + ARM_MPU_SetMemAttrEx(MPU, idx, attr); +} + +#ifdef MPU_NS +/** Set the memory attribute encoding to the Non-secure MPU. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttr_NS(uint8_t idx, uint8_t attr) +{ + ARM_MPU_SetMemAttrEx(MPU_NS, idx, attr); +} +#endif + +/** Clear and disable the given MPU region of the given MPU. +* \param mpu Pointer to MPU to be used. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegionEx(MPU_Type* mpu, uint32_t rnr) +{ + mpu->RNR = rnr; + mpu->RLAR = 0U; +} + +/** Clear and disable the given MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) +{ + ARM_MPU_ClrRegionEx(MPU, rnr); +} + +#ifdef MPU_NS +/** Clear and disable the given Non-secure MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion_NS(uint32_t rnr) +{ + ARM_MPU_ClrRegionEx(MPU_NS, rnr); +} +#endif + +/** Configure the given MPU region of the given MPU. +* \param mpu Pointer to MPU to be used. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegionEx(MPU_Type* mpu, uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + mpu->RNR = rnr; + mpu->RBAR = rbar; + mpu->RLAR = rlar; +} + +/** Configure the given MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + ARM_MPU_SetRegionEx(MPU, rnr, rbar, rlar); +} + +#ifdef MPU_NS +/** Configure the given Non-secure MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion_NS(uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + ARM_MPU_SetRegionEx(MPU_NS, rnr, rbar, rlar); +} +#endif + +/** Memcpy with strictly ordered memory access, e.g. used by code in ARM_MPU_LoadEx() +* \param dst Destination data is copied to. +* \param src Source data is copied from. +* \param len Amount of data words to be copied. +*/ +__STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) +{ + uint32_t i; + for (i = 0U; i < len; ++i) + { + dst[i] = src[i]; + } +} + +/** Load the given number of MPU regions from a table to the given MPU. +* \param mpu Pointer to the MPU registers to be used. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_LoadEx(MPU_Type* mpu, uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; + if (cnt == 1U) { + mpu->RNR = rnr; + ARM_MPU_OrderedMemcpy(&(mpu->RBAR), &(table->RBAR), rowWordSize); + } else { + uint32_t rnrBase = rnr & ~(MPU_TYPE_RALIASES-1U); + uint32_t rnrOffset = rnr % MPU_TYPE_RALIASES; + + mpu->RNR = rnrBase; + while ((rnrOffset + cnt) > MPU_TYPE_RALIASES) { + uint32_t c = MPU_TYPE_RALIASES - rnrOffset; + ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), c*rowWordSize); + table += c; + cnt -= c; + rnrOffset = 0U; + rnrBase += MPU_TYPE_RALIASES; + mpu->RNR = rnrBase; + } + + ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), cnt*rowWordSize); + } +} + +/** Load the given number of MPU regions from a table. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + ARM_MPU_LoadEx(MPU, rnr, table, cnt); +} + +#ifdef MPU_NS +/** Load the given number of MPU regions from a table to the Non-secure MPU. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load_NS(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + ARM_MPU_LoadEx(MPU_NS, rnr, table, cnt); +} +#endif + +#endif + diff --git a/Drivers/CMSIS/Include/pac_armv81.h b/Drivers/CMSIS/Include/pac_armv81.h new file mode 100644 index 0000000..854b60a --- /dev/null +++ b/Drivers/CMSIS/Include/pac_armv81.h @@ -0,0 +1,206 @@ +/****************************************************************************** + * @file pac_armv81.h + * @brief CMSIS PAC key functions for Armv8.1-M PAC extension + * @version V1.0.0 + * @date 23. March 2022 + ******************************************************************************/ +/* + * Copyright (c) 2022 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef PAC_ARMV81_H +#define PAC_ARMV81_H + + +/* ################### PAC Key functions ########################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_PacKeyFunctions PAC Key functions + \brief Functions that access the PAC keys. + @{ + */ + +#if (defined (__ARM_FEATURE_PAUTH) && (__ARM_FEATURE_PAUTH == 1)) + +/** + \brief read the PAC key used for privileged mode + \details Reads the PAC key stored in the PAC_KEY_P registers. + \param [out] pPacKey 128bit PAC key + */ +__STATIC_FORCEINLINE void __get_PAC_KEY_P (uint32_t* pPacKey) { + __ASM volatile ( + "mrs r1, pac_key_p_0\n" + "str r1,[%0,#0]\n" + "mrs r1, pac_key_p_1\n" + "str r1,[%0,#4]\n" + "mrs r1, pac_key_p_2\n" + "str r1,[%0,#8]\n" + "mrs r1, pac_key_p_3\n" + "str r1,[%0,#12]\n" + : : "r" (pPacKey) : "memory", "r1" + ); +} + +/** + \brief write the PAC key used for privileged mode + \details writes the given PAC key to the PAC_KEY_P registers. + \param [in] pPacKey 128bit PAC key + */ +__STATIC_FORCEINLINE void __set_PAC_KEY_P (uint32_t* pPacKey) { + __ASM volatile ( + "ldr r1,[%0,#0]\n" + "msr pac_key_p_0, r1\n" + "ldr r1,[%0,#4]\n" + "msr pac_key_p_1, r1\n" + "ldr r1,[%0,#8]\n" + "msr pac_key_p_2, r1\n" + "ldr r1,[%0,#12]\n" + "msr pac_key_p_3, r1\n" + : : "r" (pPacKey) : "memory", "r1" + ); +} + +/** + \brief read the PAC key used for unprivileged mode + \details Reads the PAC key stored in the PAC_KEY_U registers. + \param [out] pPacKey 128bit PAC key + */ +__STATIC_FORCEINLINE void __get_PAC_KEY_U (uint32_t* pPacKey) { + __ASM volatile ( + "mrs r1, pac_key_u_0\n" + "str r1,[%0,#0]\n" + "mrs r1, pac_key_u_1\n" + "str r1,[%0,#4]\n" + "mrs r1, pac_key_u_2\n" + "str r1,[%0,#8]\n" + "mrs r1, pac_key_u_3\n" + "str r1,[%0,#12]\n" + : : "r" (pPacKey) : "memory", "r1" + ); +} + +/** + \brief write the PAC key used for unprivileged mode + \details writes the given PAC key to the PAC_KEY_U registers. + \param [in] pPacKey 128bit PAC key + */ +__STATIC_FORCEINLINE void __set_PAC_KEY_U (uint32_t* pPacKey) { + __ASM volatile ( + "ldr r1,[%0,#0]\n" + "msr pac_key_u_0, r1\n" + "ldr r1,[%0,#4]\n" + "msr pac_key_u_1, r1\n" + "ldr r1,[%0,#8]\n" + "msr pac_key_u_2, r1\n" + "ldr r1,[%0,#12]\n" + "msr pac_key_u_3, r1\n" + : : "r" (pPacKey) : "memory", "r1" + ); +} + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + +/** + \brief read the PAC key used for privileged mode (non-secure) + \details Reads the PAC key stored in the non-secure PAC_KEY_P registers when in secure mode. + \param [out] pPacKey 128bit PAC key + */ +__STATIC_FORCEINLINE void __TZ_get_PAC_KEY_P_NS (uint32_t* pPacKey) { + __ASM volatile ( + "mrs r1, pac_key_p_0_ns\n" + "str r1,[%0,#0]\n" + "mrs r1, pac_key_p_1_ns\n" + "str r1,[%0,#4]\n" + "mrs r1, pac_key_p_2_ns\n" + "str r1,[%0,#8]\n" + "mrs r1, pac_key_p_3_ns\n" + "str r1,[%0,#12]\n" + : : "r" (pPacKey) : "memory", "r1" + ); +} + +/** + \brief write the PAC key used for privileged mode (non-secure) + \details writes the given PAC key to the non-secure PAC_KEY_P registers when in secure mode. + \param [in] pPacKey 128bit PAC key + */ +__STATIC_FORCEINLINE void __TZ_set_PAC_KEY_P_NS (uint32_t* pPacKey) { + __ASM volatile ( + "ldr r1,[%0,#0]\n" + "msr pac_key_p_0_ns, r1\n" + "ldr r1,[%0,#4]\n" + "msr pac_key_p_1_ns, r1\n" + "ldr r1,[%0,#8]\n" + "msr pac_key_p_2_ns, r1\n" + "ldr r1,[%0,#12]\n" + "msr pac_key_p_3_ns, r1\n" + : : "r" (pPacKey) : "memory", "r1" + ); +} + +/** + \brief read the PAC key used for unprivileged mode (non-secure) + \details Reads the PAC key stored in the non-secure PAC_KEY_U registers when in secure mode. + \param [out] pPacKey 128bit PAC key + */ +__STATIC_FORCEINLINE void __TZ_get_PAC_KEY_U_NS (uint32_t* pPacKey) { + __ASM volatile ( + "mrs r1, pac_key_u_0_ns\n" + "str r1,[%0,#0]\n" + "mrs r1, pac_key_u_1_ns\n" + "str r1,[%0,#4]\n" + "mrs r1, pac_key_u_2_ns\n" + "str r1,[%0,#8]\n" + "mrs r1, pac_key_u_3_ns\n" + "str r1,[%0,#12]\n" + : : "r" (pPacKey) : "memory", "r1" + ); +} + +/** + \brief write the PAC key used for unprivileged mode (non-secure) + \details writes the given PAC key to the non-secure PAC_KEY_U registers when in secure mode. + \param [in] pPacKey 128bit PAC key + */ +__STATIC_FORCEINLINE void __TZ_set_PAC_KEY_U_NS (uint32_t* pPacKey) { + __ASM volatile ( + "ldr r1,[%0,#0]\n" + "msr pac_key_u_0_ns, r1\n" + "ldr r1,[%0,#4]\n" + "msr pac_key_u_1_ns, r1\n" + "ldr r1,[%0,#8]\n" + "msr pac_key_u_2_ns, r1\n" + "ldr r1,[%0,#12]\n" + "msr pac_key_u_3_ns, r1\n" + : : "r" (pPacKey) : "memory", "r1" + ); +} + +#endif /* (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) */ + +#endif /* (defined (__ARM_FEATURE_PAUTH) && (__ARM_FEATURE_PAUTH == 1)) */ + +/*@} end of CMSIS_Core_PacKeyFunctions */ + + +#endif /* PAC_ARMV81_H */ diff --git a/Drivers/CMSIS/Include/pmu_armv8.h b/Drivers/CMSIS/Include/pmu_armv8.h new file mode 100644 index 0000000..f8f3d89 --- /dev/null +++ b/Drivers/CMSIS/Include/pmu_armv8.h @@ -0,0 +1,337 @@ +/****************************************************************************** + * @file pmu_armv8.h + * @brief CMSIS PMU API for Armv8.1-M PMU + * @version V1.0.1 + * @date 15. April 2020 + ******************************************************************************/ +/* + * Copyright (c) 2020 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef ARM_PMU_ARMV8_H +#define ARM_PMU_ARMV8_H + +/** + * \brief PMU Events + * \note See the Armv8.1-M Architecture Reference Manual for full details on these PMU events. + * */ + +#define ARM_PMU_SW_INCR 0x0000 /*!< Software update to the PMU_SWINC register, architecturally executed and condition code check pass */ +#define ARM_PMU_L1I_CACHE_REFILL 0x0001 /*!< L1 I-Cache refill */ +#define ARM_PMU_L1D_CACHE_REFILL 0x0003 /*!< L1 D-Cache refill */ +#define ARM_PMU_L1D_CACHE 0x0004 /*!< L1 D-Cache access */ +#define ARM_PMU_LD_RETIRED 0x0006 /*!< Memory-reading instruction architecturally executed and condition code check pass */ +#define ARM_PMU_ST_RETIRED 0x0007 /*!< Memory-writing instruction architecturally executed and condition code check pass */ +#define ARM_PMU_INST_RETIRED 0x0008 /*!< Instruction architecturally executed */ +#define ARM_PMU_EXC_TAKEN 0x0009 /*!< Exception entry */ +#define ARM_PMU_EXC_RETURN 0x000A /*!< Exception return instruction architecturally executed and the condition code check pass */ +#define ARM_PMU_PC_WRITE_RETIRED 0x000C /*!< Software change to the Program Counter (PC). Instruction is architecturally executed and condition code check pass */ +#define ARM_PMU_BR_IMMED_RETIRED 0x000D /*!< Immediate branch architecturally executed */ +#define ARM_PMU_BR_RETURN_RETIRED 0x000E /*!< Function return instruction architecturally executed and the condition code check pass */ +#define ARM_PMU_UNALIGNED_LDST_RETIRED 0x000F /*!< Unaligned memory memory-reading or memory-writing instruction architecturally executed and condition code check pass */ +#define ARM_PMU_BR_MIS_PRED 0x0010 /*!< Mispredicted or not predicted branch speculatively executed */ +#define ARM_PMU_CPU_CYCLES 0x0011 /*!< Cycle */ +#define ARM_PMU_BR_PRED 0x0012 /*!< Predictable branch speculatively executed */ +#define ARM_PMU_MEM_ACCESS 0x0013 /*!< Data memory access */ +#define ARM_PMU_L1I_CACHE 0x0014 /*!< Level 1 instruction cache access */ +#define ARM_PMU_L1D_CACHE_WB 0x0015 /*!< Level 1 data cache write-back */ +#define ARM_PMU_L2D_CACHE 0x0016 /*!< Level 2 data cache access */ +#define ARM_PMU_L2D_CACHE_REFILL 0x0017 /*!< Level 2 data cache refill */ +#define ARM_PMU_L2D_CACHE_WB 0x0018 /*!< Level 2 data cache write-back */ +#define ARM_PMU_BUS_ACCESS 0x0019 /*!< Bus access */ +#define ARM_PMU_MEMORY_ERROR 0x001A /*!< Local memory error */ +#define ARM_PMU_INST_SPEC 0x001B /*!< Instruction speculatively executed */ +#define ARM_PMU_BUS_CYCLES 0x001D /*!< Bus cycles */ +#define ARM_PMU_CHAIN 0x001E /*!< For an odd numbered counter, increment when an overflow occurs on the preceding even-numbered counter on the same PE */ +#define ARM_PMU_L1D_CACHE_ALLOCATE 0x001F /*!< Level 1 data cache allocation without refill */ +#define ARM_PMU_L2D_CACHE_ALLOCATE 0x0020 /*!< Level 2 data cache allocation without refill */ +#define ARM_PMU_BR_RETIRED 0x0021 /*!< Branch instruction architecturally executed */ +#define ARM_PMU_BR_MIS_PRED_RETIRED 0x0022 /*!< Mispredicted branch instruction architecturally executed */ +#define ARM_PMU_STALL_FRONTEND 0x0023 /*!< No operation issued because of the frontend */ +#define ARM_PMU_STALL_BACKEND 0x0024 /*!< No operation issued because of the backend */ +#define ARM_PMU_L2I_CACHE 0x0027 /*!< Level 2 instruction cache access */ +#define ARM_PMU_L2I_CACHE_REFILL 0x0028 /*!< Level 2 instruction cache refill */ +#define ARM_PMU_L3D_CACHE_ALLOCATE 0x0029 /*!< Level 3 data cache allocation without refill */ +#define ARM_PMU_L3D_CACHE_REFILL 0x002A /*!< Level 3 data cache refill */ +#define ARM_PMU_L3D_CACHE 0x002B /*!< Level 3 data cache access */ +#define ARM_PMU_L3D_CACHE_WB 0x002C /*!< Level 3 data cache write-back */ +#define ARM_PMU_LL_CACHE_RD 0x0036 /*!< Last level data cache read */ +#define ARM_PMU_LL_CACHE_MISS_RD 0x0037 /*!< Last level data cache read miss */ +#define ARM_PMU_L1D_CACHE_MISS_RD 0x0039 /*!< Level 1 data cache read miss */ +#define ARM_PMU_OP_COMPLETE 0x003A /*!< Operation retired */ +#define ARM_PMU_OP_SPEC 0x003B /*!< Operation speculatively executed */ +#define ARM_PMU_STALL 0x003C /*!< Stall cycle for instruction or operation not sent for execution */ +#define ARM_PMU_STALL_OP_BACKEND 0x003D /*!< Stall cycle for instruction or operation not sent for execution due to pipeline backend */ +#define ARM_PMU_STALL_OP_FRONTEND 0x003E /*!< Stall cycle for instruction or operation not sent for execution due to pipeline frontend */ +#define ARM_PMU_STALL_OP 0x003F /*!< Instruction or operation slots not occupied each cycle */ +#define ARM_PMU_L1D_CACHE_RD 0x0040 /*!< Level 1 data cache read */ +#define ARM_PMU_LE_RETIRED 0x0100 /*!< Loop end instruction executed */ +#define ARM_PMU_LE_SPEC 0x0101 /*!< Loop end instruction speculatively executed */ +#define ARM_PMU_BF_RETIRED 0x0104 /*!< Branch future instruction architecturally executed and condition code check pass */ +#define ARM_PMU_BF_SPEC 0x0105 /*!< Branch future instruction speculatively executed and condition code check pass */ +#define ARM_PMU_LE_CANCEL 0x0108 /*!< Loop end instruction not taken */ +#define ARM_PMU_BF_CANCEL 0x0109 /*!< Branch future instruction not taken */ +#define ARM_PMU_SE_CALL_S 0x0114 /*!< Call to secure function, resulting in Security state change */ +#define ARM_PMU_SE_CALL_NS 0x0115 /*!< Call to non-secure function, resulting in Security state change */ +#define ARM_PMU_DWT_CMPMATCH0 0x0118 /*!< DWT comparator 0 match */ +#define ARM_PMU_DWT_CMPMATCH1 0x0119 /*!< DWT comparator 1 match */ +#define ARM_PMU_DWT_CMPMATCH2 0x011A /*!< DWT comparator 2 match */ +#define ARM_PMU_DWT_CMPMATCH3 0x011B /*!< DWT comparator 3 match */ +#define ARM_PMU_MVE_INST_RETIRED 0x0200 /*!< MVE instruction architecturally executed */ +#define ARM_PMU_MVE_INST_SPEC 0x0201 /*!< MVE instruction speculatively executed */ +#define ARM_PMU_MVE_FP_RETIRED 0x0204 /*!< MVE floating-point instruction architecturally executed */ +#define ARM_PMU_MVE_FP_SPEC 0x0205 /*!< MVE floating-point instruction speculatively executed */ +#define ARM_PMU_MVE_FP_HP_RETIRED 0x0208 /*!< MVE half-precision floating-point instruction architecturally executed */ +#define ARM_PMU_MVE_FP_HP_SPEC 0x0209 /*!< MVE half-precision floating-point instruction speculatively executed */ +#define ARM_PMU_MVE_FP_SP_RETIRED 0x020C /*!< MVE single-precision floating-point instruction architecturally executed */ +#define ARM_PMU_MVE_FP_SP_SPEC 0x020D /*!< MVE single-precision floating-point instruction speculatively executed */ +#define ARM_PMU_MVE_FP_MAC_RETIRED 0x0214 /*!< MVE floating-point multiply or multiply-accumulate instruction architecturally executed */ +#define ARM_PMU_MVE_FP_MAC_SPEC 0x0215 /*!< MVE floating-point multiply or multiply-accumulate instruction speculatively executed */ +#define ARM_PMU_MVE_INT_RETIRED 0x0224 /*!< MVE integer instruction architecturally executed */ +#define ARM_PMU_MVE_INT_SPEC 0x0225 /*!< MVE integer instruction speculatively executed */ +#define ARM_PMU_MVE_INT_MAC_RETIRED 0x0228 /*!< MVE multiply or multiply-accumulate instruction architecturally executed */ +#define ARM_PMU_MVE_INT_MAC_SPEC 0x0229 /*!< MVE multiply or multiply-accumulate instruction speculatively executed */ +#define ARM_PMU_MVE_LDST_RETIRED 0x0238 /*!< MVE load or store instruction architecturally executed */ +#define ARM_PMU_MVE_LDST_SPEC 0x0239 /*!< MVE load or store instruction speculatively executed */ +#define ARM_PMU_MVE_LD_RETIRED 0x023C /*!< MVE load instruction architecturally executed */ +#define ARM_PMU_MVE_LD_SPEC 0x023D /*!< MVE load instruction speculatively executed */ +#define ARM_PMU_MVE_ST_RETIRED 0x0240 /*!< MVE store instruction architecturally executed */ +#define ARM_PMU_MVE_ST_SPEC 0x0241 /*!< MVE store instruction speculatively executed */ +#define ARM_PMU_MVE_LDST_CONTIG_RETIRED 0x0244 /*!< MVE contiguous load or store instruction architecturally executed */ +#define ARM_PMU_MVE_LDST_CONTIG_SPEC 0x0245 /*!< MVE contiguous load or store instruction speculatively executed */ +#define ARM_PMU_MVE_LD_CONTIG_RETIRED 0x0248 /*!< MVE contiguous load instruction architecturally executed */ +#define ARM_PMU_MVE_LD_CONTIG_SPEC 0x0249 /*!< MVE contiguous load instruction speculatively executed */ +#define ARM_PMU_MVE_ST_CONTIG_RETIRED 0x024C /*!< MVE contiguous store instruction architecturally executed */ +#define ARM_PMU_MVE_ST_CONTIG_SPEC 0x024D /*!< MVE contiguous store instruction speculatively executed */ +#define ARM_PMU_MVE_LDST_NONCONTIG_RETIRED 0x0250 /*!< MVE non-contiguous load or store instruction architecturally executed */ +#define ARM_PMU_MVE_LDST_NONCONTIG_SPEC 0x0251 /*!< MVE non-contiguous load or store instruction speculatively executed */ +#define ARM_PMU_MVE_LD_NONCONTIG_RETIRED 0x0254 /*!< MVE non-contiguous load instruction architecturally executed */ +#define ARM_PMU_MVE_LD_NONCONTIG_SPEC 0x0255 /*!< MVE non-contiguous load instruction speculatively executed */ +#define ARM_PMU_MVE_ST_NONCONTIG_RETIRED 0x0258 /*!< MVE non-contiguous store instruction architecturally executed */ +#define ARM_PMU_MVE_ST_NONCONTIG_SPEC 0x0259 /*!< MVE non-contiguous store instruction speculatively executed */ +#define ARM_PMU_MVE_LDST_MULTI_RETIRED 0x025C /*!< MVE memory instruction targeting multiple registers architecturally executed */ +#define ARM_PMU_MVE_LDST_MULTI_SPEC 0x025D /*!< MVE memory instruction targeting multiple registers speculatively executed */ +#define ARM_PMU_MVE_LD_MULTI_RETIRED 0x0260 /*!< MVE memory load instruction targeting multiple registers architecturally executed */ +#define ARM_PMU_MVE_LD_MULTI_SPEC 0x0261 /*!< MVE memory load instruction targeting multiple registers speculatively executed */ +#define ARM_PMU_MVE_ST_MULTI_RETIRED 0x0261 /*!< MVE memory store instruction targeting multiple registers architecturally executed */ +#define ARM_PMU_MVE_ST_MULTI_SPEC 0x0265 /*!< MVE memory store instruction targeting multiple registers speculatively executed */ +#define ARM_PMU_MVE_LDST_UNALIGNED_RETIRED 0x028C /*!< MVE unaligned memory load or store instruction architecturally executed */ +#define ARM_PMU_MVE_LDST_UNALIGNED_SPEC 0x028D /*!< MVE unaligned memory load or store instruction speculatively executed */ +#define ARM_PMU_MVE_LD_UNALIGNED_RETIRED 0x0290 /*!< MVE unaligned load instruction architecturally executed */ +#define ARM_PMU_MVE_LD_UNALIGNED_SPEC 0x0291 /*!< MVE unaligned load instruction speculatively executed */ +#define ARM_PMU_MVE_ST_UNALIGNED_RETIRED 0x0294 /*!< MVE unaligned store instruction architecturally executed */ +#define ARM_PMU_MVE_ST_UNALIGNED_SPEC 0x0295 /*!< MVE unaligned store instruction speculatively executed */ +#define ARM_PMU_MVE_LDST_UNALIGNED_NONCONTIG_RETIRED 0x0298 /*!< MVE unaligned noncontiguous load or store instruction architecturally executed */ +#define ARM_PMU_MVE_LDST_UNALIGNED_NONCONTIG_SPEC 0x0299 /*!< MVE unaligned noncontiguous load or store instruction speculatively executed */ +#define ARM_PMU_MVE_VREDUCE_RETIRED 0x02A0 /*!< MVE vector reduction instruction architecturally executed */ +#define ARM_PMU_MVE_VREDUCE_SPEC 0x02A1 /*!< MVE vector reduction instruction speculatively executed */ +#define ARM_PMU_MVE_VREDUCE_FP_RETIRED 0x02A4 /*!< MVE floating-point vector reduction instruction architecturally executed */ +#define ARM_PMU_MVE_VREDUCE_FP_SPEC 0x02A5 /*!< MVE floating-point vector reduction instruction speculatively executed */ +#define ARM_PMU_MVE_VREDUCE_INT_RETIRED 0x02A8 /*!< MVE integer vector reduction instruction architecturally executed */ +#define ARM_PMU_MVE_VREDUCE_INT_SPEC 0x02A9 /*!< MVE integer vector reduction instruction speculatively executed */ +#define ARM_PMU_MVE_PRED 0x02B8 /*!< Cycles where one or more predicated beats architecturally executed */ +#define ARM_PMU_MVE_STALL 0x02CC /*!< Stall cycles caused by an MVE instruction */ +#define ARM_PMU_MVE_STALL_RESOURCE 0x02CD /*!< Stall cycles caused by an MVE instruction because of resource conflicts */ +#define ARM_PMU_MVE_STALL_RESOURCE_MEM 0x02CE /*!< Stall cycles caused by an MVE instruction because of memory resource conflicts */ +#define ARM_PMU_MVE_STALL_RESOURCE_FP 0x02CF /*!< Stall cycles caused by an MVE instruction because of floating-point resource conflicts */ +#define ARM_PMU_MVE_STALL_RESOURCE_INT 0x02D0 /*!< Stall cycles caused by an MVE instruction because of integer resource conflicts */ +#define ARM_PMU_MVE_STALL_BREAK 0x02D3 /*!< Stall cycles caused by an MVE chain break */ +#define ARM_PMU_MVE_STALL_DEPENDENCY 0x02D4 /*!< Stall cycles caused by MVE register dependency */ +#define ARM_PMU_ITCM_ACCESS 0x4007 /*!< Instruction TCM access */ +#define ARM_PMU_DTCM_ACCESS 0x4008 /*!< Data TCM access */ +#define ARM_PMU_TRCEXTOUT0 0x4010 /*!< ETM external output 0 */ +#define ARM_PMU_TRCEXTOUT1 0x4011 /*!< ETM external output 1 */ +#define ARM_PMU_TRCEXTOUT2 0x4012 /*!< ETM external output 2 */ +#define ARM_PMU_TRCEXTOUT3 0x4013 /*!< ETM external output 3 */ +#define ARM_PMU_CTI_TRIGOUT4 0x4018 /*!< Cross-trigger Interface output trigger 4 */ +#define ARM_PMU_CTI_TRIGOUT5 0x4019 /*!< Cross-trigger Interface output trigger 5 */ +#define ARM_PMU_CTI_TRIGOUT6 0x401A /*!< Cross-trigger Interface output trigger 6 */ +#define ARM_PMU_CTI_TRIGOUT7 0x401B /*!< Cross-trigger Interface output trigger 7 */ + +/** \brief PMU Functions */ + +__STATIC_INLINE void ARM_PMU_Enable(void); +__STATIC_INLINE void ARM_PMU_Disable(void); + +__STATIC_INLINE void ARM_PMU_Set_EVTYPER(uint32_t num, uint32_t type); + +__STATIC_INLINE void ARM_PMU_CYCCNT_Reset(void); +__STATIC_INLINE void ARM_PMU_EVCNTR_ALL_Reset(void); + +__STATIC_INLINE void ARM_PMU_CNTR_Enable(uint32_t mask); +__STATIC_INLINE void ARM_PMU_CNTR_Disable(uint32_t mask); + +__STATIC_INLINE uint32_t ARM_PMU_Get_CCNTR(void); +__STATIC_INLINE uint32_t ARM_PMU_Get_EVCNTR(uint32_t num); + +__STATIC_INLINE uint32_t ARM_PMU_Get_CNTR_OVS(void); +__STATIC_INLINE void ARM_PMU_Set_CNTR_OVS(uint32_t mask); + +__STATIC_INLINE void ARM_PMU_Set_CNTR_IRQ_Enable(uint32_t mask); +__STATIC_INLINE void ARM_PMU_Set_CNTR_IRQ_Disable(uint32_t mask); + +__STATIC_INLINE void ARM_PMU_CNTR_Increment(uint32_t mask); + +/** + \brief Enable the PMU +*/ +__STATIC_INLINE void ARM_PMU_Enable(void) +{ + PMU->CTRL |= PMU_CTRL_ENABLE_Msk; +} + +/** + \brief Disable the PMU +*/ +__STATIC_INLINE void ARM_PMU_Disable(void) +{ + PMU->CTRL &= ~PMU_CTRL_ENABLE_Msk; +} + +/** + \brief Set event to count for PMU eventer counter + \param [in] num Event counter (0-30) to configure + \param [in] type Event to count +*/ +__STATIC_INLINE void ARM_PMU_Set_EVTYPER(uint32_t num, uint32_t type) +{ + PMU->EVTYPER[num] = type; +} + +/** + \brief Reset cycle counter +*/ +__STATIC_INLINE void ARM_PMU_CYCCNT_Reset(void) +{ + PMU->CTRL |= PMU_CTRL_CYCCNT_RESET_Msk; +} + +/** + \brief Reset all event counters +*/ +__STATIC_INLINE void ARM_PMU_EVCNTR_ALL_Reset(void) +{ + PMU->CTRL |= PMU_CTRL_EVENTCNT_RESET_Msk; +} + +/** + \brief Enable counters + \param [in] mask Counters to enable + \note Enables one or more of the following: + - event counters (0-30) + - cycle counter +*/ +__STATIC_INLINE void ARM_PMU_CNTR_Enable(uint32_t mask) +{ + PMU->CNTENSET = mask; +} + +/** + \brief Disable counters + \param [in] mask Counters to enable + \note Disables one or more of the following: + - event counters (0-30) + - cycle counter +*/ +__STATIC_INLINE void ARM_PMU_CNTR_Disable(uint32_t mask) +{ + PMU->CNTENCLR = mask; +} + +/** + \brief Read cycle counter + \return Cycle count +*/ +__STATIC_INLINE uint32_t ARM_PMU_Get_CCNTR(void) +{ + return PMU->CCNTR; +} + +/** + \brief Read event counter + \param [in] num Event counter (0-30) to read + \return Event count +*/ +__STATIC_INLINE uint32_t ARM_PMU_Get_EVCNTR(uint32_t num) +{ + return PMU_EVCNTR_CNT_Msk & PMU->EVCNTR[num]; +} + +/** + \brief Read counter overflow status + \return Counter overflow status bits for the following: + - event counters (0-30) + - cycle counter +*/ +__STATIC_INLINE uint32_t ARM_PMU_Get_CNTR_OVS(void) +{ + return PMU->OVSSET; +} + +/** + \brief Clear counter overflow status + \param [in] mask Counter overflow status bits to clear + \note Clears overflow status bits for one or more of the following: + - event counters (0-30) + - cycle counter +*/ +__STATIC_INLINE void ARM_PMU_Set_CNTR_OVS(uint32_t mask) +{ + PMU->OVSCLR = mask; +} + +/** + \brief Enable counter overflow interrupt request + \param [in] mask Counter overflow interrupt request bits to set + \note Sets overflow interrupt request bits for one or more of the following: + - event counters (0-30) + - cycle counter +*/ +__STATIC_INLINE void ARM_PMU_Set_CNTR_IRQ_Enable(uint32_t mask) +{ + PMU->INTENSET = mask; +} + +/** + \brief Disable counter overflow interrupt request + \param [in] mask Counter overflow interrupt request bits to clear + \note Clears overflow interrupt request bits for one or more of the following: + - event counters (0-30) + - cycle counter +*/ +__STATIC_INLINE void ARM_PMU_Set_CNTR_IRQ_Disable(uint32_t mask) +{ + PMU->INTENCLR = mask; +} + +/** + \brief Software increment event counter + \param [in] mask Counters to increment + \note Software increment bits for one or more event counters (0-30) +*/ +__STATIC_INLINE void ARM_PMU_CNTR_Increment(uint32_t mask) +{ + PMU->SWINC = mask; +} + +#endif diff --git a/Drivers/CMSIS/Include/tz_context.h b/Drivers/CMSIS/Include/tz_context.h new file mode 100644 index 0000000..0d09749 --- /dev/null +++ b/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/Drivers/CMSIS/LICENSE.txt b/Drivers/CMSIS/LICENSE.txt new file mode 100644 index 0000000..8dada3e --- /dev/null +++ b/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/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h b/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h new file mode 100644 index 0000000..c3b8473 --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h @@ -0,0 +1,4422 @@ +/** + ****************************************************************************** + * @file stm32_hal_legacy.h + * @author MCD Application Team + * @brief This file contains aliases definition for the STM32Cube HAL constants + * macros and functions maintained for legacy purpose. + ****************************************************************************** + * @attention + * + * Copyright (c) 2021 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32_HAL_LEGACY +#define STM32_HAL_LEGACY + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup HAL_AES_Aliased_Defines HAL CRYP Aliased Defines maintained for legacy purpose + * @{ + */ +#define AES_FLAG_RDERR CRYP_FLAG_RDERR +#define AES_FLAG_WRERR CRYP_FLAG_WRERR +#define AES_CLEARFLAG_CCF CRYP_CLEARFLAG_CCF +#define AES_CLEARFLAG_RDERR CRYP_CLEARFLAG_RDERR +#define AES_CLEARFLAG_WRERR CRYP_CLEARFLAG_WRERR +#if defined(STM32H7) || defined(STM32MP1) +#define CRYP_DATATYPE_32B CRYP_NO_SWAP +#define CRYP_DATATYPE_16B CRYP_HALFWORD_SWAP +#define CRYP_DATATYPE_8B CRYP_BYTE_SWAP +#define CRYP_DATATYPE_1B CRYP_BIT_SWAP +#endif /* STM32H7 || STM32MP1 */ +/** + * @} + */ + +/** @defgroup HAL_ADC_Aliased_Defines HAL ADC Aliased Defines maintained for legacy purpose + * @{ + */ +#define ADC_RESOLUTION12b ADC_RESOLUTION_12B +#define ADC_RESOLUTION10b ADC_RESOLUTION_10B +#define ADC_RESOLUTION8b ADC_RESOLUTION_8B +#define ADC_RESOLUTION6b ADC_RESOLUTION_6B +#define OVR_DATA_OVERWRITTEN ADC_OVR_DATA_OVERWRITTEN +#define OVR_DATA_PRESERVED ADC_OVR_DATA_PRESERVED +#define EOC_SINGLE_CONV ADC_EOC_SINGLE_CONV +#define EOC_SEQ_CONV ADC_EOC_SEQ_CONV +#define EOC_SINGLE_SEQ_CONV ADC_EOC_SINGLE_SEQ_CONV +#define REGULAR_GROUP ADC_REGULAR_GROUP +#define INJECTED_GROUP ADC_INJECTED_GROUP +#define REGULAR_INJECTED_GROUP ADC_REGULAR_INJECTED_GROUP +#define AWD_EVENT ADC_AWD_EVENT +#define AWD1_EVENT ADC_AWD1_EVENT +#define AWD2_EVENT ADC_AWD2_EVENT +#define AWD3_EVENT ADC_AWD3_EVENT +#define OVR_EVENT ADC_OVR_EVENT +#define JQOVF_EVENT ADC_JQOVF_EVENT +#define ALL_CHANNELS ADC_ALL_CHANNELS +#define REGULAR_CHANNELS ADC_REGULAR_CHANNELS +#define INJECTED_CHANNELS ADC_INJECTED_CHANNELS +#define SYSCFG_FLAG_SENSOR_ADC ADC_FLAG_SENSOR +#define SYSCFG_FLAG_VREF_ADC ADC_FLAG_VREFINT +#define ADC_CLOCKPRESCALER_PCLK_DIV1 ADC_CLOCK_SYNC_PCLK_DIV1 +#define ADC_CLOCKPRESCALER_PCLK_DIV2 ADC_CLOCK_SYNC_PCLK_DIV2 +#define ADC_CLOCKPRESCALER_PCLK_DIV4 ADC_CLOCK_SYNC_PCLK_DIV4 +#define ADC_CLOCKPRESCALER_PCLK_DIV6 ADC_CLOCK_SYNC_PCLK_DIV6 +#define ADC_CLOCKPRESCALER_PCLK_DIV8 ADC_CLOCK_SYNC_PCLK_DIV8 +#define ADC_EXTERNALTRIG0_T6_TRGO ADC_EXTERNALTRIGCONV_T6_TRGO +#define ADC_EXTERNALTRIG1_T21_CC2 ADC_EXTERNALTRIGCONV_T21_CC2 +#define ADC_EXTERNALTRIG2_T2_TRGO ADC_EXTERNALTRIGCONV_T2_TRGO +#define ADC_EXTERNALTRIG3_T2_CC4 ADC_EXTERNALTRIGCONV_T2_CC4 +#define ADC_EXTERNALTRIG4_T22_TRGO ADC_EXTERNALTRIGCONV_T22_TRGO +#define ADC_EXTERNALTRIG7_EXT_IT11 ADC_EXTERNALTRIGCONV_EXT_IT11 +#define ADC_CLOCK_ASYNC ADC_CLOCK_ASYNC_DIV1 +#define ADC_EXTERNALTRIG_EDGE_NONE ADC_EXTERNALTRIGCONVEDGE_NONE +#define ADC_EXTERNALTRIG_EDGE_RISING ADC_EXTERNALTRIGCONVEDGE_RISING +#define ADC_EXTERNALTRIG_EDGE_FALLING ADC_EXTERNALTRIGCONVEDGE_FALLING +#define ADC_EXTERNALTRIG_EDGE_RISINGFALLING ADC_EXTERNALTRIGCONVEDGE_RISINGFALLING +#define ADC_SAMPLETIME_2CYCLE_5 ADC_SAMPLETIME_2CYCLES_5 + +#define HAL_ADC_STATE_BUSY_REG HAL_ADC_STATE_REG_BUSY +#define HAL_ADC_STATE_BUSY_INJ HAL_ADC_STATE_INJ_BUSY +#define HAL_ADC_STATE_EOC_REG HAL_ADC_STATE_REG_EOC +#define HAL_ADC_STATE_EOC_INJ HAL_ADC_STATE_INJ_EOC +#define HAL_ADC_STATE_ERROR HAL_ADC_STATE_ERROR_INTERNAL +#define HAL_ADC_STATE_BUSY HAL_ADC_STATE_BUSY_INTERNAL +#define HAL_ADC_STATE_AWD HAL_ADC_STATE_AWD1 + +#if defined(STM32H7) +#define ADC_CHANNEL_VBAT_DIV4 ADC_CHANNEL_VBAT +#endif /* STM32H7 */ + +#if defined(STM32U5) +#define ADC_SAMPLETIME_5CYCLE ADC_SAMPLETIME_5CYCLES +#define ADC_SAMPLETIME_391CYCLES_5 ADC_SAMPLETIME_391CYCLES +#define ADC4_SAMPLETIME_160CYCLES_5 ADC4_SAMPLETIME_814CYCLES_5 +#endif /* STM32U5 */ + +#if defined(STM32H5) +#define ADC_CHANNEL_VCORE ADC_CHANNEL_VDDCORE +#endif /* STM32H5 */ +/** + * @} + */ + +/** @defgroup HAL_CEC_Aliased_Defines HAL CEC Aliased Defines maintained for legacy purpose + * @{ + */ + +#define __HAL_CEC_GET_IT __HAL_CEC_GET_FLAG + +/** + * @} + */ + +/** @defgroup HAL_COMP_Aliased_Defines HAL COMP Aliased Defines maintained for legacy purpose + * @{ + */ +#define COMP_WINDOWMODE_DISABLED COMP_WINDOWMODE_DISABLE +#define COMP_WINDOWMODE_ENABLED COMP_WINDOWMODE_ENABLE +#define COMP_EXTI_LINE_COMP1_EVENT COMP_EXTI_LINE_COMP1 +#define COMP_EXTI_LINE_COMP2_EVENT COMP_EXTI_LINE_COMP2 +#define COMP_EXTI_LINE_COMP3_EVENT COMP_EXTI_LINE_COMP3 +#define COMP_EXTI_LINE_COMP4_EVENT COMP_EXTI_LINE_COMP4 +#define COMP_EXTI_LINE_COMP5_EVENT COMP_EXTI_LINE_COMP5 +#define COMP_EXTI_LINE_COMP6_EVENT COMP_EXTI_LINE_COMP6 +#define COMP_EXTI_LINE_COMP7_EVENT COMP_EXTI_LINE_COMP7 +#if defined(STM32L0) +#define COMP_LPTIMCONNECTION_ENABLED ((uint32_t)0x00000003U) /*!< COMPX output generic naming: connected to LPTIM + input 1 for COMP1, LPTIM input 2 for COMP2 */ +#endif +#define COMP_OUTPUT_COMP6TIM2OCREFCLR COMP_OUTPUT_COMP6_TIM2OCREFCLR +#if defined(STM32F373xC) || defined(STM32F378xx) +#define COMP_OUTPUT_TIM3IC1 COMP_OUTPUT_COMP1_TIM3IC1 +#define COMP_OUTPUT_TIM3OCREFCLR COMP_OUTPUT_COMP1_TIM3OCREFCLR +#endif /* STM32F373xC || STM32F378xx */ + +#if defined(STM32L0) || defined(STM32L4) +#define COMP_WINDOWMODE_ENABLE COMP_WINDOWMODE_COMP1_INPUT_PLUS_COMMON + +#define COMP_NONINVERTINGINPUT_IO1 COMP_INPUT_PLUS_IO1 +#define COMP_NONINVERTINGINPUT_IO2 COMP_INPUT_PLUS_IO2 +#define COMP_NONINVERTINGINPUT_IO3 COMP_INPUT_PLUS_IO3 +#define COMP_NONINVERTINGINPUT_IO4 COMP_INPUT_PLUS_IO4 +#define COMP_NONINVERTINGINPUT_IO5 COMP_INPUT_PLUS_IO5 +#define COMP_NONINVERTINGINPUT_IO6 COMP_INPUT_PLUS_IO6 + +#define COMP_INVERTINGINPUT_1_4VREFINT COMP_INPUT_MINUS_1_4VREFINT +#define COMP_INVERTINGINPUT_1_2VREFINT COMP_INPUT_MINUS_1_2VREFINT +#define COMP_INVERTINGINPUT_3_4VREFINT COMP_INPUT_MINUS_3_4VREFINT +#define COMP_INVERTINGINPUT_VREFINT COMP_INPUT_MINUS_VREFINT +#define COMP_INVERTINGINPUT_DAC1_CH1 COMP_INPUT_MINUS_DAC1_CH1 +#define COMP_INVERTINGINPUT_DAC1_CH2 COMP_INPUT_MINUS_DAC1_CH2 +#define COMP_INVERTINGINPUT_DAC1 COMP_INPUT_MINUS_DAC1_CH1 +#define COMP_INVERTINGINPUT_DAC2 COMP_INPUT_MINUS_DAC1_CH2 +#define COMP_INVERTINGINPUT_IO1 COMP_INPUT_MINUS_IO1 +#if defined(STM32L0) +/* Issue fixed on STM32L0 COMP driver: only 2 dedicated IO (IO1 and IO2), */ +/* IO2 was wrongly assigned to IO shared with DAC and IO3 was corresponding */ +/* to the second dedicated IO (only for COMP2). */ +#define COMP_INVERTINGINPUT_IO2 COMP_INPUT_MINUS_DAC1_CH2 +#define COMP_INVERTINGINPUT_IO3 COMP_INPUT_MINUS_IO2 +#else +#define COMP_INVERTINGINPUT_IO2 COMP_INPUT_MINUS_IO2 +#define COMP_INVERTINGINPUT_IO3 COMP_INPUT_MINUS_IO3 +#endif +#define COMP_INVERTINGINPUT_IO4 COMP_INPUT_MINUS_IO4 +#define COMP_INVERTINGINPUT_IO5 COMP_INPUT_MINUS_IO5 + +#define COMP_OUTPUTLEVEL_LOW COMP_OUTPUT_LEVEL_LOW +#define COMP_OUTPUTLEVEL_HIGH COMP_OUTPUT_LEVEL_HIGH + +/* Note: Literal "COMP_FLAG_LOCK" kept for legacy purpose. */ +/* To check COMP lock state, use macro "__HAL_COMP_IS_LOCKED()". */ +#if defined(COMP_CSR_LOCK) +#define COMP_FLAG_LOCK COMP_CSR_LOCK +#elif defined(COMP_CSR_COMP1LOCK) +#define COMP_FLAG_LOCK COMP_CSR_COMP1LOCK +#elif defined(COMP_CSR_COMPxLOCK) +#define COMP_FLAG_LOCK COMP_CSR_COMPxLOCK +#endif + +#if defined(STM32L4) +#define COMP_BLANKINGSRCE_TIM1OC5 COMP_BLANKINGSRC_TIM1_OC5_COMP1 +#define COMP_BLANKINGSRCE_TIM2OC3 COMP_BLANKINGSRC_TIM2_OC3_COMP1 +#define COMP_BLANKINGSRCE_TIM3OC3 COMP_BLANKINGSRC_TIM3_OC3_COMP1 +#define COMP_BLANKINGSRCE_TIM3OC4 COMP_BLANKINGSRC_TIM3_OC4_COMP2 +#define COMP_BLANKINGSRCE_TIM8OC5 COMP_BLANKINGSRC_TIM8_OC5_COMP2 +#define COMP_BLANKINGSRCE_TIM15OC1 COMP_BLANKINGSRC_TIM15_OC1_COMP2 +#define COMP_BLANKINGSRCE_NONE COMP_BLANKINGSRC_NONE +#endif + +#if defined(STM32L0) +#define COMP_MODE_HIGHSPEED COMP_POWERMODE_MEDIUMSPEED +#define COMP_MODE_LOWSPEED COMP_POWERMODE_ULTRALOWPOWER +#else +#define COMP_MODE_HIGHSPEED COMP_POWERMODE_HIGHSPEED +#define COMP_MODE_MEDIUMSPEED COMP_POWERMODE_MEDIUMSPEED +#define COMP_MODE_LOWPOWER COMP_POWERMODE_LOWPOWER +#define COMP_MODE_ULTRALOWPOWER COMP_POWERMODE_ULTRALOWPOWER +#endif + +#endif + +#if defined(STM32U5) +#define __HAL_COMP_COMP1_EXTI_CLEAR_RASING_FLAG __HAL_COMP_COMP1_EXTI_CLEAR_RISING_FLAG +#endif + +/** + * @} + */ + +/** @defgroup HAL_CORTEX_Aliased_Defines HAL CORTEX Aliased Defines maintained for legacy purpose + * @{ + */ +#define __HAL_CORTEX_SYSTICKCLK_CONFIG HAL_SYSTICK_CLKSourceConfig +#if defined(STM32U5) +#define MPU_DEVICE_nGnRnE MPU_DEVICE_NGNRNE +#define MPU_DEVICE_nGnRE MPU_DEVICE_NGNRE +#define MPU_DEVICE_nGRE MPU_DEVICE_NGRE +#endif /* STM32U5 */ +/** + * @} + */ + +/** @defgroup CRC_Aliases CRC API aliases + * @{ + */ +#if defined(STM32H5) || defined(STM32C0) +#else +#define HAL_CRC_Input_Data_Reverse HAL_CRCEx_Input_Data_Reverse /*!< Aliased to HAL_CRCEx_Input_Data_Reverse for + inter STM32 series compatibility */ +#define HAL_CRC_Output_Data_Reverse HAL_CRCEx_Output_Data_Reverse /*!< Aliased to HAL_CRCEx_Output_Data_Reverse for + inter STM32 series compatibility */ +#endif +/** + * @} + */ + +/** @defgroup HAL_CRC_Aliased_Defines HAL CRC Aliased Defines maintained for legacy purpose + * @{ + */ + +#define CRC_OUTPUTDATA_INVERSION_DISABLED CRC_OUTPUTDATA_INVERSION_DISABLE +#define CRC_OUTPUTDATA_INVERSION_ENABLED CRC_OUTPUTDATA_INVERSION_ENABLE + +/** + * @} + */ + +/** @defgroup HAL_DAC_Aliased_Defines HAL DAC Aliased Defines maintained for legacy purpose + * @{ + */ + +#define DAC1_CHANNEL_1 DAC_CHANNEL_1 +#define DAC1_CHANNEL_2 DAC_CHANNEL_2 +#define DAC2_CHANNEL_1 DAC_CHANNEL_1 +#define DAC_WAVE_NONE 0x00000000U +#define DAC_WAVE_NOISE DAC_CR_WAVE1_0 +#define DAC_WAVE_TRIANGLE DAC_CR_WAVE1_1 +#define DAC_WAVEGENERATION_NONE DAC_WAVE_NONE +#define DAC_WAVEGENERATION_NOISE DAC_WAVE_NOISE +#define DAC_WAVEGENERATION_TRIANGLE DAC_WAVE_TRIANGLE + +#if defined(STM32G4) || defined(STM32H7) || defined (STM32U5) +#define DAC_CHIPCONNECT_DISABLE DAC_CHIPCONNECT_EXTERNAL +#define DAC_CHIPCONNECT_ENABLE DAC_CHIPCONNECT_INTERNAL +#endif + +#if defined(STM32U5) +#define DAC_TRIGGER_STOP_LPTIM1_OUT DAC_TRIGGER_STOP_LPTIM1_CH1 +#define DAC_TRIGGER_STOP_LPTIM3_OUT DAC_TRIGGER_STOP_LPTIM3_CH1 +#define DAC_TRIGGER_LPTIM1_OUT DAC_TRIGGER_LPTIM1_CH1 +#define DAC_TRIGGER_LPTIM3_OUT DAC_TRIGGER_LPTIM3_CH1 +#endif + +#if defined(STM32H5) +#define DAC_TRIGGER_LPTIM1_OUT DAC_TRIGGER_LPTIM1_CH1 +#define DAC_TRIGGER_LPTIM2_OUT DAC_TRIGGER_LPTIM2_CH1 +#endif + +#if defined(STM32L1) || defined(STM32L4) || defined(STM32G0) || defined(STM32L5) || defined(STM32H7) || \ + defined(STM32F4) || defined(STM32G4) +#define HAL_DAC_MSP_INIT_CB_ID HAL_DAC_MSPINIT_CB_ID +#define HAL_DAC_MSP_DEINIT_CB_ID HAL_DAC_MSPDEINIT_CB_ID +#endif + +/** + * @} + */ + +/** @defgroup HAL_DMA_Aliased_Defines HAL DMA Aliased Defines maintained for legacy purpose + * @{ + */ +#define HAL_REMAPDMA_ADC_DMA_CH2 DMA_REMAP_ADC_DMA_CH2 +#define HAL_REMAPDMA_USART1_TX_DMA_CH4 DMA_REMAP_USART1_TX_DMA_CH4 +#define HAL_REMAPDMA_USART1_RX_DMA_CH5 DMA_REMAP_USART1_RX_DMA_CH5 +#define HAL_REMAPDMA_TIM16_DMA_CH4 DMA_REMAP_TIM16_DMA_CH4 +#define HAL_REMAPDMA_TIM17_DMA_CH2 DMA_REMAP_TIM17_DMA_CH2 +#define HAL_REMAPDMA_USART3_DMA_CH32 DMA_REMAP_USART3_DMA_CH32 +#define HAL_REMAPDMA_TIM16_DMA_CH6 DMA_REMAP_TIM16_DMA_CH6 +#define HAL_REMAPDMA_TIM17_DMA_CH7 DMA_REMAP_TIM17_DMA_CH7 +#define HAL_REMAPDMA_SPI2_DMA_CH67 DMA_REMAP_SPI2_DMA_CH67 +#define HAL_REMAPDMA_USART2_DMA_CH67 DMA_REMAP_USART2_DMA_CH67 +#define HAL_REMAPDMA_I2C1_DMA_CH76 DMA_REMAP_I2C1_DMA_CH76 +#define HAL_REMAPDMA_TIM1_DMA_CH6 DMA_REMAP_TIM1_DMA_CH6 +#define HAL_REMAPDMA_TIM2_DMA_CH7 DMA_REMAP_TIM2_DMA_CH7 +#define HAL_REMAPDMA_TIM3_DMA_CH6 DMA_REMAP_TIM3_DMA_CH6 + +#define IS_HAL_REMAPDMA IS_DMA_REMAP +#define __HAL_REMAPDMA_CHANNEL_ENABLE __HAL_DMA_REMAP_CHANNEL_ENABLE +#define __HAL_REMAPDMA_CHANNEL_DISABLE __HAL_DMA_REMAP_CHANNEL_DISABLE + +#if defined(STM32L4) + +#define HAL_DMAMUX1_REQUEST_GEN_EXTI0 HAL_DMAMUX1_REQ_GEN_EXTI0 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI1 HAL_DMAMUX1_REQ_GEN_EXTI1 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI2 HAL_DMAMUX1_REQ_GEN_EXTI2 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI3 HAL_DMAMUX1_REQ_GEN_EXTI3 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI4 HAL_DMAMUX1_REQ_GEN_EXTI4 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI5 HAL_DMAMUX1_REQ_GEN_EXTI5 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI6 HAL_DMAMUX1_REQ_GEN_EXTI6 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI7 HAL_DMAMUX1_REQ_GEN_EXTI7 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI8 HAL_DMAMUX1_REQ_GEN_EXTI8 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI9 HAL_DMAMUX1_REQ_GEN_EXTI9 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI10 HAL_DMAMUX1_REQ_GEN_EXTI10 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI11 HAL_DMAMUX1_REQ_GEN_EXTI11 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI12 HAL_DMAMUX1_REQ_GEN_EXTI12 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI13 HAL_DMAMUX1_REQ_GEN_EXTI13 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI14 HAL_DMAMUX1_REQ_GEN_EXTI14 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI15 HAL_DMAMUX1_REQ_GEN_EXTI15 +#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH0_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH0_EVT +#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH1_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH1_EVT +#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH2_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH2_EVT +#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH3_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH3_EVT +#define HAL_DMAMUX1_REQUEST_GEN_LPTIM1_OUT HAL_DMAMUX1_REQ_GEN_LPTIM1_OUT +#define HAL_DMAMUX1_REQUEST_GEN_LPTIM2_OUT HAL_DMAMUX1_REQ_GEN_LPTIM2_OUT +#define HAL_DMAMUX1_REQUEST_GEN_DSI_TE HAL_DMAMUX1_REQ_GEN_DSI_TE +#define HAL_DMAMUX1_REQUEST_GEN_DSI_EOT HAL_DMAMUX1_REQ_GEN_DSI_EOT +#define HAL_DMAMUX1_REQUEST_GEN_DMA2D_EOT HAL_DMAMUX1_REQ_GEN_DMA2D_EOT +#define HAL_DMAMUX1_REQUEST_GEN_LTDC_IT HAL_DMAMUX1_REQ_GEN_LTDC_IT + +#define HAL_DMAMUX_REQUEST_GEN_NO_EVENT HAL_DMAMUX_REQ_GEN_NO_EVENT +#define HAL_DMAMUX_REQUEST_GEN_RISING HAL_DMAMUX_REQ_GEN_RISING +#define HAL_DMAMUX_REQUEST_GEN_FALLING HAL_DMAMUX_REQ_GEN_FALLING +#define HAL_DMAMUX_REQUEST_GEN_RISING_FALLING HAL_DMAMUX_REQ_GEN_RISING_FALLING + +#if defined(STM32L4R5xx) || defined(STM32L4R9xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || \ + defined(STM32L4S7xx) || defined(STM32L4S9xx) +#define DMA_REQUEST_DCMI_PSSI DMA_REQUEST_DCMI +#endif + +#endif /* STM32L4 */ + +#if defined(STM32G0) +#define DMA_REQUEST_DAC1_CHANNEL1 DMA_REQUEST_DAC1_CH1 +#define DMA_REQUEST_DAC1_CHANNEL2 DMA_REQUEST_DAC1_CH2 +#define DMA_REQUEST_TIM16_TRIG_COM DMA_REQUEST_TIM16_COM +#define DMA_REQUEST_TIM17_TRIG_COM DMA_REQUEST_TIM17_COM + +#define LL_DMAMUX_REQ_TIM16_TRIG_COM LL_DMAMUX_REQ_TIM16_COM +#define LL_DMAMUX_REQ_TIM17_TRIG_COM LL_DMAMUX_REQ_TIM17_COM +#endif + +#if defined(STM32H7) + +#define DMA_REQUEST_DAC1 DMA_REQUEST_DAC1_CH1 +#define DMA_REQUEST_DAC2 DMA_REQUEST_DAC1_CH2 + +#define BDMA_REQUEST_LP_UART1_RX BDMA_REQUEST_LPUART1_RX +#define BDMA_REQUEST_LP_UART1_TX BDMA_REQUEST_LPUART1_TX + +#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH0_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH0_EVT +#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH1_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH1_EVT +#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH2_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH2_EVT +#define HAL_DMAMUX1_REQUEST_GEN_LPTIM1_OUT HAL_DMAMUX1_REQ_GEN_LPTIM1_OUT +#define HAL_DMAMUX1_REQUEST_GEN_LPTIM2_OUT HAL_DMAMUX1_REQ_GEN_LPTIM2_OUT +#define HAL_DMAMUX1_REQUEST_GEN_LPTIM3_OUT HAL_DMAMUX1_REQ_GEN_LPTIM3_OUT +#define HAL_DMAMUX1_REQUEST_GEN_EXTI0 HAL_DMAMUX1_REQ_GEN_EXTI0 +#define HAL_DMAMUX1_REQUEST_GEN_TIM12_TRGO HAL_DMAMUX1_REQ_GEN_TIM12_TRGO + +#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH0_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH0_EVT +#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH1_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH1_EVT +#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH2_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH2_EVT +#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH3_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH3_EVT +#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH4_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH4_EVT +#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH5_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH5_EVT +#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH6_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH6_EVT +#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_RX_WKUP HAL_DMAMUX2_REQ_GEN_LPUART1_RX_WKUP +#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_TX_WKUP HAL_DMAMUX2_REQ_GEN_LPUART1_TX_WKUP +#define HAL_DMAMUX2_REQUEST_GEN_LPTIM2_WKUP HAL_DMAMUX2_REQ_GEN_LPTIM2_WKUP +#define HAL_DMAMUX2_REQUEST_GEN_LPTIM2_OUT HAL_DMAMUX2_REQ_GEN_LPTIM2_OUT +#define HAL_DMAMUX2_REQUEST_GEN_LPTIM3_WKUP HAL_DMAMUX2_REQ_GEN_LPTIM3_WKUP +#define HAL_DMAMUX2_REQUEST_GEN_LPTIM3_OUT HAL_DMAMUX2_REQ_GEN_LPTIM3_OUT +#define HAL_DMAMUX2_REQUEST_GEN_LPTIM4_WKUP HAL_DMAMUX2_REQ_GEN_LPTIM4_WKUP +#define HAL_DMAMUX2_REQUEST_GEN_LPTIM5_WKUP HAL_DMAMUX2_REQ_GEN_LPTIM5_WKUP +#define HAL_DMAMUX2_REQUEST_GEN_I2C4_WKUP HAL_DMAMUX2_REQ_GEN_I2C4_WKUP +#define HAL_DMAMUX2_REQUEST_GEN_SPI6_WKUP HAL_DMAMUX2_REQ_GEN_SPI6_WKUP +#define HAL_DMAMUX2_REQUEST_GEN_COMP1_OUT HAL_DMAMUX2_REQ_GEN_COMP1_OUT +#define HAL_DMAMUX2_REQUEST_GEN_COMP2_OUT HAL_DMAMUX2_REQ_GEN_COMP2_OUT +#define HAL_DMAMUX2_REQUEST_GEN_RTC_WKUP HAL_DMAMUX2_REQ_GEN_RTC_WKUP +#define HAL_DMAMUX2_REQUEST_GEN_EXTI0 HAL_DMAMUX2_REQ_GEN_EXTI0 +#define HAL_DMAMUX2_REQUEST_GEN_EXTI2 HAL_DMAMUX2_REQ_GEN_EXTI2 +#define HAL_DMAMUX2_REQUEST_GEN_I2C4_IT_EVT HAL_DMAMUX2_REQ_GEN_I2C4_IT_EVT +#define HAL_DMAMUX2_REQUEST_GEN_SPI6_IT HAL_DMAMUX2_REQ_GEN_SPI6_IT +#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_TX_IT HAL_DMAMUX2_REQ_GEN_LPUART1_TX_IT +#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_RX_IT HAL_DMAMUX2_REQ_GEN_LPUART1_RX_IT +#define HAL_DMAMUX2_REQUEST_GEN_ADC3_IT HAL_DMAMUX2_REQ_GEN_ADC3_IT +#define HAL_DMAMUX2_REQUEST_GEN_ADC3_AWD1_OUT HAL_DMAMUX2_REQ_GEN_ADC3_AWD1_OUT +#define HAL_DMAMUX2_REQUEST_GEN_BDMA_CH0_IT HAL_DMAMUX2_REQ_GEN_BDMA_CH0_IT +#define HAL_DMAMUX2_REQUEST_GEN_BDMA_CH1_IT HAL_DMAMUX2_REQ_GEN_BDMA_CH1_IT + +#define HAL_DMAMUX_REQUEST_GEN_NO_EVENT HAL_DMAMUX_REQ_GEN_NO_EVENT +#define HAL_DMAMUX_REQUEST_GEN_RISING HAL_DMAMUX_REQ_GEN_RISING +#define HAL_DMAMUX_REQUEST_GEN_FALLING HAL_DMAMUX_REQ_GEN_FALLING +#define HAL_DMAMUX_REQUEST_GEN_RISING_FALLING HAL_DMAMUX_REQ_GEN_RISING_FALLING + +#define DFSDM_FILTER_EXT_TRIG_LPTIM1 DFSDM_FILTER_EXT_TRIG_LPTIM1_OUT +#define DFSDM_FILTER_EXT_TRIG_LPTIM2 DFSDM_FILTER_EXT_TRIG_LPTIM2_OUT +#define DFSDM_FILTER_EXT_TRIG_LPTIM3 DFSDM_FILTER_EXT_TRIG_LPTIM3_OUT + +#define DAC_TRIGGER_LP1_OUT DAC_TRIGGER_LPTIM1_OUT +#define DAC_TRIGGER_LP2_OUT DAC_TRIGGER_LPTIM2_OUT + +#endif /* STM32H7 */ + +#if defined(STM32U5) +#define GPDMA1_REQUEST_DCMI GPDMA1_REQUEST_DCMI_PSSI +#endif /* STM32U5 */ +/** + * @} + */ + +/** @defgroup HAL_FLASH_Aliased_Defines HAL FLASH Aliased Defines maintained for legacy purpose + * @{ + */ + +#define TYPEPROGRAM_BYTE FLASH_TYPEPROGRAM_BYTE +#define TYPEPROGRAM_HALFWORD FLASH_TYPEPROGRAM_HALFWORD +#define TYPEPROGRAM_WORD FLASH_TYPEPROGRAM_WORD +#define TYPEPROGRAM_DOUBLEWORD FLASH_TYPEPROGRAM_DOUBLEWORD +#define TYPEERASE_SECTORS FLASH_TYPEERASE_SECTORS +#define TYPEERASE_PAGES FLASH_TYPEERASE_PAGES +#define TYPEERASE_PAGEERASE FLASH_TYPEERASE_PAGES +#define TYPEERASE_MASSERASE FLASH_TYPEERASE_MASSERASE +#define WRPSTATE_DISABLE OB_WRPSTATE_DISABLE +#define WRPSTATE_ENABLE OB_WRPSTATE_ENABLE +#define HAL_FLASH_TIMEOUT_VALUE FLASH_TIMEOUT_VALUE +#define OBEX_PCROP OPTIONBYTE_PCROP +#define OBEX_BOOTCONFIG OPTIONBYTE_BOOTCONFIG +#define PCROPSTATE_DISABLE OB_PCROP_STATE_DISABLE +#define PCROPSTATE_ENABLE OB_PCROP_STATE_ENABLE +#define TYPEERASEDATA_BYTE FLASH_TYPEERASEDATA_BYTE +#define TYPEERASEDATA_HALFWORD FLASH_TYPEERASEDATA_HALFWORD +#define TYPEERASEDATA_WORD FLASH_TYPEERASEDATA_WORD +#define TYPEPROGRAMDATA_BYTE FLASH_TYPEPROGRAMDATA_BYTE +#define TYPEPROGRAMDATA_HALFWORD FLASH_TYPEPROGRAMDATA_HALFWORD +#define TYPEPROGRAMDATA_WORD FLASH_TYPEPROGRAMDATA_WORD +#define TYPEPROGRAMDATA_FASTBYTE FLASH_TYPEPROGRAMDATA_FASTBYTE +#define TYPEPROGRAMDATA_FASTHALFWORD FLASH_TYPEPROGRAMDATA_FASTHALFWORD +#define TYPEPROGRAMDATA_FASTWORD FLASH_TYPEPROGRAMDATA_FASTWORD +#if !defined(STM32F2) && !defined(STM32F4) && !defined(STM32F7) && !defined(STM32H7) && !defined(STM32H5) +#define PAGESIZE FLASH_PAGE_SIZE +#endif /* STM32F2 && STM32F4 && STM32F7 && STM32H7 && STM32H5 */ +#define TYPEPROGRAM_FASTBYTE FLASH_TYPEPROGRAM_BYTE +#define TYPEPROGRAM_FASTHALFWORD FLASH_TYPEPROGRAM_HALFWORD +#define TYPEPROGRAM_FASTWORD FLASH_TYPEPROGRAM_WORD +#define VOLTAGE_RANGE_1 FLASH_VOLTAGE_RANGE_1 +#define VOLTAGE_RANGE_2 FLASH_VOLTAGE_RANGE_2 +#define VOLTAGE_RANGE_3 FLASH_VOLTAGE_RANGE_3 +#define VOLTAGE_RANGE_4 FLASH_VOLTAGE_RANGE_4 +#define TYPEPROGRAM_FAST FLASH_TYPEPROGRAM_FAST +#define TYPEPROGRAM_FAST_AND_LAST FLASH_TYPEPROGRAM_FAST_AND_LAST +#define WRPAREA_BANK1_AREAA OB_WRPAREA_BANK1_AREAA +#define WRPAREA_BANK1_AREAB OB_WRPAREA_BANK1_AREAB +#define WRPAREA_BANK2_AREAA OB_WRPAREA_BANK2_AREAA +#define WRPAREA_BANK2_AREAB OB_WRPAREA_BANK2_AREAB +#define IWDG_STDBY_FREEZE OB_IWDG_STDBY_FREEZE +#define IWDG_STDBY_ACTIVE OB_IWDG_STDBY_RUN +#define IWDG_STOP_FREEZE OB_IWDG_STOP_FREEZE +#define IWDG_STOP_ACTIVE OB_IWDG_STOP_RUN +#define FLASH_ERROR_NONE HAL_FLASH_ERROR_NONE +#define FLASH_ERROR_RD HAL_FLASH_ERROR_RD +#define FLASH_ERROR_PG HAL_FLASH_ERROR_PROG +#define FLASH_ERROR_PGP HAL_FLASH_ERROR_PGS +#define FLASH_ERROR_WRP HAL_FLASH_ERROR_WRP +#define FLASH_ERROR_OPTV HAL_FLASH_ERROR_OPTV +#define FLASH_ERROR_OPTVUSR HAL_FLASH_ERROR_OPTVUSR +#define FLASH_ERROR_PROG HAL_FLASH_ERROR_PROG +#define FLASH_ERROR_OP HAL_FLASH_ERROR_OPERATION +#define FLASH_ERROR_PGA HAL_FLASH_ERROR_PGA +#define FLASH_ERROR_SIZE HAL_FLASH_ERROR_SIZE +#define FLASH_ERROR_SIZ HAL_FLASH_ERROR_SIZE +#define FLASH_ERROR_PGS HAL_FLASH_ERROR_PGS +#define FLASH_ERROR_MIS HAL_FLASH_ERROR_MIS +#define FLASH_ERROR_FAST HAL_FLASH_ERROR_FAST +#define FLASH_ERROR_FWWERR HAL_FLASH_ERROR_FWWERR +#define FLASH_ERROR_NOTZERO HAL_FLASH_ERROR_NOTZERO +#define FLASH_ERROR_OPERATION HAL_FLASH_ERROR_OPERATION +#define FLASH_ERROR_ERS HAL_FLASH_ERROR_ERS +#define OB_WDG_SW OB_IWDG_SW +#define OB_WDG_HW OB_IWDG_HW +#define OB_SDADC12_VDD_MONITOR_SET OB_SDACD_VDD_MONITOR_SET +#define OB_SDADC12_VDD_MONITOR_RESET OB_SDACD_VDD_MONITOR_RESET +#define OB_RAM_PARITY_CHECK_SET OB_SRAM_PARITY_SET +#define OB_RAM_PARITY_CHECK_RESET OB_SRAM_PARITY_RESET +#define IS_OB_SDADC12_VDD_MONITOR IS_OB_SDACD_VDD_MONITOR +#define OB_RDP_LEVEL0 OB_RDP_LEVEL_0 +#define OB_RDP_LEVEL1 OB_RDP_LEVEL_1 +#define OB_RDP_LEVEL2 OB_RDP_LEVEL_2 +#if defined(STM32G0) || defined(STM32C0) +#define OB_BOOT_LOCK_DISABLE OB_BOOT_ENTRY_FORCED_NONE +#define OB_BOOT_LOCK_ENABLE OB_BOOT_ENTRY_FORCED_FLASH +#else +#define OB_BOOT_ENTRY_FORCED_NONE OB_BOOT_LOCK_DISABLE +#define OB_BOOT_ENTRY_FORCED_FLASH OB_BOOT_LOCK_ENABLE +#endif +#if defined(STM32H7) +#define FLASH_FLAG_SNECCE_BANK1RR FLASH_FLAG_SNECCERR_BANK1 +#define FLASH_FLAG_DBECCE_BANK1RR FLASH_FLAG_DBECCERR_BANK1 +#define FLASH_FLAG_STRBER_BANK1R FLASH_FLAG_STRBERR_BANK1 +#define FLASH_FLAG_SNECCE_BANK2RR FLASH_FLAG_SNECCERR_BANK2 +#define FLASH_FLAG_DBECCE_BANK2RR FLASH_FLAG_DBECCERR_BANK2 +#define FLASH_FLAG_STRBER_BANK2R FLASH_FLAG_STRBERR_BANK2 +#define FLASH_FLAG_WDW FLASH_FLAG_WBNE +#define OB_WRP_SECTOR_All OB_WRP_SECTOR_ALL +#endif /* STM32H7 */ +#if defined(STM32H7RS) +#define FLASH_OPTKEY1 FLASH_OPT_KEY1 +#define FLASH_OPTKEY2 FLASH_OPT_KEY2 +#endif /* STM32H7RS */ +#if defined(STM32U5) +#define OB_USER_nRST_STOP OB_USER_NRST_STOP +#define OB_USER_nRST_STDBY OB_USER_NRST_STDBY +#define OB_USER_nRST_SHDW OB_USER_NRST_SHDW +#define OB_USER_nSWBOOT0 OB_USER_NSWBOOT0 +#define OB_USER_nBOOT0 OB_USER_NBOOT0 +#define OB_nBOOT0_RESET OB_NBOOT0_RESET +#define OB_nBOOT0_SET OB_NBOOT0_SET +#define OB_USER_SRAM134_RST OB_USER_SRAM_RST +#define OB_SRAM134_RST_ERASE OB_SRAM_RST_ERASE +#define OB_SRAM134_RST_NOT_ERASE OB_SRAM_RST_NOT_ERASE +#endif /* STM32U5 */ +#if defined(STM32U0) +#define OB_USER_nRST_STOP OB_USER_NRST_STOP +#define OB_USER_nRST_STDBY OB_USER_NRST_STDBY +#define OB_USER_nRST_SHDW OB_USER_NRST_SHDW +#define OB_USER_nBOOT_SEL OB_USER_NBOOT_SEL +#define OB_USER_nBOOT0 OB_USER_NBOOT0 +#define OB_USER_nBOOT1 OB_USER_NBOOT1 +#define OB_nBOOT0_RESET OB_NBOOT0_RESET +#define OB_nBOOT0_SET OB_NBOOT0_SET +#endif /* STM32U0 */ + +/** + * @} + */ + +/** @defgroup HAL_JPEG_Aliased_Macros HAL JPEG Aliased Macros maintained for legacy purpose + * @{ + */ + +#if defined(STM32H7) +#define __HAL_RCC_JPEG_CLK_ENABLE __HAL_RCC_JPGDECEN_CLK_ENABLE +#define __HAL_RCC_JPEG_CLK_DISABLE __HAL_RCC_JPGDECEN_CLK_DISABLE +#define __HAL_RCC_JPEG_FORCE_RESET __HAL_RCC_JPGDECRST_FORCE_RESET +#define __HAL_RCC_JPEG_RELEASE_RESET __HAL_RCC_JPGDECRST_RELEASE_RESET +#define __HAL_RCC_JPEG_CLK_SLEEP_ENABLE __HAL_RCC_JPGDEC_CLK_SLEEP_ENABLE +#define __HAL_RCC_JPEG_CLK_SLEEP_DISABLE __HAL_RCC_JPGDEC_CLK_SLEEP_DISABLE +#endif /* STM32H7 */ + +/** + * @} + */ + +/** @defgroup HAL_SYSCFG_Aliased_Defines HAL SYSCFG Aliased Defines maintained for legacy purpose + * @{ + */ + +#define HAL_SYSCFG_FASTMODEPLUS_I2C_PA9 I2C_FASTMODEPLUS_PA9 +#define HAL_SYSCFG_FASTMODEPLUS_I2C_PA10 I2C_FASTMODEPLUS_PA10 +#define HAL_SYSCFG_FASTMODEPLUS_I2C_PB6 I2C_FASTMODEPLUS_PB6 +#define HAL_SYSCFG_FASTMODEPLUS_I2C_PB7 I2C_FASTMODEPLUS_PB7 +#define HAL_SYSCFG_FASTMODEPLUS_I2C_PB8 I2C_FASTMODEPLUS_PB8 +#define HAL_SYSCFG_FASTMODEPLUS_I2C_PB9 I2C_FASTMODEPLUS_PB9 +#define HAL_SYSCFG_FASTMODEPLUS_I2C1 I2C_FASTMODEPLUS_I2C1 +#define HAL_SYSCFG_FASTMODEPLUS_I2C2 I2C_FASTMODEPLUS_I2C2 +#define HAL_SYSCFG_FASTMODEPLUS_I2C3 I2C_FASTMODEPLUS_I2C3 +#if defined(STM32G4) + +#define HAL_SYSCFG_EnableIOAnalogSwitchBooster HAL_SYSCFG_EnableIOSwitchBooster +#define HAL_SYSCFG_DisableIOAnalogSwitchBooster HAL_SYSCFG_DisableIOSwitchBooster +#define HAL_SYSCFG_EnableIOAnalogSwitchVDD HAL_SYSCFG_EnableIOSwitchVDD +#define HAL_SYSCFG_DisableIOAnalogSwitchVDD HAL_SYSCFG_DisableIOSwitchVDD +#endif /* STM32G4 */ + +#if defined(STM32U5) + +#define HAL_SYSCFG_EnableIOAnalogSwitchBooster HAL_SYSCFG_EnableIOAnalogBooster +#define HAL_SYSCFG_DisableIOAnalogSwitchBooster HAL_SYSCFG_DisableIOAnalogBooster +#define HAL_SYSCFG_EnableIOAnalogSwitchVoltageSelection HAL_SYSCFG_EnableIOAnalogVoltageSelection +#define HAL_SYSCFG_DisableIOAnalogSwitchVoltageSelection HAL_SYSCFG_DisableIOAnalogVoltageSelection + +#endif /* STM32U5 */ + +#if defined(STM32H5) +#define SYSCFG_IT_FPU_IOC SBS_IT_FPU_IOC +#define SYSCFG_IT_FPU_DZC SBS_IT_FPU_DZC +#define SYSCFG_IT_FPU_UFC SBS_IT_FPU_UFC +#define SYSCFG_IT_FPU_OFC SBS_IT_FPU_OFC +#define SYSCFG_IT_FPU_IDC SBS_IT_FPU_IDC +#define SYSCFG_IT_FPU_IXC SBS_IT_FPU_IXC + +#define SYSCFG_BREAK_FLASH_ECC SBS_BREAK_FLASH_ECC +#define SYSCFG_BREAK_PVD SBS_BREAK_PVD +#define SYSCFG_BREAK_SRAM_ECC SBS_BREAK_SRAM_ECC +#define SYSCFG_BREAK_LOCKUP SBS_BREAK_LOCKUP + +#define SYSCFG_VREFBUF_VOLTAGE_SCALE0 VREFBUF_VOLTAGE_SCALE0 +#define SYSCFG_VREFBUF_VOLTAGE_SCALE1 VREFBUF_VOLTAGE_SCALE1 +#define SYSCFG_VREFBUF_VOLTAGE_SCALE2 VREFBUF_VOLTAGE_SCALE2 +#define SYSCFG_VREFBUF_VOLTAGE_SCALE3 VREFBUF_VOLTAGE_SCALE3 + +#define SYSCFG_VREFBUF_HIGH_IMPEDANCE_DISABLE VREFBUF_HIGH_IMPEDANCE_DISABLE +#define SYSCFG_VREFBUF_HIGH_IMPEDANCE_ENABLE VREFBUF_HIGH_IMPEDANCE_ENABLE + +#define SYSCFG_FASTMODEPLUS_PB6 SBS_FASTMODEPLUS_PB6 +#define SYSCFG_FASTMODEPLUS_PB7 SBS_FASTMODEPLUS_PB7 +#define SYSCFG_FASTMODEPLUS_PB8 SBS_FASTMODEPLUS_PB8 +#define SYSCFG_FASTMODEPLUS_PB9 SBS_FASTMODEPLUS_PB9 + +#define SYSCFG_ETH_MII SBS_ETH_MII +#define SYSCFG_ETH_RMII SBS_ETH_RMII +#define IS_SYSCFG_ETHERNET_CONFIG IS_SBS_ETHERNET_CONFIG + +#define SYSCFG_MEMORIES_ERASE_FLAG_IPMEE SBS_MEMORIES_ERASE_FLAG_IPMEE +#define SYSCFG_MEMORIES_ERASE_FLAG_MCLR SBS_MEMORIES_ERASE_FLAG_MCLR +#define IS_SYSCFG_MEMORIES_ERASE_FLAG IS_SBS_MEMORIES_ERASE_FLAG + +#define IS_SYSCFG_CODE_CONFIG IS_SBS_CODE_CONFIG + +#define SYSCFG_MPU_NSEC SBS_MPU_NSEC +#define SYSCFG_VTOR_NSEC SBS_VTOR_NSEC +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +#define SYSCFG_SAU SBS_SAU +#define SYSCFG_MPU_SEC SBS_MPU_SEC +#define SYSCFG_VTOR_AIRCR_SEC SBS_VTOR_AIRCR_SEC +#define SYSCFG_LOCK_ALL SBS_LOCK_ALL +#else +#define SYSCFG_LOCK_ALL SBS_LOCK_ALL +#endif /* __ARM_FEATURE_CMSE */ + +#define SYSCFG_CLK SBS_CLK +#define SYSCFG_CLASSB SBS_CLASSB +#define SYSCFG_FPU SBS_FPU +#define SYSCFG_ALL SBS_ALL + +#define SYSCFG_SEC SBS_SEC +#define SYSCFG_NSEC SBS_NSEC + +#define __HAL_SYSCFG_FPU_INTERRUPT_ENABLE __HAL_SBS_FPU_INTERRUPT_ENABLE +#define __HAL_SYSCFG_FPU_INTERRUPT_DISABLE __HAL_SBS_FPU_INTERRUPT_DISABLE + +#define __HAL_SYSCFG_BREAK_ECC_LOCK __HAL_SBS_BREAK_ECC_LOCK +#define __HAL_SYSCFG_BREAK_LOCKUP_LOCK __HAL_SBS_BREAK_LOCKUP_LOCK +#define __HAL_SYSCFG_BREAK_PVD_LOCK __HAL_SBS_BREAK_PVD_LOCK +#define __HAL_SYSCFG_BREAK_SRAM_ECC_LOCK __HAL_SBS_BREAK_SRAM_ECC_LOCK + +#define __HAL_SYSCFG_FASTMODEPLUS_ENABLE __HAL_SBS_FASTMODEPLUS_ENABLE +#define __HAL_SYSCFG_FASTMODEPLUS_DISABLE __HAL_SBS_FASTMODEPLUS_DISABLE + +#define __HAL_SYSCFG_GET_MEMORIES_ERASE_STATUS __HAL_SBS_GET_MEMORIES_ERASE_STATUS +#define __HAL_SYSCFG_CLEAR_MEMORIES_ERASE_STATUS __HAL_SBS_CLEAR_MEMORIES_ERASE_STATUS + +#define IS_SYSCFG_FPU_INTERRUPT IS_SBS_FPU_INTERRUPT +#define IS_SYSCFG_BREAK_CONFIG IS_SBS_BREAK_CONFIG +#define IS_SYSCFG_VREFBUF_VOLTAGE_SCALE IS_VREFBUF_VOLTAGE_SCALE +#define IS_SYSCFG_VREFBUF_HIGH_IMPEDANCE IS_VREFBUF_HIGH_IMPEDANCE +#define IS_SYSCFG_VREFBUF_TRIMMING IS_VREFBUF_TRIMMING +#define IS_SYSCFG_FASTMODEPLUS IS_SBS_FASTMODEPLUS +#define IS_SYSCFG_ITEMS_ATTRIBUTES IS_SBS_ITEMS_ATTRIBUTES +#define IS_SYSCFG_ATTRIBUTES IS_SBS_ATTRIBUTES +#define IS_SYSCFG_LOCK_ITEMS IS_SBS_LOCK_ITEMS + +#define HAL_SYSCFG_VREFBUF_VoltageScalingConfig HAL_VREFBUF_VoltageScalingConfig +#define HAL_SYSCFG_VREFBUF_HighImpedanceConfig HAL_VREFBUF_HighImpedanceConfig +#define HAL_SYSCFG_VREFBUF_TrimmingConfig HAL_VREFBUF_TrimmingConfig +#define HAL_SYSCFG_EnableVREFBUF HAL_EnableVREFBUF +#define HAL_SYSCFG_DisableVREFBUF HAL_DisableVREFBUF + +#define HAL_SYSCFG_EnableIOAnalogSwitchBooster HAL_SBS_EnableIOAnalogSwitchBooster +#define HAL_SYSCFG_DisableIOAnalogSwitchBooster HAL_SBS_DisableIOAnalogSwitchBooster +#define HAL_SYSCFG_ETHInterfaceSelect HAL_SBS_ETHInterfaceSelect + +#define HAL_SYSCFG_Lock HAL_SBS_Lock +#define HAL_SYSCFG_GetLock HAL_SBS_GetLock + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +#define HAL_SYSCFG_ConfigAttributes HAL_SBS_ConfigAttributes +#define HAL_SYSCFG_GetConfigAttributes HAL_SBS_GetConfigAttributes +#endif /* __ARM_FEATURE_CMSE */ + +#endif /* STM32H5 */ + + +/** + * @} + */ + + +/** @defgroup LL_FMC_Aliased_Defines LL FMC Aliased Defines maintained for compatibility purpose + * @{ + */ +#if defined(STM32L4) || defined(STM32F7) || defined(STM32H7) || defined(STM32G4) +#define FMC_NAND_PCC_WAIT_FEATURE_DISABLE FMC_NAND_WAIT_FEATURE_DISABLE +#define FMC_NAND_PCC_WAIT_FEATURE_ENABLE FMC_NAND_WAIT_FEATURE_ENABLE +#define FMC_NAND_PCC_MEM_BUS_WIDTH_8 FMC_NAND_MEM_BUS_WIDTH_8 +#define FMC_NAND_PCC_MEM_BUS_WIDTH_16 FMC_NAND_MEM_BUS_WIDTH_16 +#elif defined(STM32F1) || defined(STM32F2) || defined(STM32F3) || defined(STM32F4) +#define FMC_NAND_WAIT_FEATURE_DISABLE FMC_NAND_PCC_WAIT_FEATURE_DISABLE +#define FMC_NAND_WAIT_FEATURE_ENABLE FMC_NAND_PCC_WAIT_FEATURE_ENABLE +#define FMC_NAND_MEM_BUS_WIDTH_8 FMC_NAND_PCC_MEM_BUS_WIDTH_8 +#define FMC_NAND_MEM_BUS_WIDTH_16 FMC_NAND_PCC_MEM_BUS_WIDTH_16 +#endif +/** + * @} + */ + +/** @defgroup LL_FSMC_Aliased_Defines LL FSMC Aliased Defines maintained for legacy purpose + * @{ + */ + +#define FSMC_NORSRAM_TYPEDEF FSMC_NORSRAM_TypeDef +#define FSMC_NORSRAM_EXTENDED_TYPEDEF FSMC_NORSRAM_EXTENDED_TypeDef +/** + * @} + */ + +/** @defgroup HAL_GPIO_Aliased_Macros HAL GPIO Aliased Macros maintained for legacy purpose + * @{ + */ +#define GET_GPIO_SOURCE GPIO_GET_INDEX +#define GET_GPIO_INDEX GPIO_GET_INDEX + +#if defined(STM32F4) +#define GPIO_AF12_SDMMC GPIO_AF12_SDIO +#define GPIO_AF12_SDMMC1 GPIO_AF12_SDIO +#endif + +#if defined(STM32F7) +#define GPIO_AF12_SDIO GPIO_AF12_SDMMC1 +#define GPIO_AF12_SDMMC GPIO_AF12_SDMMC1 +#endif + +#if defined(STM32L4) +#define GPIO_AF12_SDIO GPIO_AF12_SDMMC1 +#define GPIO_AF12_SDMMC GPIO_AF12_SDMMC1 +#endif + +#if defined(STM32H7) +#define GPIO_AF7_SDIO1 GPIO_AF7_SDMMC1 +#define GPIO_AF8_SDIO1 GPIO_AF8_SDMMC1 +#define GPIO_AF12_SDIO1 GPIO_AF12_SDMMC1 +#define GPIO_AF9_SDIO2 GPIO_AF9_SDMMC2 +#define GPIO_AF10_SDIO2 GPIO_AF10_SDMMC2 +#define GPIO_AF11_SDIO2 GPIO_AF11_SDMMC2 + +#if defined (STM32H743xx) || defined (STM32H753xx) || defined (STM32H750xx) || defined (STM32H742xx) || \ + defined (STM32H745xx) || defined (STM32H755xx) || defined (STM32H747xx) || defined (STM32H757xx) +#define GPIO_AF10_OTG2_HS GPIO_AF10_OTG2_FS +#define GPIO_AF10_OTG1_FS GPIO_AF10_OTG1_HS +#define GPIO_AF12_OTG2_FS GPIO_AF12_OTG1_FS +#endif /*STM32H743xx || STM32H753xx || STM32H750xx || STM32H742xx || STM32H745xx || STM32H755xx || STM32H747xx || \ + STM32H757xx */ +#endif /* STM32H7 */ + +#define GPIO_AF0_LPTIM GPIO_AF0_LPTIM1 +#define GPIO_AF1_LPTIM GPIO_AF1_LPTIM1 +#define GPIO_AF2_LPTIM GPIO_AF2_LPTIM1 + +#if defined(STM32L0) || defined(STM32L4) || defined(STM32F4) || defined(STM32F2) || defined(STM32F7) || \ + defined(STM32G4) || defined(STM32H7) || defined(STM32WB) || defined(STM32U5) +#define GPIO_SPEED_LOW GPIO_SPEED_FREQ_LOW +#define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_MEDIUM +#define GPIO_SPEED_FAST GPIO_SPEED_FREQ_HIGH +#define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_VERY_HIGH +#endif /* STM32L0 || STM32L4 || STM32F4 || STM32F2 || STM32F7 || STM32G4 || STM32H7 || STM32WB || STM32U5*/ + +#if defined(STM32L1) +#define GPIO_SPEED_VERY_LOW GPIO_SPEED_FREQ_LOW +#define GPIO_SPEED_LOW GPIO_SPEED_FREQ_MEDIUM +#define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_HIGH +#define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_VERY_HIGH +#endif /* STM32L1 */ + +#if defined(STM32F0) || defined(STM32F3) || defined(STM32F1) +#define GPIO_SPEED_LOW GPIO_SPEED_FREQ_LOW +#define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_MEDIUM +#define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_HIGH +#endif /* STM32F0 || STM32F3 || STM32F1 */ + +#define GPIO_AF6_DFSDM GPIO_AF6_DFSDM1 + +#if defined(STM32U5) || defined(STM32H5) +#define GPIO_AF0_RTC_50Hz GPIO_AF0_RTC_50HZ +#endif /* STM32U5 || STM32H5 */ +#if defined(STM32U5) +#define GPIO_AF0_S2DSTOP GPIO_AF0_SRDSTOP +#define GPIO_AF11_LPGPIO GPIO_AF11_LPGPIO1 +#endif /* STM32U5 */ + +#if defined(STM32WBA) +#define GPIO_AF11_RF_ANTSW0 GPIO_AF11_RF +#define GPIO_AF11_RF_ANTSW1 GPIO_AF11_RF +#define GPIO_AF11_RF_ANTSW2 GPIO_AF11_RF +#define GPIO_AF11_RF_IO1 GPIO_AF11_RF +#define GPIO_AF11_RF_IO2 GPIO_AF11_RF +#define GPIO_AF11_RF_IO3 GPIO_AF11_RF +#define GPIO_AF11_RF_IO4 GPIO_AF11_RF +#define GPIO_AF11_RF_IO5 GPIO_AF11_RF +#define GPIO_AF11_RF_IO6 GPIO_AF11_RF +#define GPIO_AF11_RF_IO7 GPIO_AF11_RF +#define GPIO_AF11_RF_IO8 GPIO_AF11_RF +#define GPIO_AF11_RF_IO9 GPIO_AF11_RF +#endif /* STM32WBA */ +/** + * @} + */ + +/** @defgroup HAL_GTZC_Aliased_Defines HAL GTZC Aliased Defines maintained for legacy purpose + * @{ + */ +#if defined(STM32U5) +#define GTZC_PERIPH_DCMI GTZC_PERIPH_DCMI_PSSI +#define GTZC_PERIPH_LTDC GTZC_PERIPH_LTDCUSB +#endif /* STM32U5 */ +#if defined(STM32H5) +#define GTZC_PERIPH_DAC12 GTZC_PERIPH_DAC1 +#define GTZC_PERIPH_ADC12 GTZC_PERIPH_ADC +#define GTZC_PERIPH_USBFS GTZC_PERIPH_USB +#endif /* STM32H5 */ +#if defined(STM32H5) || defined(STM32U5) +#define GTZC_MCPBB_NB_VCTR_REG_MAX GTZC_MPCBB_NB_VCTR_REG_MAX +#define GTZC_MCPBB_NB_LCK_VCTR_REG_MAX GTZC_MPCBB_NB_LCK_VCTR_REG_MAX +#define GTZC_MCPBB_SUPERBLOCK_UNLOCKED GTZC_MPCBB_SUPERBLOCK_UNLOCKED +#define GTZC_MCPBB_SUPERBLOCK_LOCKED GTZC_MPCBB_SUPERBLOCK_LOCKED +#define GTZC_MCPBB_BLOCK_NSEC GTZC_MPCBB_BLOCK_NSEC +#define GTZC_MCPBB_BLOCK_SEC GTZC_MPCBB_BLOCK_SEC +#define GTZC_MCPBB_BLOCK_NPRIV GTZC_MPCBB_BLOCK_NPRIV +#define GTZC_MCPBB_BLOCK_PRIV GTZC_MPCBB_BLOCK_PRIV +#define GTZC_MCPBB_LOCK_OFF GTZC_MPCBB_LOCK_OFF +#define GTZC_MCPBB_LOCK_ON GTZC_MPCBB_LOCK_ON +#endif /* STM32H5 || STM32U5 */ +/** + * @} + */ + +/** @defgroup HAL_HRTIM_Aliased_Macros HAL HRTIM Aliased Macros maintained for legacy purpose + * @{ + */ +#define HRTIM_TIMDELAYEDPROTECTION_DISABLED HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DISABLED +#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT1_EEV68 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT1_EEV6 +#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT2_EEV68 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT2_EEV6 +#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDBOTH_EEV68 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDBOTH_EEV6 +#define HRTIM_TIMDELAYEDPROTECTION_BALANCED_EEV68 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_BALANCED_EEV6 +#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT1_DEEV79 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT1_DEEV7 +#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT2_DEEV79 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT2_DEEV7 +#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDBOTH_EEV79 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDBOTH_EEV7 +#define HRTIM_TIMDELAYEDPROTECTION_BALANCED_EEV79 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_BALANCED_EEV7 + +#define __HAL_HRTIM_SetCounter __HAL_HRTIM_SETCOUNTER +#define __HAL_HRTIM_GetCounter __HAL_HRTIM_GETCOUNTER +#define __HAL_HRTIM_SetPeriod __HAL_HRTIM_SETPERIOD +#define __HAL_HRTIM_GetPeriod __HAL_HRTIM_GETPERIOD +#define __HAL_HRTIM_SetClockPrescaler __HAL_HRTIM_SETCLOCKPRESCALER +#define __HAL_HRTIM_GetClockPrescaler __HAL_HRTIM_GETCLOCKPRESCALER +#define __HAL_HRTIM_SetCompare __HAL_HRTIM_SETCOMPARE +#define __HAL_HRTIM_GetCompare __HAL_HRTIM_GETCOMPARE + +#if defined(STM32F3) || defined(STM32G4) || defined(STM32H7) +#define HRTIMInterruptResquests HRTIMInterruptRequests +#endif /* STM32F3 || STM32G4 || STM32H7 */ + +#if defined(STM32G4) +#define HAL_HRTIM_ExternalEventCounterConfig HAL_HRTIM_ExtEventCounterConfig +#define HAL_HRTIM_ExternalEventCounterEnable HAL_HRTIM_ExtEventCounterEnable +#define HAL_HRTIM_ExternalEventCounterDisable HAL_HRTIM_ExtEventCounterDisable +#define HAL_HRTIM_ExternalEventCounterReset HAL_HRTIM_ExtEventCounterReset +#define HRTIM_TIMEEVENT_A HRTIM_EVENTCOUNTER_A +#define HRTIM_TIMEEVENT_B HRTIM_EVENTCOUNTER_B +#define HRTIM_TIMEEVENTRESETMODE_UNCONDITIONAL HRTIM_EVENTCOUNTER_RSTMODE_UNCONDITIONAL +#define HRTIM_TIMEEVENTRESETMODE_CONDITIONAL HRTIM_EVENTCOUNTER_RSTMODE_CONDITIONAL +#endif /* STM32G4 */ + +#if defined(STM32H7) +#define HRTIM_OUTPUTSET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 + +#define HRTIM_OUTPUTRESET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 +#endif /* STM32H7 */ + +#if defined(STM32F3) +/** @brief Constants defining available sources associated to external events. + */ +#define HRTIM_EVENTSRC_1 (0x00000000U) +#define HRTIM_EVENTSRC_2 (HRTIM_EECR1_EE1SRC_0) +#define HRTIM_EVENTSRC_3 (HRTIM_EECR1_EE1SRC_1) +#define HRTIM_EVENTSRC_4 (HRTIM_EECR1_EE1SRC_1 | HRTIM_EECR1_EE1SRC_0) + +/** @brief Constants defining the DLL calibration periods (in micro seconds) + */ +#define HRTIM_CALIBRATIONRATE_7300 0x00000000U +#define HRTIM_CALIBRATIONRATE_910 (HRTIM_DLLCR_CALRTE_0) +#define HRTIM_CALIBRATIONRATE_114 (HRTIM_DLLCR_CALRTE_1) +#define HRTIM_CALIBRATIONRATE_14 (HRTIM_DLLCR_CALRTE_1 | HRTIM_DLLCR_CALRTE_0) +#endif /* STM32F3 */ + +/** + * @} + */ + +/** @defgroup HAL_I2C_Aliased_Defines HAL I2C Aliased Defines maintained for legacy purpose + * @{ + */ +#define I2C_DUALADDRESS_DISABLED I2C_DUALADDRESS_DISABLE +#define I2C_DUALADDRESS_ENABLED I2C_DUALADDRESS_ENABLE +#define I2C_GENERALCALL_DISABLED I2C_GENERALCALL_DISABLE +#define I2C_GENERALCALL_ENABLED I2C_GENERALCALL_ENABLE +#define I2C_NOSTRETCH_DISABLED I2C_NOSTRETCH_DISABLE +#define I2C_NOSTRETCH_ENABLED I2C_NOSTRETCH_ENABLE +#define I2C_ANALOGFILTER_ENABLED I2C_ANALOGFILTER_ENABLE +#define I2C_ANALOGFILTER_DISABLED I2C_ANALOGFILTER_DISABLE +#if defined(STM32F0) || defined(STM32F1) || defined(STM32F3) || defined(STM32G0) || defined(STM32L4) || \ + defined(STM32L1) || defined(STM32F7) +#define HAL_I2C_STATE_MEM_BUSY_TX HAL_I2C_STATE_BUSY_TX +#define HAL_I2C_STATE_MEM_BUSY_RX HAL_I2C_STATE_BUSY_RX +#define HAL_I2C_STATE_MASTER_BUSY_TX HAL_I2C_STATE_BUSY_TX +#define HAL_I2C_STATE_MASTER_BUSY_RX HAL_I2C_STATE_BUSY_RX +#define HAL_I2C_STATE_SLAVE_BUSY_TX HAL_I2C_STATE_BUSY_TX +#define HAL_I2C_STATE_SLAVE_BUSY_RX HAL_I2C_STATE_BUSY_RX +#endif +/** + * @} + */ + +/** @defgroup HAL_IRDA_Aliased_Defines HAL IRDA Aliased Defines maintained for legacy purpose + * @{ + */ +#define IRDA_ONE_BIT_SAMPLE_DISABLED IRDA_ONE_BIT_SAMPLE_DISABLE +#define IRDA_ONE_BIT_SAMPLE_ENABLED IRDA_ONE_BIT_SAMPLE_ENABLE + +/** + * @} + */ + +/** @defgroup HAL_IWDG_Aliased_Defines HAL IWDG Aliased Defines maintained for legacy purpose + * @{ + */ +#define KR_KEY_RELOAD IWDG_KEY_RELOAD +#define KR_KEY_ENABLE IWDG_KEY_ENABLE +#define KR_KEY_EWA IWDG_KEY_WRITE_ACCESS_ENABLE +#define KR_KEY_DWA IWDG_KEY_WRITE_ACCESS_DISABLE +/** + * @} + */ + +/** @defgroup HAL_LPTIM_Aliased_Defines HAL LPTIM Aliased Defines maintained for legacy purpose + * @{ + */ + +#define LPTIM_CLOCKSAMPLETIME_DIRECTTRANSISTION LPTIM_CLOCKSAMPLETIME_DIRECTTRANSITION +#define LPTIM_CLOCKSAMPLETIME_2TRANSISTIONS LPTIM_CLOCKSAMPLETIME_2TRANSITIONS +#define LPTIM_CLOCKSAMPLETIME_4TRANSISTIONS LPTIM_CLOCKSAMPLETIME_4TRANSITIONS +#define LPTIM_CLOCKSAMPLETIME_8TRANSISTIONS LPTIM_CLOCKSAMPLETIME_8TRANSITIONS + +#define LPTIM_CLOCKPOLARITY_RISINGEDGE LPTIM_CLOCKPOLARITY_RISING +#define LPTIM_CLOCKPOLARITY_FALLINGEDGE LPTIM_CLOCKPOLARITY_FALLING +#define LPTIM_CLOCKPOLARITY_BOTHEDGES LPTIM_CLOCKPOLARITY_RISING_FALLING + +#define LPTIM_TRIGSAMPLETIME_DIRECTTRANSISTION LPTIM_TRIGSAMPLETIME_DIRECTTRANSITION +#define LPTIM_TRIGSAMPLETIME_2TRANSISTIONS LPTIM_TRIGSAMPLETIME_2TRANSITIONS +#define LPTIM_TRIGSAMPLETIME_4TRANSISTIONS LPTIM_TRIGSAMPLETIME_4TRANSITIONS +#define LPTIM_TRIGSAMPLETIME_8TRANSISTIONS LPTIM_TRIGSAMPLETIME_8TRANSITIONS + +/* The following 3 definition have also been present in a temporary version of lptim.h */ +/* They need to be renamed also to the right name, just in case */ +#define LPTIM_TRIGSAMPLETIME_2TRANSITION LPTIM_TRIGSAMPLETIME_2TRANSITIONS +#define LPTIM_TRIGSAMPLETIME_4TRANSITION LPTIM_TRIGSAMPLETIME_4TRANSITIONS +#define LPTIM_TRIGSAMPLETIME_8TRANSITION LPTIM_TRIGSAMPLETIME_8TRANSITIONS + + +/** @defgroup HAL_LPTIM_Aliased_Defines HAL LPTIM Aliased Defines maintained for legacy purpose + * @{ + */ +#define HAL_LPTIM_ReadCompare HAL_LPTIM_ReadCapturedValue +/** + * @} + */ + +#if defined(STM32U5) +#define LPTIM_ISR_CC1 LPTIM_ISR_CC1IF +#define LPTIM_ISR_CC2 LPTIM_ISR_CC2IF +#define LPTIM_CHANNEL_ALL 0x00000000U +#endif /* STM32U5 */ +/** + * @} + */ + +/** @defgroup HAL_NAND_Aliased_Defines HAL NAND Aliased Defines maintained for legacy purpose + * @{ + */ +#define HAL_NAND_Read_Page HAL_NAND_Read_Page_8b +#define HAL_NAND_Write_Page HAL_NAND_Write_Page_8b +#define HAL_NAND_Read_SpareArea HAL_NAND_Read_SpareArea_8b +#define HAL_NAND_Write_SpareArea HAL_NAND_Write_SpareArea_8b + +#define NAND_AddressTypedef NAND_AddressTypeDef + +#define __ARRAY_ADDRESS ARRAY_ADDRESS +#define __ADDR_1st_CYCLE ADDR_1ST_CYCLE +#define __ADDR_2nd_CYCLE ADDR_2ND_CYCLE +#define __ADDR_3rd_CYCLE ADDR_3RD_CYCLE +#define __ADDR_4th_CYCLE ADDR_4TH_CYCLE +/** + * @} + */ + +/** @defgroup HAL_NOR_Aliased_Defines HAL NOR Aliased Defines maintained for legacy purpose + * @{ + */ +#define NOR_StatusTypedef HAL_NOR_StatusTypeDef +#define NOR_SUCCESS HAL_NOR_STATUS_SUCCESS +#define NOR_ONGOING HAL_NOR_STATUS_ONGOING +#define NOR_ERROR HAL_NOR_STATUS_ERROR +#define NOR_TIMEOUT HAL_NOR_STATUS_TIMEOUT + +#define __NOR_WRITE NOR_WRITE +#define __NOR_ADDR_SHIFT NOR_ADDR_SHIFT +/** + * @} + */ + +/** @defgroup HAL_OPAMP_Aliased_Defines HAL OPAMP Aliased Defines maintained for legacy purpose + * @{ + */ + +#define OPAMP_NONINVERTINGINPUT_VP0 OPAMP_NONINVERTINGINPUT_IO0 +#define OPAMP_NONINVERTINGINPUT_VP1 OPAMP_NONINVERTINGINPUT_IO1 +#define OPAMP_NONINVERTINGINPUT_VP2 OPAMP_NONINVERTINGINPUT_IO2 +#define OPAMP_NONINVERTINGINPUT_VP3 OPAMP_NONINVERTINGINPUT_IO3 + +#define OPAMP_SEC_NONINVERTINGINPUT_VP0 OPAMP_SEC_NONINVERTINGINPUT_IO0 +#define OPAMP_SEC_NONINVERTINGINPUT_VP1 OPAMP_SEC_NONINVERTINGINPUT_IO1 +#define OPAMP_SEC_NONINVERTINGINPUT_VP2 OPAMP_SEC_NONINVERTINGINPUT_IO2 +#define OPAMP_SEC_NONINVERTINGINPUT_VP3 OPAMP_SEC_NONINVERTINGINPUT_IO3 + +#define OPAMP_INVERTINGINPUT_VM0 OPAMP_INVERTINGINPUT_IO0 +#define OPAMP_INVERTINGINPUT_VM1 OPAMP_INVERTINGINPUT_IO1 + +#define IOPAMP_INVERTINGINPUT_VM0 OPAMP_INVERTINGINPUT_IO0 +#define IOPAMP_INVERTINGINPUT_VM1 OPAMP_INVERTINGINPUT_IO1 + +#define OPAMP_SEC_INVERTINGINPUT_VM0 OPAMP_SEC_INVERTINGINPUT_IO0 +#define OPAMP_SEC_INVERTINGINPUT_VM1 OPAMP_SEC_INVERTINGINPUT_IO1 + +#define OPAMP_INVERTINGINPUT_VINM OPAMP_SEC_INVERTINGINPUT_IO1 + +#define OPAMP_PGACONNECT_NO OPAMP_PGA_CONNECT_INVERTINGINPUT_NO +#define OPAMP_PGACONNECT_VM0 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO0 +#define OPAMP_PGACONNECT_VM1 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO1 + +#if defined(STM32L1) || defined(STM32L4) || defined(STM32L5) || defined(STM32H7) || defined(STM32G4) || defined(STM32U5) +#define HAL_OPAMP_MSP_INIT_CB_ID HAL_OPAMP_MSPINIT_CB_ID +#define HAL_OPAMP_MSP_DEINIT_CB_ID HAL_OPAMP_MSPDEINIT_CB_ID +#endif + +#if defined(STM32L4) || defined(STM32L5) +#define OPAMP_POWERMODE_NORMAL OPAMP_POWERMODE_NORMALPOWER +#elif defined(STM32G4) +#define OPAMP_POWERMODE_NORMAL OPAMP_POWERMODE_NORMALSPEED +#endif + +/** + * @} + */ + +/** @defgroup HAL_I2S_Aliased_Defines HAL I2S Aliased Defines maintained for legacy purpose + * @{ + */ +#define I2S_STANDARD_PHILLIPS I2S_STANDARD_PHILIPS + +#if defined(STM32H7) +#define I2S_IT_TXE I2S_IT_TXP +#define I2S_IT_RXNE I2S_IT_RXP + +#define I2S_FLAG_TXE I2S_FLAG_TXP +#define I2S_FLAG_RXNE I2S_FLAG_RXP +#endif + +#if defined(STM32F7) +#define I2S_CLOCK_SYSCLK I2S_CLOCK_PLL +#endif +/** + * @} + */ + +/** @defgroup HAL_PCCARD_Aliased_Defines HAL PCCARD Aliased Defines maintained for legacy purpose + * @{ + */ + +/* Compact Flash-ATA registers description */ +#define CF_DATA ATA_DATA +#define CF_SECTOR_COUNT ATA_SECTOR_COUNT +#define CF_SECTOR_NUMBER ATA_SECTOR_NUMBER +#define CF_CYLINDER_LOW ATA_CYLINDER_LOW +#define CF_CYLINDER_HIGH ATA_CYLINDER_HIGH +#define CF_CARD_HEAD ATA_CARD_HEAD +#define CF_STATUS_CMD ATA_STATUS_CMD +#define CF_STATUS_CMD_ALTERNATE ATA_STATUS_CMD_ALTERNATE +#define CF_COMMON_DATA_AREA ATA_COMMON_DATA_AREA + +/* Compact Flash-ATA commands */ +#define CF_READ_SECTOR_CMD ATA_READ_SECTOR_CMD +#define CF_WRITE_SECTOR_CMD ATA_WRITE_SECTOR_CMD +#define CF_ERASE_SECTOR_CMD ATA_ERASE_SECTOR_CMD +#define CF_IDENTIFY_CMD ATA_IDENTIFY_CMD + +#define PCCARD_StatusTypedef HAL_PCCARD_StatusTypeDef +#define PCCARD_SUCCESS HAL_PCCARD_STATUS_SUCCESS +#define PCCARD_ONGOING HAL_PCCARD_STATUS_ONGOING +#define PCCARD_ERROR HAL_PCCARD_STATUS_ERROR +#define PCCARD_TIMEOUT HAL_PCCARD_STATUS_TIMEOUT +/** + * @} + */ + +/** @defgroup HAL_RTC_Aliased_Defines HAL RTC Aliased Defines maintained for legacy purpose + * @{ + */ + +#define FORMAT_BIN RTC_FORMAT_BIN +#define FORMAT_BCD RTC_FORMAT_BCD + +#define RTC_ALARMSUBSECONDMASK_None RTC_ALARMSUBSECONDMASK_NONE +#define RTC_TAMPERERASEBACKUP_DISABLED RTC_TAMPER_ERASE_BACKUP_DISABLE +#define RTC_TAMPERMASK_FLAG_DISABLED RTC_TAMPERMASK_FLAG_DISABLE +#define RTC_TAMPERMASK_FLAG_ENABLED RTC_TAMPERMASK_FLAG_ENABLE + +#define RTC_MASKTAMPERFLAG_DISABLED RTC_TAMPERMASK_FLAG_DISABLE +#define RTC_MASKTAMPERFLAG_ENABLED RTC_TAMPERMASK_FLAG_ENABLE +#define RTC_TAMPERERASEBACKUP_ENABLED RTC_TAMPER_ERASE_BACKUP_ENABLE +#define RTC_TAMPER1_2_INTERRUPT RTC_ALL_TAMPER_INTERRUPT +#define RTC_TAMPER1_2_3_INTERRUPT RTC_ALL_TAMPER_INTERRUPT + +#define RTC_TIMESTAMPPIN_PC13 RTC_TIMESTAMPPIN_DEFAULT +#define RTC_TIMESTAMPPIN_PA0 RTC_TIMESTAMPPIN_POS1 +#define RTC_TIMESTAMPPIN_PI8 RTC_TIMESTAMPPIN_POS1 +#define RTC_TIMESTAMPPIN_PC1 RTC_TIMESTAMPPIN_POS2 + +#define RTC_OUTPUT_REMAP_PC13 RTC_OUTPUT_REMAP_NONE +#define RTC_OUTPUT_REMAP_PB14 RTC_OUTPUT_REMAP_POS1 +#define RTC_OUTPUT_REMAP_PB2 RTC_OUTPUT_REMAP_POS1 + +#define RTC_TAMPERPIN_PC13 RTC_TAMPERPIN_DEFAULT +#define RTC_TAMPERPIN_PA0 RTC_TAMPERPIN_POS1 +#define RTC_TAMPERPIN_PI8 RTC_TAMPERPIN_POS1 + +#if defined(STM32H5) || defined(STM32H7RS) || defined(STM32N6) +#define TAMP_SECRETDEVICE_ERASE_NONE TAMP_DEVICESECRETS_ERASE_NONE +#define TAMP_SECRETDEVICE_ERASE_BKP_SRAM TAMP_DEVICESECRETS_ERASE_BKPSRAM +#endif /* STM32H5 || STM32H7RS || STM32N6 */ + +#if defined(STM32WBA) +#define TAMP_SECRETDEVICE_ERASE_NONE TAMP_DEVICESECRETS_ERASE_NONE +#define TAMP_SECRETDEVICE_ERASE_SRAM2 TAMP_DEVICESECRETS_ERASE_SRAM2 +#define TAMP_SECRETDEVICE_ERASE_RHUK TAMP_DEVICESECRETS_ERASE_RHUK +#define TAMP_SECRETDEVICE_ERASE_ICACHE TAMP_DEVICESECRETS_ERASE_ICACHE +#define TAMP_SECRETDEVICE_ERASE_SAES_AES_HASH TAMP_DEVICESECRETS_ERASE_SAES_AES_HASH +#define TAMP_SECRETDEVICE_ERASE_PKA_SRAM TAMP_DEVICESECRETS_ERASE_PKA_SRAM +#define TAMP_SECRETDEVICE_ERASE_ALL TAMP_DEVICESECRETS_ERASE_ALL +#endif /* STM32WBA */ + +#if defined(STM32H5) || defined(STM32WBA) || defined(STM32H7RS) || defined(STM32N6) +#define TAMP_SECRETDEVICE_ERASE_DISABLE TAMP_DEVICESECRETS_ERASE_NONE +#define TAMP_SECRETDEVICE_ERASE_ENABLE TAMP_SECRETDEVICE_ERASE_ALL +#endif /* STM32H5 || STM32WBA || STM32H7RS || STM32N6 */ + +#if defined(STM32F7) || defined(STM32WB) +#define RTC_TAMPCR_TAMPXE RTC_TAMPER_ENABLE_BITS_MASK +#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_IT_ENABLE_BITS_MASK +#endif /* STM32F7 || STM32WB */ + +#if defined(STM32H7) +#define RTC_TAMPCR_TAMPXE RTC_TAMPER_X +#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_X_INTERRUPT +#endif /* STM32H7 */ + +#if defined(STM32F7) || defined(STM32H7) || defined(STM32L0) || defined(STM32WB) +#define RTC_TAMPER1_INTERRUPT RTC_IT_TAMP1 +#define RTC_TAMPER2_INTERRUPT RTC_IT_TAMP2 +#define RTC_TAMPER3_INTERRUPT RTC_IT_TAMP3 +#define RTC_ALL_TAMPER_INTERRUPT RTC_IT_TAMP +#endif /* STM32F7 || STM32H7 || STM32L0 || STM32WB */ + +/** + * @} + */ + + +/** @defgroup HAL_SMARTCARD_Aliased_Defines HAL SMARTCARD Aliased Defines maintained for legacy purpose + * @{ + */ +#define SMARTCARD_NACK_ENABLED SMARTCARD_NACK_ENABLE +#define SMARTCARD_NACK_DISABLED SMARTCARD_NACK_DISABLE + +#define SMARTCARD_ONEBIT_SAMPLING_DISABLED SMARTCARD_ONE_BIT_SAMPLE_DISABLE +#define SMARTCARD_ONEBIT_SAMPLING_ENABLED SMARTCARD_ONE_BIT_SAMPLE_ENABLE +#define SMARTCARD_ONEBIT_SAMPLING_DISABLE SMARTCARD_ONE_BIT_SAMPLE_DISABLE +#define SMARTCARD_ONEBIT_SAMPLING_ENABLE SMARTCARD_ONE_BIT_SAMPLE_ENABLE + +#define SMARTCARD_TIMEOUT_DISABLED SMARTCARD_TIMEOUT_DISABLE +#define SMARTCARD_TIMEOUT_ENABLED SMARTCARD_TIMEOUT_ENABLE + +#define SMARTCARD_LASTBIT_DISABLED SMARTCARD_LASTBIT_DISABLE +#define SMARTCARD_LASTBIT_ENABLED SMARTCARD_LASTBIT_ENABLE +/** + * @} + */ + + +/** @defgroup HAL_SMBUS_Aliased_Defines HAL SMBUS Aliased Defines maintained for legacy purpose + * @{ + */ +#define SMBUS_DUALADDRESS_DISABLED SMBUS_DUALADDRESS_DISABLE +#define SMBUS_DUALADDRESS_ENABLED SMBUS_DUALADDRESS_ENABLE +#define SMBUS_GENERALCALL_DISABLED SMBUS_GENERALCALL_DISABLE +#define SMBUS_GENERALCALL_ENABLED SMBUS_GENERALCALL_ENABLE +#define SMBUS_NOSTRETCH_DISABLED SMBUS_NOSTRETCH_DISABLE +#define SMBUS_NOSTRETCH_ENABLED SMBUS_NOSTRETCH_ENABLE +#define SMBUS_ANALOGFILTER_ENABLED SMBUS_ANALOGFILTER_ENABLE +#define SMBUS_ANALOGFILTER_DISABLED SMBUS_ANALOGFILTER_DISABLE +#define SMBUS_PEC_DISABLED SMBUS_PEC_DISABLE +#define SMBUS_PEC_ENABLED SMBUS_PEC_ENABLE +#define HAL_SMBUS_STATE_SLAVE_LISTEN HAL_SMBUS_STATE_LISTEN +/** + * @} + */ + +/** @defgroup HAL_SPI_Aliased_Defines HAL SPI Aliased Defines maintained for legacy purpose + * @{ + */ +#define SPI_TIMODE_DISABLED SPI_TIMODE_DISABLE +#define SPI_TIMODE_ENABLED SPI_TIMODE_ENABLE + +#define SPI_CRCCALCULATION_DISABLED SPI_CRCCALCULATION_DISABLE +#define SPI_CRCCALCULATION_ENABLED SPI_CRCCALCULATION_ENABLE + +#define SPI_NSS_PULSE_DISABLED SPI_NSS_PULSE_DISABLE +#define SPI_NSS_PULSE_ENABLED SPI_NSS_PULSE_ENABLE + +#if defined(STM32H7) + +#define SPI_FLAG_TXE SPI_FLAG_TXP +#define SPI_FLAG_RXNE SPI_FLAG_RXP + +#define SPI_IT_TXE SPI_IT_TXP +#define SPI_IT_RXNE SPI_IT_RXP + +#define SPI_FRLVL_EMPTY SPI_RX_FIFO_0PACKET +#define SPI_FRLVL_QUARTER_FULL SPI_RX_FIFO_1PACKET +#define SPI_FRLVL_HALF_FULL SPI_RX_FIFO_2PACKET +#define SPI_FRLVL_FULL SPI_RX_FIFO_3PACKET + +#endif /* STM32H7 */ + +/** + * @} + */ + +/** @defgroup HAL_TIM_Aliased_Defines HAL TIM Aliased Defines maintained for legacy purpose + * @{ + */ +#define CCER_CCxE_MASK TIM_CCER_CCxE_MASK +#define CCER_CCxNE_MASK TIM_CCER_CCxNE_MASK + +#define TIM_DMABase_CR1 TIM_DMABASE_CR1 +#define TIM_DMABase_CR2 TIM_DMABASE_CR2 +#define TIM_DMABase_SMCR TIM_DMABASE_SMCR +#define TIM_DMABase_DIER TIM_DMABASE_DIER +#define TIM_DMABase_SR TIM_DMABASE_SR +#define TIM_DMABase_EGR TIM_DMABASE_EGR +#define TIM_DMABase_CCMR1 TIM_DMABASE_CCMR1 +#define TIM_DMABase_CCMR2 TIM_DMABASE_CCMR2 +#define TIM_DMABase_CCER TIM_DMABASE_CCER +#define TIM_DMABase_CNT TIM_DMABASE_CNT +#define TIM_DMABase_PSC TIM_DMABASE_PSC +#define TIM_DMABase_ARR TIM_DMABASE_ARR +#define TIM_DMABase_RCR TIM_DMABASE_RCR +#define TIM_DMABase_CCR1 TIM_DMABASE_CCR1 +#define TIM_DMABase_CCR2 TIM_DMABASE_CCR2 +#define TIM_DMABase_CCR3 TIM_DMABASE_CCR3 +#define TIM_DMABase_CCR4 TIM_DMABASE_CCR4 +#define TIM_DMABase_BDTR TIM_DMABASE_BDTR +#define TIM_DMABase_DCR TIM_DMABASE_DCR +#define TIM_DMABase_DMAR TIM_DMABASE_DMAR +#define TIM_DMABase_OR1 TIM_DMABASE_OR1 +#define TIM_DMABase_CCMR3 TIM_DMABASE_CCMR3 +#define TIM_DMABase_CCR5 TIM_DMABASE_CCR5 +#define TIM_DMABase_CCR6 TIM_DMABASE_CCR6 +#define TIM_DMABase_OR2 TIM_DMABASE_OR2 +#define TIM_DMABase_OR3 TIM_DMABASE_OR3 +#define TIM_DMABase_OR TIM_DMABASE_OR + +#define TIM_EventSource_Update TIM_EVENTSOURCE_UPDATE +#define TIM_EventSource_CC1 TIM_EVENTSOURCE_CC1 +#define TIM_EventSource_CC2 TIM_EVENTSOURCE_CC2 +#define TIM_EventSource_CC3 TIM_EVENTSOURCE_CC3 +#define TIM_EventSource_CC4 TIM_EVENTSOURCE_CC4 +#define TIM_EventSource_COM TIM_EVENTSOURCE_COM +#define TIM_EventSource_Trigger TIM_EVENTSOURCE_TRIGGER +#define TIM_EventSource_Break TIM_EVENTSOURCE_BREAK +#define TIM_EventSource_Break2 TIM_EVENTSOURCE_BREAK2 + +#define TIM_DMABurstLength_1Transfer TIM_DMABURSTLENGTH_1TRANSFER +#define TIM_DMABurstLength_2Transfers TIM_DMABURSTLENGTH_2TRANSFERS +#define TIM_DMABurstLength_3Transfers TIM_DMABURSTLENGTH_3TRANSFERS +#define TIM_DMABurstLength_4Transfers TIM_DMABURSTLENGTH_4TRANSFERS +#define TIM_DMABurstLength_5Transfers TIM_DMABURSTLENGTH_5TRANSFERS +#define TIM_DMABurstLength_6Transfers TIM_DMABURSTLENGTH_6TRANSFERS +#define TIM_DMABurstLength_7Transfers TIM_DMABURSTLENGTH_7TRANSFERS +#define TIM_DMABurstLength_8Transfers TIM_DMABURSTLENGTH_8TRANSFERS +#define TIM_DMABurstLength_9Transfers TIM_DMABURSTLENGTH_9TRANSFERS +#define TIM_DMABurstLength_10Transfers TIM_DMABURSTLENGTH_10TRANSFERS +#define TIM_DMABurstLength_11Transfers TIM_DMABURSTLENGTH_11TRANSFERS +#define TIM_DMABurstLength_12Transfers TIM_DMABURSTLENGTH_12TRANSFERS +#define TIM_DMABurstLength_13Transfers TIM_DMABURSTLENGTH_13TRANSFERS +#define TIM_DMABurstLength_14Transfers TIM_DMABURSTLENGTH_14TRANSFERS +#define TIM_DMABurstLength_15Transfers TIM_DMABURSTLENGTH_15TRANSFERS +#define TIM_DMABurstLength_16Transfers TIM_DMABURSTLENGTH_16TRANSFERS +#define TIM_DMABurstLength_17Transfers TIM_DMABURSTLENGTH_17TRANSFERS +#define TIM_DMABurstLength_18Transfers TIM_DMABURSTLENGTH_18TRANSFERS + +#if defined(STM32L0) +#define TIM22_TI1_GPIO1 TIM22_TI1_GPIO +#define TIM22_TI1_GPIO2 TIM22_TI1_GPIO +#endif + +#if defined(STM32F3) +#define IS_TIM_HALL_INTERFACE_INSTANCE IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE +#endif + +#if defined(STM32H7) +#define TIM_TIM1_ETR_COMP1_OUT TIM_TIM1_ETR_COMP1 +#define TIM_TIM1_ETR_COMP2_OUT TIM_TIM1_ETR_COMP2 +#define TIM_TIM8_ETR_COMP1_OUT TIM_TIM8_ETR_COMP1 +#define TIM_TIM8_ETR_COMP2_OUT TIM_TIM8_ETR_COMP2 +#define TIM_TIM2_ETR_COMP1_OUT TIM_TIM2_ETR_COMP1 +#define TIM_TIM2_ETR_COMP2_OUT TIM_TIM2_ETR_COMP2 +#define TIM_TIM3_ETR_COMP1_OUT TIM_TIM3_ETR_COMP1 +#define TIM_TIM1_TI1_COMP1_OUT TIM_TIM1_TI1_COMP1 +#define TIM_TIM8_TI1_COMP2_OUT TIM_TIM8_TI1_COMP2 +#define TIM_TIM2_TI4_COMP1_OUT TIM_TIM2_TI4_COMP1 +#define TIM_TIM2_TI4_COMP2_OUT TIM_TIM2_TI4_COMP2 +#define TIM_TIM2_TI4_COMP1COMP2_OUT TIM_TIM2_TI4_COMP1_COMP2 +#define TIM_TIM3_TI1_COMP1_OUT TIM_TIM3_TI1_COMP1 +#define TIM_TIM3_TI1_COMP2_OUT TIM_TIM3_TI1_COMP2 +#define TIM_TIM3_TI1_COMP1COMP2_OUT TIM_TIM3_TI1_COMP1_COMP2 +#endif + +#if defined(STM32U5) || defined(STM32MP2) +#define OCREF_CLEAR_SELECT_Pos OCREF_CLEAR_SELECT_POS +#define OCREF_CLEAR_SELECT_Msk OCREF_CLEAR_SELECT_MSK +#endif +/** + * @} + */ + +/** @defgroup HAL_TSC_Aliased_Defines HAL TSC Aliased Defines maintained for legacy purpose + * @{ + */ +#define TSC_SYNC_POL_FALL TSC_SYNC_POLARITY_FALLING +#define TSC_SYNC_POL_RISE_HIGH TSC_SYNC_POLARITY_RISING +/** + * @} + */ + +/** @defgroup HAL_UART_Aliased_Defines HAL UART Aliased Defines maintained for legacy purpose + * @{ + */ +#define UART_ONEBIT_SAMPLING_DISABLED UART_ONE_BIT_SAMPLE_DISABLE +#define UART_ONEBIT_SAMPLING_ENABLED UART_ONE_BIT_SAMPLE_ENABLE +#define UART_ONE_BIT_SAMPLE_DISABLED UART_ONE_BIT_SAMPLE_DISABLE +#define UART_ONE_BIT_SAMPLE_ENABLED UART_ONE_BIT_SAMPLE_ENABLE + +#define __HAL_UART_ONEBIT_ENABLE __HAL_UART_ONE_BIT_SAMPLE_ENABLE +#define __HAL_UART_ONEBIT_DISABLE __HAL_UART_ONE_BIT_SAMPLE_DISABLE + +#define __DIV_SAMPLING16 UART_DIV_SAMPLING16 +#define __DIVMANT_SAMPLING16 UART_DIVMANT_SAMPLING16 +#define __DIVFRAQ_SAMPLING16 UART_DIVFRAQ_SAMPLING16 +#define __UART_BRR_SAMPLING16 UART_BRR_SAMPLING16 + +#define __DIV_SAMPLING8 UART_DIV_SAMPLING8 +#define __DIVMANT_SAMPLING8 UART_DIVMANT_SAMPLING8 +#define __DIVFRAQ_SAMPLING8 UART_DIVFRAQ_SAMPLING8 +#define __UART_BRR_SAMPLING8 UART_BRR_SAMPLING8 + +#define __DIV_LPUART UART_DIV_LPUART + +#define UART_WAKEUPMETHODE_IDLELINE UART_WAKEUPMETHOD_IDLELINE +#define UART_WAKEUPMETHODE_ADDRESSMARK UART_WAKEUPMETHOD_ADDRESSMARK + +/** + * @} + */ + + +/** @defgroup HAL_USART_Aliased_Defines HAL USART Aliased Defines maintained for legacy purpose + * @{ + */ + +#define USART_CLOCK_DISABLED USART_CLOCK_DISABLE +#define USART_CLOCK_ENABLED USART_CLOCK_ENABLE + +#define USARTNACK_ENABLED USART_NACK_ENABLE +#define USARTNACK_DISABLED USART_NACK_DISABLE +/** + * @} + */ + +/** @defgroup HAL_WWDG_Aliased_Defines HAL WWDG Aliased Defines maintained for legacy purpose + * @{ + */ +#define CFR_BASE WWDG_CFR_BASE + +/** + * @} + */ + +/** @defgroup HAL_CAN_Aliased_Defines HAL CAN Aliased Defines maintained for legacy purpose + * @{ + */ +#define CAN_FilterFIFO0 CAN_FILTER_FIFO0 +#define CAN_FilterFIFO1 CAN_FILTER_FIFO1 +#define CAN_IT_RQCP0 CAN_IT_TME +#define CAN_IT_RQCP1 CAN_IT_TME +#define CAN_IT_RQCP2 CAN_IT_TME +#define INAK_TIMEOUT CAN_TIMEOUT_VALUE +#define SLAK_TIMEOUT CAN_TIMEOUT_VALUE +#define CAN_TXSTATUS_FAILED ((uint8_t)0x00U) +#define CAN_TXSTATUS_OK ((uint8_t)0x01U) +#define CAN_TXSTATUS_PENDING ((uint8_t)0x02U) + +/** + * @} + */ + +/** @defgroup HAL_ETH_Aliased_Defines HAL ETH Aliased Defines maintained for legacy purpose + * @{ + */ + +#define VLAN_TAG ETH_VLAN_TAG +#define MIN_ETH_PAYLOAD ETH_MIN_ETH_PAYLOAD +#define MAX_ETH_PAYLOAD ETH_MAX_ETH_PAYLOAD +#define JUMBO_FRAME_PAYLOAD ETH_JUMBO_FRAME_PAYLOAD +#define MACMIIAR_CR_MASK ETH_MACMIIAR_CR_MASK +#define MACCR_CLEAR_MASK ETH_MACCR_CLEAR_MASK +#define MACFCR_CLEAR_MASK ETH_MACFCR_CLEAR_MASK +#define DMAOMR_CLEAR_MASK ETH_DMAOMR_CLEAR_MASK + +#define ETH_MMCCR 0x00000100U +#define ETH_MMCRIR 0x00000104U +#define ETH_MMCTIR 0x00000108U +#define ETH_MMCRIMR 0x0000010CU +#define ETH_MMCTIMR 0x00000110U +#define ETH_MMCTGFSCCR 0x0000014CU +#define ETH_MMCTGFMSCCR 0x00000150U +#define ETH_MMCTGFCR 0x00000168U +#define ETH_MMCRFCECR 0x00000194U +#define ETH_MMCRFAECR 0x00000198U +#define ETH_MMCRGUFCR 0x000001C4U + +#define ETH_MAC_TXFIFO_FULL 0x02000000U /* Tx FIFO full */ +#define ETH_MAC_TXFIFONOT_EMPTY 0x01000000U /* Tx FIFO not empty */ +#define ETH_MAC_TXFIFO_WRITE_ACTIVE 0x00400000U /* Tx FIFO write active */ +#define ETH_MAC_TXFIFO_IDLE 0x00000000U /* Tx FIFO read status: Idle */ +#define ETH_MAC_TXFIFO_READ 0x00100000U /* Tx FIFO read status: Read (transferring data to + the MAC transmitter) */ +#define ETH_MAC_TXFIFO_WAITING 0x00200000U /* Tx FIFO read status: Waiting for TxStatus from + MAC transmitter */ +#define ETH_MAC_TXFIFO_WRITING 0x00300000U /* Tx FIFO read status: Writing the received TxStatus + or flushing the TxFIFO */ +#define ETH_MAC_TRANSMISSION_PAUSE 0x00080000U /* MAC transmitter in pause */ +#define ETH_MAC_TRANSMITFRAMECONTROLLER_IDLE 0x00000000U /* MAC transmit frame controller: Idle */ +#define ETH_MAC_TRANSMITFRAMECONTROLLER_WAITING 0x00020000U /* MAC transmit frame controller: Waiting for Status + of previous frame or IFG/backoff period to be over */ +#define ETH_MAC_TRANSMITFRAMECONTROLLER_GENRATING_PCF 0x00040000U /* MAC transmit frame controller: Generating and + transmitting a Pause control frame (in full duplex mode) */ +#define ETH_MAC_TRANSMITFRAMECONTROLLER_TRANSFERRING 0x00060000U /* MAC transmit frame controller: Transferring input + frame for transmission */ +#define ETH_MAC_MII_TRANSMIT_ACTIVE 0x00010000U /* MAC MII transmit engine active */ +#define ETH_MAC_RXFIFO_EMPTY 0x00000000U /* Rx FIFO fill level: empty */ +#define ETH_MAC_RXFIFO_BELOW_THRESHOLD 0x00000100U /* Rx FIFO fill level: fill-level below flow-control + de-activate threshold */ +#define ETH_MAC_RXFIFO_ABOVE_THRESHOLD 0x00000200U /* Rx FIFO fill level: fill-level above flow-control + activate threshold */ +#define ETH_MAC_RXFIFO_FULL 0x00000300U /* Rx FIFO fill level: full */ +#if defined(STM32F1) +#else +#define ETH_MAC_READCONTROLLER_IDLE 0x00000000U /* Rx FIFO read controller IDLE state */ +#define ETH_MAC_READCONTROLLER_READING_DATA 0x00000020U /* Rx FIFO read controller Reading frame data */ +#define ETH_MAC_READCONTROLLER_READING_STATUS 0x00000040U /* Rx FIFO read controller Reading frame status + (or time-stamp) */ +#endif +#define ETH_MAC_READCONTROLLER_FLUSHING 0x00000060U /* Rx FIFO read controller Flushing the frame data and + status */ +#define ETH_MAC_RXFIFO_WRITE_ACTIVE 0x00000010U /* Rx FIFO write controller active */ +#define ETH_MAC_SMALL_FIFO_NOTACTIVE 0x00000000U /* MAC small FIFO read / write controllers not active */ +#define ETH_MAC_SMALL_FIFO_READ_ACTIVE 0x00000002U /* MAC small FIFO read controller active */ +#define ETH_MAC_SMALL_FIFO_WRITE_ACTIVE 0x00000004U /* MAC small FIFO write controller active */ +#define ETH_MAC_SMALL_FIFO_RW_ACTIVE 0x00000006U /* MAC small FIFO read / write controllers active */ +#define ETH_MAC_MII_RECEIVE_PROTOCOL_ACTIVE 0x00000001U /* MAC MII receive protocol engine active */ + +#define ETH_TxPacketConfig ETH_TxPacketConfigTypeDef /* Transmit Packet Configuration structure definition */ + +/** + * @} + */ + +/** @defgroup HAL_DCMI_Aliased_Defines HAL DCMI Aliased Defines maintained for legacy purpose + * @{ + */ +#define HAL_DCMI_ERROR_OVF HAL_DCMI_ERROR_OVR +#define DCMI_IT_OVF DCMI_IT_OVR +#define DCMI_FLAG_OVFRI DCMI_FLAG_OVRRI +#define DCMI_FLAG_OVFMI DCMI_FLAG_OVRMI + +#define HAL_DCMI_ConfigCROP HAL_DCMI_ConfigCrop +#define HAL_DCMI_EnableCROP HAL_DCMI_EnableCrop +#define HAL_DCMI_DisableCROP HAL_DCMI_DisableCrop + +/** + * @} + */ + +#if defined(STM32L4) || defined(STM32F7) || defined(STM32F427xx) || defined(STM32F437xx) \ + || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) \ + || defined(STM32H7) +/** @defgroup HAL_DMA2D_Aliased_Defines HAL DMA2D Aliased Defines maintained for legacy purpose + * @{ + */ +#define DMA2D_ARGB8888 DMA2D_OUTPUT_ARGB8888 +#define DMA2D_RGB888 DMA2D_OUTPUT_RGB888 +#define DMA2D_RGB565 DMA2D_OUTPUT_RGB565 +#define DMA2D_ARGB1555 DMA2D_OUTPUT_ARGB1555 +#define DMA2D_ARGB4444 DMA2D_OUTPUT_ARGB4444 + +#define CM_ARGB8888 DMA2D_INPUT_ARGB8888 +#define CM_RGB888 DMA2D_INPUT_RGB888 +#define CM_RGB565 DMA2D_INPUT_RGB565 +#define CM_ARGB1555 DMA2D_INPUT_ARGB1555 +#define CM_ARGB4444 DMA2D_INPUT_ARGB4444 +#define CM_L8 DMA2D_INPUT_L8 +#define CM_AL44 DMA2D_INPUT_AL44 +#define CM_AL88 DMA2D_INPUT_AL88 +#define CM_L4 DMA2D_INPUT_L4 +#define CM_A8 DMA2D_INPUT_A8 +#define CM_A4 DMA2D_INPUT_A4 +/** + * @} + */ +#endif /* STM32L4 || STM32F7 || STM32F4 || STM32H7 */ + +#if defined(STM32L4) || defined(STM32F7) || defined(STM32F427xx) || defined(STM32F437xx) \ + || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) \ + || defined(STM32H7) || defined(STM32U5) +/** @defgroup DMA2D_Aliases DMA2D API Aliases + * @{ + */ +#define HAL_DMA2D_DisableCLUT HAL_DMA2D_CLUTLoading_Abort /*!< Aliased to HAL_DMA2D_CLUTLoading_Abort + for compatibility with legacy code */ +/** + * @} + */ + +#endif /* STM32L4 || STM32F7 || STM32F4 || STM32H7 || STM32U5 */ + +/** @defgroup HAL_PPP_Aliased_Defines HAL PPP Aliased Defines maintained for legacy purpose + * @{ + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup HAL_CRYP_Aliased_Functions HAL CRYP Aliased Functions maintained for legacy purpose + * @{ + */ +#define HAL_CRYP_ComputationCpltCallback HAL_CRYPEx_ComputationCpltCallback +/** + * @} + */ + +/** @defgroup HAL_DCACHE_Aliased_Functions HAL DCACHE Aliased Functions maintained for legacy purpose + * @{ + */ + +#if defined(STM32U5) +#define HAL_DCACHE_CleanInvalidateByAddr HAL_DCACHE_CleanInvalidByAddr +#define HAL_DCACHE_CleanInvalidateByAddr_IT HAL_DCACHE_CleanInvalidByAddr_IT +#endif /* STM32U5 */ + +/** + * @} + */ + +#if !defined(STM32F2) +/** @defgroup HASH_alias HASH API alias + * @{ + */ +#define HAL_HASHEx_IRQHandler HAL_HASH_IRQHandler /*!< Redirection for compatibility with legacy code */ +/** + * + * @} + */ +#endif /* STM32F2 */ +/** @defgroup HAL_HASH_Aliased_Functions HAL HASH Aliased Functions maintained for legacy purpose + * @{ + */ +#define HAL_HASH_STATETypeDef HAL_HASH_StateTypeDef +#define HAL_HASHPhaseTypeDef HAL_HASH_PhaseTypeDef +#define HAL_HMAC_MD5_Finish HAL_HASH_MD5_Finish +#define HAL_HMAC_SHA1_Finish HAL_HASH_SHA1_Finish +#define HAL_HMAC_SHA224_Finish HAL_HASH_SHA224_Finish +#define HAL_HMAC_SHA256_Finish HAL_HASH_SHA256_Finish + +/*HASH Algorithm Selection*/ + +#define HASH_AlgoSelection_SHA1 HASH_ALGOSELECTION_SHA1 +#define HASH_AlgoSelection_SHA224 HASH_ALGOSELECTION_SHA224 +#define HASH_AlgoSelection_SHA256 HASH_ALGOSELECTION_SHA256 +#define HASH_AlgoSelection_MD5 HASH_ALGOSELECTION_MD5 + +#define HASH_AlgoMode_HASH HASH_ALGOMODE_HASH +#define HASH_AlgoMode_HMAC HASH_ALGOMODE_HMAC + +#define HASH_HMACKeyType_ShortKey HASH_HMAC_KEYTYPE_SHORTKEY +#define HASH_HMACKeyType_LongKey HASH_HMAC_KEYTYPE_LONGKEY + +#if defined(STM32L4) || defined(STM32L5) || defined(STM32F2) || defined(STM32F4) || defined(STM32F7) || defined(STM32H7) + +#define HAL_HASH_MD5_Accumulate HAL_HASH_MD5_Accmlt +#define HAL_HASH_MD5_Accumulate_End HAL_HASH_MD5_Accmlt_End +#define HAL_HASH_MD5_Accumulate_IT HAL_HASH_MD5_Accmlt_IT +#define HAL_HASH_MD5_Accumulate_End_IT HAL_HASH_MD5_Accmlt_End_IT + +#define HAL_HASH_SHA1_Accumulate HAL_HASH_SHA1_Accmlt +#define HAL_HASH_SHA1_Accumulate_End HAL_HASH_SHA1_Accmlt_End +#define HAL_HASH_SHA1_Accumulate_IT HAL_HASH_SHA1_Accmlt_IT +#define HAL_HASH_SHA1_Accumulate_End_IT HAL_HASH_SHA1_Accmlt_End_IT + +#define HAL_HASHEx_SHA224_Accumulate HAL_HASHEx_SHA224_Accmlt +#define HAL_HASHEx_SHA224_Accumulate_End HAL_HASHEx_SHA224_Accmlt_End +#define HAL_HASHEx_SHA224_Accumulate_IT HAL_HASHEx_SHA224_Accmlt_IT +#define HAL_HASHEx_SHA224_Accumulate_End_IT HAL_HASHEx_SHA224_Accmlt_End_IT + +#define HAL_HASHEx_SHA256_Accumulate HAL_HASHEx_SHA256_Accmlt +#define HAL_HASHEx_SHA256_Accumulate_End HAL_HASHEx_SHA256_Accmlt_End +#define HAL_HASHEx_SHA256_Accumulate_IT HAL_HASHEx_SHA256_Accmlt_IT +#define HAL_HASHEx_SHA256_Accumulate_End_IT HAL_HASHEx_SHA256_Accmlt_End_IT + +#endif /* STM32L4 || STM32L5 || STM32F2 || STM32F4 || STM32F7 || STM32H7 */ +/** + * @} + */ + +/** @defgroup HAL_Aliased_Functions HAL Generic Aliased Functions maintained for legacy purpose + * @{ + */ +#define HAL_EnableDBGSleepMode HAL_DBGMCU_EnableDBGSleepMode +#define HAL_DisableDBGSleepMode HAL_DBGMCU_DisableDBGSleepMode +#define HAL_EnableDBGStopMode HAL_DBGMCU_EnableDBGStopMode +#define HAL_DisableDBGStopMode HAL_DBGMCU_DisableDBGStopMode +#define HAL_EnableDBGStandbyMode HAL_DBGMCU_EnableDBGStandbyMode +#define HAL_DisableDBGStandbyMode HAL_DBGMCU_DisableDBGStandbyMode +#define HAL_DBG_LowPowerConfig(Periph, cmd) (((cmd\ + )==ENABLE)? HAL_DBGMCU_DBG_EnableLowPowerConfig(Periph) : \ + HAL_DBGMCU_DBG_DisableLowPowerConfig(Periph)) +#define HAL_VREFINT_OutputSelect HAL_SYSCFG_VREFINT_OutputSelect +#define HAL_Lock_Cmd(cmd) (((cmd)==ENABLE) ? HAL_SYSCFG_Enable_Lock_VREFINT() : HAL_SYSCFG_Disable_Lock_VREFINT()) +#if defined(STM32L0) +#else +#define HAL_VREFINT_Cmd(cmd) (((cmd)==ENABLE)? HAL_SYSCFG_EnableVREFINT() : HAL_SYSCFG_DisableVREFINT()) +#endif +#define HAL_ADC_EnableBuffer_Cmd(cmd) (((cmd)==ENABLE) ? HAL_ADCEx_EnableVREFINT() : HAL_ADCEx_DisableVREFINT()) +#define HAL_ADC_EnableBufferSensor_Cmd(cmd) (((cmd\ + )==ENABLE) ? HAL_ADCEx_EnableVREFINTTempSensor() : \ + HAL_ADCEx_DisableVREFINTTempSensor()) +#if defined(STM32H7A3xx) || defined(STM32H7B3xx) || defined(STM32H7B0xx) || defined(STM32H7A3xxQ) || \ + defined(STM32H7B3xxQ) || defined(STM32H7B0xxQ) +#define HAL_EnableSRDomainDBGStopMode HAL_EnableDomain3DBGStopMode +#define HAL_DisableSRDomainDBGStopMode HAL_DisableDomain3DBGStopMode +#define HAL_EnableSRDomainDBGStandbyMode HAL_EnableDomain3DBGStandbyMode +#define HAL_DisableSRDomainDBGStandbyMode HAL_DisableDomain3DBGStandbyMode +#endif /* STM32H7A3xx || STM32H7B3xx || STM32H7B0xx || STM32H7A3xxQ || STM32H7B3xxQ || STM32H7B0xxQ */ + +/** + * @} + */ + +/** @defgroup HAL_FLASH_Aliased_Functions HAL FLASH Aliased Functions maintained for legacy purpose + * @{ + */ +#define FLASH_HalfPageProgram HAL_FLASHEx_HalfPageProgram +#define FLASH_EnableRunPowerDown HAL_FLASHEx_EnableRunPowerDown +#define FLASH_DisableRunPowerDown HAL_FLASHEx_DisableRunPowerDown +#define HAL_DATA_EEPROMEx_Unlock HAL_FLASHEx_DATAEEPROM_Unlock +#define HAL_DATA_EEPROMEx_Lock HAL_FLASHEx_DATAEEPROM_Lock +#define HAL_DATA_EEPROMEx_Erase HAL_FLASHEx_DATAEEPROM_Erase +#define HAL_DATA_EEPROMEx_Program HAL_FLASHEx_DATAEEPROM_Program + +/** + * @} + */ + +/** @defgroup HAL_I2C_Aliased_Functions HAL I2C Aliased Functions maintained for legacy purpose + * @{ + */ +#define HAL_I2CEx_AnalogFilter_Config HAL_I2CEx_ConfigAnalogFilter +#define HAL_I2CEx_DigitalFilter_Config HAL_I2CEx_ConfigDigitalFilter +#define HAL_FMPI2CEx_AnalogFilter_Config HAL_FMPI2CEx_ConfigAnalogFilter +#define HAL_FMPI2CEx_DigitalFilter_Config HAL_FMPI2CEx_ConfigDigitalFilter + +#define HAL_I2CFastModePlusConfig(SYSCFG_I2CFastModePlus, cmd) (((cmd) == ENABLE)? \ + HAL_I2CEx_EnableFastModePlus(SYSCFG_I2CFastModePlus): \ + HAL_I2CEx_DisableFastModePlus(SYSCFG_I2CFastModePlus)) + +#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || \ + defined(STM32F2) || defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || \ + defined(STM32L4) || defined(STM32L5) || defined(STM32G4) || defined(STM32L1) +#define HAL_I2C_Master_Sequential_Transmit_IT HAL_I2C_Master_Seq_Transmit_IT +#define HAL_I2C_Master_Sequential_Receive_IT HAL_I2C_Master_Seq_Receive_IT +#define HAL_I2C_Slave_Sequential_Transmit_IT HAL_I2C_Slave_Seq_Transmit_IT +#define HAL_I2C_Slave_Sequential_Receive_IT HAL_I2C_Slave_Seq_Receive_IT +#endif /* STM32H7 || STM32WB || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 || + STM32L4 || STM32L5 || STM32G4 || STM32L1 */ +#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) || \ + defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4)|| defined(STM32L1) +#define HAL_I2C_Master_Sequential_Transmit_DMA HAL_I2C_Master_Seq_Transmit_DMA +#define HAL_I2C_Master_Sequential_Receive_DMA HAL_I2C_Master_Seq_Receive_DMA +#define HAL_I2C_Slave_Sequential_Transmit_DMA HAL_I2C_Slave_Seq_Transmit_DMA +#define HAL_I2C_Slave_Sequential_Receive_DMA HAL_I2C_Slave_Seq_Receive_DMA +#endif /* STM32H7 || STM32WB || STM32G0 || STM32F4 || STM32F7 || STM32L0 || STM32L4 || STM32L5 || STM32G4 || STM32L1 */ + +#if defined(STM32F4) +#define HAL_FMPI2C_Master_Sequential_Transmit_IT HAL_FMPI2C_Master_Seq_Transmit_IT +#define HAL_FMPI2C_Master_Sequential_Receive_IT HAL_FMPI2C_Master_Seq_Receive_IT +#define HAL_FMPI2C_Slave_Sequential_Transmit_IT HAL_FMPI2C_Slave_Seq_Transmit_IT +#define HAL_FMPI2C_Slave_Sequential_Receive_IT HAL_FMPI2C_Slave_Seq_Receive_IT +#define HAL_FMPI2C_Master_Sequential_Transmit_DMA HAL_FMPI2C_Master_Seq_Transmit_DMA +#define HAL_FMPI2C_Master_Sequential_Receive_DMA HAL_FMPI2C_Master_Seq_Receive_DMA +#define HAL_FMPI2C_Slave_Sequential_Transmit_DMA HAL_FMPI2C_Slave_Seq_Transmit_DMA +#define HAL_FMPI2C_Slave_Sequential_Receive_DMA HAL_FMPI2C_Slave_Seq_Receive_DMA +#endif /* STM32F4 */ +/** + * @} + */ + +/** @defgroup HAL_PWR_Aliased HAL PWR Aliased maintained for legacy purpose + * @{ + */ + +#if defined(STM32G0) +#define HAL_PWR_ConfigPVD HAL_PWREx_ConfigPVD +#define HAL_PWR_EnablePVD HAL_PWREx_EnablePVD +#define HAL_PWR_DisablePVD HAL_PWREx_DisablePVD +#define HAL_PWR_PVD_IRQHandler HAL_PWREx_PVD_IRQHandler +#endif +#define HAL_PWR_PVDConfig HAL_PWR_ConfigPVD +#define HAL_PWR_DisableBkUpReg HAL_PWREx_DisableBkUpReg +#define HAL_PWR_DisableFlashPowerDown HAL_PWREx_DisableFlashPowerDown +#define HAL_PWR_DisableVddio2Monitor HAL_PWREx_DisableVddio2Monitor +#define HAL_PWR_EnableBkUpReg HAL_PWREx_EnableBkUpReg +#define HAL_PWR_EnableFlashPowerDown HAL_PWREx_EnableFlashPowerDown +#define HAL_PWR_EnableVddio2Monitor HAL_PWREx_EnableVddio2Monitor +#define HAL_PWR_PVD_PVM_IRQHandler HAL_PWREx_PVD_PVM_IRQHandler +#define HAL_PWR_PVDLevelConfig HAL_PWR_ConfigPVD +#define HAL_PWR_Vddio2Monitor_IRQHandler HAL_PWREx_Vddio2Monitor_IRQHandler +#define HAL_PWR_Vddio2MonitorCallback HAL_PWREx_Vddio2MonitorCallback +#define HAL_PWREx_ActivateOverDrive HAL_PWREx_EnableOverDrive +#define HAL_PWREx_DeactivateOverDrive HAL_PWREx_DisableOverDrive +#define HAL_PWREx_DisableSDADCAnalog HAL_PWREx_DisableSDADC +#define HAL_PWREx_EnableSDADCAnalog HAL_PWREx_EnableSDADC +#define HAL_PWREx_PVMConfig HAL_PWREx_ConfigPVM + +#define PWR_MODE_NORMAL PWR_PVD_MODE_NORMAL +#define PWR_MODE_IT_RISING PWR_PVD_MODE_IT_RISING +#define PWR_MODE_IT_FALLING PWR_PVD_MODE_IT_FALLING +#define PWR_MODE_IT_RISING_FALLING PWR_PVD_MODE_IT_RISING_FALLING +#define PWR_MODE_EVENT_RISING PWR_PVD_MODE_EVENT_RISING +#define PWR_MODE_EVENT_FALLING PWR_PVD_MODE_EVENT_FALLING +#define PWR_MODE_EVENT_RISING_FALLING PWR_PVD_MODE_EVENT_RISING_FALLING + +#define CR_OFFSET_BB PWR_CR_OFFSET_BB +#define CSR_OFFSET_BB PWR_CSR_OFFSET_BB +#define PMODE_BIT_NUMBER VOS_BIT_NUMBER +#define CR_PMODE_BB CR_VOS_BB + +#define DBP_BitNumber DBP_BIT_NUMBER +#define PVDE_BitNumber PVDE_BIT_NUMBER +#define PMODE_BitNumber PMODE_BIT_NUMBER +#define EWUP_BitNumber EWUP_BIT_NUMBER +#define FPDS_BitNumber FPDS_BIT_NUMBER +#define ODEN_BitNumber ODEN_BIT_NUMBER +#define ODSWEN_BitNumber ODSWEN_BIT_NUMBER +#define MRLVDS_BitNumber MRLVDS_BIT_NUMBER +#define LPLVDS_BitNumber LPLVDS_BIT_NUMBER +#define BRE_BitNumber BRE_BIT_NUMBER + +#define PWR_MODE_EVT PWR_PVD_MODE_NORMAL + +#if defined (STM32U5) +#define PWR_SRAM1_PAGE1_STOP_RETENTION PWR_SRAM1_PAGE1_STOP +#define PWR_SRAM1_PAGE2_STOP_RETENTION PWR_SRAM1_PAGE2_STOP +#define PWR_SRAM1_PAGE3_STOP_RETENTION PWR_SRAM1_PAGE3_STOP +#define PWR_SRAM1_PAGE4_STOP_RETENTION PWR_SRAM1_PAGE4_STOP +#define PWR_SRAM1_PAGE5_STOP_RETENTION PWR_SRAM1_PAGE5_STOP +#define PWR_SRAM1_PAGE6_STOP_RETENTION PWR_SRAM1_PAGE6_STOP +#define PWR_SRAM1_PAGE7_STOP_RETENTION PWR_SRAM1_PAGE7_STOP +#define PWR_SRAM1_PAGE8_STOP_RETENTION PWR_SRAM1_PAGE8_STOP +#define PWR_SRAM1_PAGE9_STOP_RETENTION PWR_SRAM1_PAGE9_STOP +#define PWR_SRAM1_PAGE10_STOP_RETENTION PWR_SRAM1_PAGE10_STOP +#define PWR_SRAM1_PAGE11_STOP_RETENTION PWR_SRAM1_PAGE11_STOP +#define PWR_SRAM1_PAGE12_STOP_RETENTION PWR_SRAM1_PAGE12_STOP +#define PWR_SRAM1_FULL_STOP_RETENTION PWR_SRAM1_FULL_STOP + +#define PWR_SRAM2_PAGE1_STOP_RETENTION PWR_SRAM2_PAGE1_STOP +#define PWR_SRAM2_PAGE2_STOP_RETENTION PWR_SRAM2_PAGE2_STOP +#define PWR_SRAM2_FULL_STOP_RETENTION PWR_SRAM2_FULL_STOP + +#define PWR_SRAM3_PAGE1_STOP_RETENTION PWR_SRAM3_PAGE1_STOP +#define PWR_SRAM3_PAGE2_STOP_RETENTION PWR_SRAM3_PAGE2_STOP +#define PWR_SRAM3_PAGE3_STOP_RETENTION PWR_SRAM3_PAGE3_STOP +#define PWR_SRAM3_PAGE4_STOP_RETENTION PWR_SRAM3_PAGE4_STOP +#define PWR_SRAM3_PAGE5_STOP_RETENTION PWR_SRAM3_PAGE5_STOP +#define PWR_SRAM3_PAGE6_STOP_RETENTION PWR_SRAM3_PAGE6_STOP +#define PWR_SRAM3_PAGE7_STOP_RETENTION PWR_SRAM3_PAGE7_STOP +#define PWR_SRAM3_PAGE8_STOP_RETENTION PWR_SRAM3_PAGE8_STOP +#define PWR_SRAM3_PAGE9_STOP_RETENTION PWR_SRAM3_PAGE9_STOP +#define PWR_SRAM3_PAGE10_STOP_RETENTION PWR_SRAM3_PAGE10_STOP +#define PWR_SRAM3_PAGE11_STOP_RETENTION PWR_SRAM3_PAGE11_STOP +#define PWR_SRAM3_PAGE12_STOP_RETENTION PWR_SRAM3_PAGE12_STOP +#define PWR_SRAM3_PAGE13_STOP_RETENTION PWR_SRAM3_PAGE13_STOP +#define PWR_SRAM3_FULL_STOP_RETENTION PWR_SRAM3_FULL_STOP + +#define PWR_SRAM4_FULL_STOP_RETENTION PWR_SRAM4_FULL_STOP + +#define PWR_SRAM5_PAGE1_STOP_RETENTION PWR_SRAM5_PAGE1_STOP +#define PWR_SRAM5_PAGE2_STOP_RETENTION PWR_SRAM5_PAGE2_STOP +#define PWR_SRAM5_PAGE3_STOP_RETENTION PWR_SRAM5_PAGE3_STOP +#define PWR_SRAM5_PAGE4_STOP_RETENTION PWR_SRAM5_PAGE4_STOP +#define PWR_SRAM5_PAGE5_STOP_RETENTION PWR_SRAM5_PAGE5_STOP +#define PWR_SRAM5_PAGE6_STOP_RETENTION PWR_SRAM5_PAGE6_STOP +#define PWR_SRAM5_PAGE7_STOP_RETENTION PWR_SRAM5_PAGE7_STOP +#define PWR_SRAM5_PAGE8_STOP_RETENTION PWR_SRAM5_PAGE8_STOP +#define PWR_SRAM5_PAGE9_STOP_RETENTION PWR_SRAM5_PAGE9_STOP +#define PWR_SRAM5_PAGE10_STOP_RETENTION PWR_SRAM5_PAGE10_STOP +#define PWR_SRAM5_PAGE11_STOP_RETENTION PWR_SRAM5_PAGE11_STOP +#define PWR_SRAM5_PAGE12_STOP_RETENTION PWR_SRAM5_PAGE12_STOP +#define PWR_SRAM5_PAGE13_STOP_RETENTION PWR_SRAM5_PAGE13_STOP +#define PWR_SRAM5_FULL_STOP_RETENTION PWR_SRAM5_FULL_STOP + +#define PWR_SRAM6_PAGE1_STOP_RETENTION PWR_SRAM6_PAGE1_STOP +#define PWR_SRAM6_PAGE2_STOP_RETENTION PWR_SRAM6_PAGE2_STOP +#define PWR_SRAM6_PAGE3_STOP_RETENTION PWR_SRAM6_PAGE3_STOP +#define PWR_SRAM6_PAGE4_STOP_RETENTION PWR_SRAM6_PAGE4_STOP +#define PWR_SRAM6_PAGE5_STOP_RETENTION PWR_SRAM6_PAGE5_STOP +#define PWR_SRAM6_PAGE6_STOP_RETENTION PWR_SRAM6_PAGE6_STOP +#define PWR_SRAM6_PAGE7_STOP_RETENTION PWR_SRAM6_PAGE7_STOP +#define PWR_SRAM6_PAGE8_STOP_RETENTION PWR_SRAM6_PAGE8_STOP +#define PWR_SRAM6_FULL_STOP_RETENTION PWR_SRAM6_FULL_STOP + + +#define PWR_ICACHE_FULL_STOP_RETENTION PWR_ICACHE_FULL_STOP +#define PWR_DCACHE1_FULL_STOP_RETENTION PWR_DCACHE1_FULL_STOP +#define PWR_DCACHE2_FULL_STOP_RETENTION PWR_DCACHE2_FULL_STOP +#define PWR_DMA2DRAM_FULL_STOP_RETENTION PWR_DMA2DRAM_FULL_STOP +#define PWR_PERIPHRAM_FULL_STOP_RETENTION PWR_PERIPHRAM_FULL_STOP +#define PWR_PKA32RAM_FULL_STOP_RETENTION PWR_PKA32RAM_FULL_STOP +#define PWR_GRAPHICPRAM_FULL_STOP_RETENTION PWR_GRAPHICPRAM_FULL_STOP +#define PWR_DSIRAM_FULL_STOP_RETENTION PWR_DSIRAM_FULL_STOP +#define PWR_JPEGRAM_FULL_STOP_RETENTION PWR_JPEGRAM_FULL_STOP + + +#define PWR_SRAM2_PAGE1_STANDBY_RETENTION PWR_SRAM2_PAGE1_STANDBY +#define PWR_SRAM2_PAGE2_STANDBY_RETENTION PWR_SRAM2_PAGE2_STANDBY +#define PWR_SRAM2_FULL_STANDBY_RETENTION PWR_SRAM2_FULL_STANDBY + +#define PWR_SRAM1_FULL_RUN_RETENTION PWR_SRAM1_FULL_RUN +#define PWR_SRAM2_FULL_RUN_RETENTION PWR_SRAM2_FULL_RUN +#define PWR_SRAM3_FULL_RUN_RETENTION PWR_SRAM3_FULL_RUN +#define PWR_SRAM4_FULL_RUN_RETENTION PWR_SRAM4_FULL_RUN +#define PWR_SRAM5_FULL_RUN_RETENTION PWR_SRAM5_FULL_RUN +#define PWR_SRAM6_FULL_RUN_RETENTION PWR_SRAM6_FULL_RUN + +#define PWR_ALL_RAM_RUN_RETENTION_MASK PWR_ALL_RAM_RUN_MASK +#endif + +/** + * @} + */ + +/** @defgroup HAL_RTC_Aliased_Functions HAL RTC Aliased Functions maintained for legacy purpose + * @{ + */ +#if defined(STM32H5) || defined(STM32WBA) || defined(STM32H7RS) || defined(STM32N6) +#define HAL_RTCEx_SetBoothardwareKey HAL_RTCEx_LockBootHardwareKey +#define HAL_RTCEx_BKUPBlock_Enable HAL_RTCEx_BKUPBlock +#define HAL_RTCEx_BKUPBlock_Disable HAL_RTCEx_BKUPUnblock +#define HAL_RTCEx_Erase_SecretDev_Conf HAL_RTCEx_ConfigEraseDeviceSecrets +#endif /* STM32H5 || STM32WBA || STM32H7RS || STM32N6 */ + +/** + * @} + */ + +/** @defgroup HAL_SMBUS_Aliased_Functions HAL SMBUS Aliased Functions maintained for legacy purpose + * @{ + */ +#define HAL_SMBUS_Slave_Listen_IT HAL_SMBUS_EnableListen_IT +#define HAL_SMBUS_SlaveAddrCallback HAL_SMBUS_AddrCallback +#define HAL_SMBUS_SlaveListenCpltCallback HAL_SMBUS_ListenCpltCallback +/** + * @} + */ + +/** @defgroup HAL_SPI_Aliased_Functions HAL SPI Aliased Functions maintained for legacy purpose + * @{ + */ +#define HAL_SPI_FlushRxFifo HAL_SPIEx_FlushRxFifo +/** + * @} + */ + +/** @defgroup HAL_TIM_Aliased_Functions HAL TIM Aliased Functions maintained for legacy purpose + * @{ + */ +#define HAL_TIM_DMADelayPulseCplt TIM_DMADelayPulseCplt +#define HAL_TIM_DMAError TIM_DMAError +#define HAL_TIM_DMACaptureCplt TIM_DMACaptureCplt +#define HAL_TIMEx_DMACommutationCplt TIMEx_DMACommutationCplt +#if defined(STM32H7) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || \ + defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) +#define HAL_TIM_SlaveConfigSynchronization HAL_TIM_SlaveConfigSynchro +#define HAL_TIM_SlaveConfigSynchronization_IT HAL_TIM_SlaveConfigSynchro_IT +#define HAL_TIMEx_CommutationCallback HAL_TIMEx_CommutCallback +#define HAL_TIMEx_ConfigCommutationEvent HAL_TIMEx_ConfigCommutEvent +#define HAL_TIMEx_ConfigCommutationEvent_IT HAL_TIMEx_ConfigCommutEvent_IT +#define HAL_TIMEx_ConfigCommutationEvent_DMA HAL_TIMEx_ConfigCommutEvent_DMA +#endif /* STM32H7 || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 */ +/** + * @} + */ + +/** @defgroup HAL_UART_Aliased_Functions HAL UART Aliased Functions maintained for legacy purpose + * @{ + */ +#define HAL_UART_WakeupCallback HAL_UARTEx_WakeupCallback +/** + * @} + */ + +/** @defgroup HAL_LTDC_Aliased_Functions HAL LTDC Aliased Functions maintained for legacy purpose + * @{ + */ +#define HAL_LTDC_LineEvenCallback HAL_LTDC_LineEventCallback +#define HAL_LTDC_Relaod HAL_LTDC_Reload +#define HAL_LTDC_StructInitFromVideoConfig HAL_LTDCEx_StructInitFromVideoConfig +#define HAL_LTDC_StructInitFromAdaptedCommandConfig HAL_LTDCEx_StructInitFromAdaptedCommandConfig +/** + * @} + */ + + +/** @defgroup HAL_PPP_Aliased_Functions HAL PPP Aliased Functions maintained for legacy purpose + * @{ + */ + +/** + * @} + */ + +/* Exported macros ------------------------------------------------------------*/ + +/** @defgroup HAL_AES_Aliased_Macros HAL CRYP Aliased Macros maintained for legacy purpose + * @{ + */ +#define AES_IT_CC CRYP_IT_CC +#define AES_IT_ERR CRYP_IT_ERR +#define AES_FLAG_CCF CRYP_FLAG_CCF +/** + * @} + */ + +/** @defgroup HAL_Aliased_Macros HAL Generic Aliased Macros maintained for legacy purpose + * @{ + */ +#define __HAL_GET_BOOT_MODE __HAL_SYSCFG_GET_BOOT_MODE +#define __HAL_REMAPMEMORY_FLASH __HAL_SYSCFG_REMAPMEMORY_FLASH +#define __HAL_REMAPMEMORY_SYSTEMFLASH __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH +#define __HAL_REMAPMEMORY_SRAM __HAL_SYSCFG_REMAPMEMORY_SRAM +#define __HAL_REMAPMEMORY_FMC __HAL_SYSCFG_REMAPMEMORY_FMC +#define __HAL_REMAPMEMORY_FMC_SDRAM __HAL_SYSCFG_REMAPMEMORY_FMC_SDRAM +#define __HAL_REMAPMEMORY_FSMC __HAL_SYSCFG_REMAPMEMORY_FSMC +#define __HAL_REMAPMEMORY_QUADSPI __HAL_SYSCFG_REMAPMEMORY_QUADSPI +#define __HAL_FMC_BANK __HAL_SYSCFG_FMC_BANK +#define __HAL_GET_FLAG __HAL_SYSCFG_GET_FLAG +#define __HAL_CLEAR_FLAG __HAL_SYSCFG_CLEAR_FLAG +#define __HAL_VREFINT_OUT_ENABLE __HAL_SYSCFG_VREFINT_OUT_ENABLE +#define __HAL_VREFINT_OUT_DISABLE __HAL_SYSCFG_VREFINT_OUT_DISABLE +#define __HAL_SYSCFG_SRAM2_WRP_ENABLE __HAL_SYSCFG_SRAM2_WRP_0_31_ENABLE + +#define SYSCFG_FLAG_VREF_READY SYSCFG_FLAG_VREFINT_READY +#define SYSCFG_FLAG_RC48 RCC_FLAG_HSI48 +#define IS_SYSCFG_FASTMODEPLUS_CONFIG IS_I2C_FASTMODEPLUS +#define UFB_MODE_BitNumber UFB_MODE_BIT_NUMBER +#define CMP_PD_BitNumber CMP_PD_BIT_NUMBER + +/** + * @} + */ + + +/** @defgroup HAL_ADC_Aliased_Macros HAL ADC Aliased Macros maintained for legacy purpose + * @{ + */ +#define __ADC_ENABLE __HAL_ADC_ENABLE +#define __ADC_DISABLE __HAL_ADC_DISABLE +#define __HAL_ADC_ENABLING_CONDITIONS ADC_ENABLING_CONDITIONS +#define __HAL_ADC_DISABLING_CONDITIONS ADC_DISABLING_CONDITIONS +#define __HAL_ADC_IS_ENABLED ADC_IS_ENABLE +#define __ADC_IS_ENABLED ADC_IS_ENABLE +#define __HAL_ADC_IS_SOFTWARE_START_REGULAR ADC_IS_SOFTWARE_START_REGULAR +#define __HAL_ADC_IS_SOFTWARE_START_INJECTED ADC_IS_SOFTWARE_START_INJECTED +#define __HAL_ADC_IS_CONVERSION_ONGOING_REGULAR_INJECTED ADC_IS_CONVERSION_ONGOING_REGULAR_INJECTED +#define __HAL_ADC_IS_CONVERSION_ONGOING_REGULAR ADC_IS_CONVERSION_ONGOING_REGULAR +#define __HAL_ADC_IS_CONVERSION_ONGOING_INJECTED ADC_IS_CONVERSION_ONGOING_INJECTED +#define __HAL_ADC_IS_CONVERSION_ONGOING ADC_IS_CONVERSION_ONGOING +#define __HAL_ADC_CLEAR_ERRORCODE ADC_CLEAR_ERRORCODE + +#define __HAL_ADC_GET_RESOLUTION ADC_GET_RESOLUTION +#define __HAL_ADC_JSQR_RK ADC_JSQR_RK +#define __HAL_ADC_CFGR_AWD1CH ADC_CFGR_AWD1CH_SHIFT +#define __HAL_ADC_CFGR_AWD23CR ADC_CFGR_AWD23CR +#define __HAL_ADC_CFGR_INJECT_AUTO_CONVERSION ADC_CFGR_INJECT_AUTO_CONVERSION +#define __HAL_ADC_CFGR_INJECT_CONTEXT_QUEUE ADC_CFGR_INJECT_CONTEXT_QUEUE +#define __HAL_ADC_CFGR_INJECT_DISCCONTINUOUS ADC_CFGR_INJECT_DISCCONTINUOUS +#define __HAL_ADC_CFGR_REG_DISCCONTINUOUS ADC_CFGR_REG_DISCCONTINUOUS +#define __HAL_ADC_CFGR_DISCONTINUOUS_NUM ADC_CFGR_DISCONTINUOUS_NUM +#define __HAL_ADC_CFGR_AUTOWAIT ADC_CFGR_AUTOWAIT +#define __HAL_ADC_CFGR_CONTINUOUS ADC_CFGR_CONTINUOUS +#define __HAL_ADC_CFGR_OVERRUN ADC_CFGR_OVERRUN +#define __HAL_ADC_CFGR_DMACONTREQ ADC_CFGR_DMACONTREQ +#define __HAL_ADC_CFGR_EXTSEL ADC_CFGR_EXTSEL_SET +#define __HAL_ADC_JSQR_JEXTSEL ADC_JSQR_JEXTSEL_SET +#define __HAL_ADC_OFR_CHANNEL ADC_OFR_CHANNEL +#define __HAL_ADC_DIFSEL_CHANNEL ADC_DIFSEL_CHANNEL +#define __HAL_ADC_CALFACT_DIFF_SET ADC_CALFACT_DIFF_SET +#define __HAL_ADC_CALFACT_DIFF_GET ADC_CALFACT_DIFF_GET +#define __HAL_ADC_TRX_HIGHTHRESHOLD ADC_TRX_HIGHTHRESHOLD + +#define __HAL_ADC_OFFSET_SHIFT_RESOLUTION ADC_OFFSET_SHIFT_RESOLUTION +#define __HAL_ADC_AWD1THRESHOLD_SHIFT_RESOLUTION ADC_AWD1THRESHOLD_SHIFT_RESOLUTION +#define __HAL_ADC_AWD23THRESHOLD_SHIFT_RESOLUTION ADC_AWD23THRESHOLD_SHIFT_RESOLUTION +#define __HAL_ADC_COMMON_REGISTER ADC_COMMON_REGISTER +#define __HAL_ADC_COMMON_CCR_MULTI ADC_COMMON_CCR_MULTI +#define __HAL_ADC_MULTIMODE_IS_ENABLED ADC_MULTIMODE_IS_ENABLE +#define __ADC_MULTIMODE_IS_ENABLED ADC_MULTIMODE_IS_ENABLE +#define __HAL_ADC_NONMULTIMODE_OR_MULTIMODEMASTER ADC_NONMULTIMODE_OR_MULTIMODEMASTER +#define __HAL_ADC_COMMON_ADC_OTHER ADC_COMMON_ADC_OTHER +#define __HAL_ADC_MULTI_SLAVE ADC_MULTI_SLAVE + +#define __HAL_ADC_SQR1_L ADC_SQR1_L_SHIFT +#define __HAL_ADC_JSQR_JL ADC_JSQR_JL_SHIFT +#define __HAL_ADC_JSQR_RK_JL ADC_JSQR_RK_JL +#define __HAL_ADC_CR1_DISCONTINUOUS_NUM ADC_CR1_DISCONTINUOUS_NUM +#define __HAL_ADC_CR1_SCAN ADC_CR1_SCAN_SET +#define __HAL_ADC_CONVCYCLES_MAX_RANGE ADC_CONVCYCLES_MAX_RANGE +#define __HAL_ADC_CLOCK_PRESCALER_RANGE ADC_CLOCK_PRESCALER_RANGE +#define __HAL_ADC_GET_CLOCK_PRESCALER ADC_GET_CLOCK_PRESCALER + +#define __HAL_ADC_SQR1 ADC_SQR1 +#define __HAL_ADC_SMPR1 ADC_SMPR1 +#define __HAL_ADC_SMPR2 ADC_SMPR2 +#define __HAL_ADC_SQR3_RK ADC_SQR3_RK +#define __HAL_ADC_SQR2_RK ADC_SQR2_RK +#define __HAL_ADC_SQR1_RK ADC_SQR1_RK +#define __HAL_ADC_CR2_CONTINUOUS ADC_CR2_CONTINUOUS +#define __HAL_ADC_CR1_DISCONTINUOUS ADC_CR1_DISCONTINUOUS +#define __HAL_ADC_CR1_SCANCONV ADC_CR1_SCANCONV +#define __HAL_ADC_CR2_EOCSelection ADC_CR2_EOCSelection +#define __HAL_ADC_CR2_DMAContReq ADC_CR2_DMAContReq +#define __HAL_ADC_JSQR ADC_JSQR + +#define __HAL_ADC_CHSELR_CHANNEL ADC_CHSELR_CHANNEL +#define __HAL_ADC_CFGR1_REG_DISCCONTINUOUS ADC_CFGR1_REG_DISCCONTINUOUS +#define __HAL_ADC_CFGR1_AUTOOFF ADC_CFGR1_AUTOOFF +#define __HAL_ADC_CFGR1_AUTOWAIT ADC_CFGR1_AUTOWAIT +#define __HAL_ADC_CFGR1_CONTINUOUS ADC_CFGR1_CONTINUOUS +#define __HAL_ADC_CFGR1_OVERRUN ADC_CFGR1_OVERRUN +#define __HAL_ADC_CFGR1_SCANDIR ADC_CFGR1_SCANDIR +#define __HAL_ADC_CFGR1_DMACONTREQ ADC_CFGR1_DMACONTREQ + +/** + * @} + */ + +/** @defgroup HAL_DAC_Aliased_Macros HAL DAC Aliased Macros maintained for legacy purpose + * @{ + */ +#define __HAL_DHR12R1_ALIGNEMENT DAC_DHR12R1_ALIGNMENT +#define __HAL_DHR12R2_ALIGNEMENT DAC_DHR12R2_ALIGNMENT +#define __HAL_DHR12RD_ALIGNEMENT DAC_DHR12RD_ALIGNMENT +#define IS_DAC_GENERATE_WAVE IS_DAC_WAVE + +/** + * @} + */ + +/** @defgroup HAL_DBGMCU_Aliased_Macros HAL DBGMCU Aliased Macros maintained for legacy purpose + * @{ + */ +#define __HAL_FREEZE_TIM1_DBGMCU __HAL_DBGMCU_FREEZE_TIM1 +#define __HAL_UNFREEZE_TIM1_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM1 +#define __HAL_FREEZE_TIM2_DBGMCU __HAL_DBGMCU_FREEZE_TIM2 +#define __HAL_UNFREEZE_TIM2_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM2 +#define __HAL_FREEZE_TIM3_DBGMCU __HAL_DBGMCU_FREEZE_TIM3 +#define __HAL_UNFREEZE_TIM3_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM3 +#define __HAL_FREEZE_TIM4_DBGMCU __HAL_DBGMCU_FREEZE_TIM4 +#define __HAL_UNFREEZE_TIM4_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM4 +#define __HAL_FREEZE_TIM5_DBGMCU __HAL_DBGMCU_FREEZE_TIM5 +#define __HAL_UNFREEZE_TIM5_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM5 +#define __HAL_FREEZE_TIM6_DBGMCU __HAL_DBGMCU_FREEZE_TIM6 +#define __HAL_UNFREEZE_TIM6_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM6 +#define __HAL_FREEZE_TIM7_DBGMCU __HAL_DBGMCU_FREEZE_TIM7 +#define __HAL_UNFREEZE_TIM7_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM7 +#define __HAL_FREEZE_TIM8_DBGMCU __HAL_DBGMCU_FREEZE_TIM8 +#define __HAL_UNFREEZE_TIM8_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM8 + +#define __HAL_FREEZE_TIM9_DBGMCU __HAL_DBGMCU_FREEZE_TIM9 +#define __HAL_UNFREEZE_TIM9_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM9 +#define __HAL_FREEZE_TIM10_DBGMCU __HAL_DBGMCU_FREEZE_TIM10 +#define __HAL_UNFREEZE_TIM10_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM10 +#define __HAL_FREEZE_TIM11_DBGMCU __HAL_DBGMCU_FREEZE_TIM11 +#define __HAL_UNFREEZE_TIM11_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM11 +#define __HAL_FREEZE_TIM12_DBGMCU __HAL_DBGMCU_FREEZE_TIM12 +#define __HAL_UNFREEZE_TIM12_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM12 +#define __HAL_FREEZE_TIM13_DBGMCU __HAL_DBGMCU_FREEZE_TIM13 +#define __HAL_UNFREEZE_TIM13_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM13 +#define __HAL_FREEZE_TIM14_DBGMCU __HAL_DBGMCU_FREEZE_TIM14 +#define __HAL_UNFREEZE_TIM14_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM14 +#define __HAL_FREEZE_CAN2_DBGMCU __HAL_DBGMCU_FREEZE_CAN2 +#define __HAL_UNFREEZE_CAN2_DBGMCU __HAL_DBGMCU_UNFREEZE_CAN2 + + +#define __HAL_FREEZE_TIM15_DBGMCU __HAL_DBGMCU_FREEZE_TIM15 +#define __HAL_UNFREEZE_TIM15_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM15 +#define __HAL_FREEZE_TIM16_DBGMCU __HAL_DBGMCU_FREEZE_TIM16 +#define __HAL_UNFREEZE_TIM16_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM16 +#define __HAL_FREEZE_TIM17_DBGMCU __HAL_DBGMCU_FREEZE_TIM17 +#define __HAL_UNFREEZE_TIM17_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM17 +#define __HAL_FREEZE_RTC_DBGMCU __HAL_DBGMCU_FREEZE_RTC +#define __HAL_UNFREEZE_RTC_DBGMCU __HAL_DBGMCU_UNFREEZE_RTC +#if defined(STM32H7) +#define __HAL_FREEZE_WWDG_DBGMCU __HAL_DBGMCU_FREEZE_WWDG1 +#define __HAL_UNFREEZE_WWDG_DBGMCU __HAL_DBGMCU_UnFreeze_WWDG1 +#define __HAL_FREEZE_IWDG_DBGMCU __HAL_DBGMCU_FREEZE_IWDG1 +#define __HAL_UNFREEZE_IWDG_DBGMCU __HAL_DBGMCU_UnFreeze_IWDG1 +#else +#define __HAL_FREEZE_WWDG_DBGMCU __HAL_DBGMCU_FREEZE_WWDG +#define __HAL_UNFREEZE_WWDG_DBGMCU __HAL_DBGMCU_UNFREEZE_WWDG +#define __HAL_FREEZE_IWDG_DBGMCU __HAL_DBGMCU_FREEZE_IWDG +#define __HAL_UNFREEZE_IWDG_DBGMCU __HAL_DBGMCU_UNFREEZE_IWDG +#endif /* STM32H7 */ +#define __HAL_FREEZE_I2C1_TIMEOUT_DBGMCU __HAL_DBGMCU_FREEZE_I2C1_TIMEOUT +#define __HAL_UNFREEZE_I2C1_TIMEOUT_DBGMCU __HAL_DBGMCU_UNFREEZE_I2C1_TIMEOUT +#define __HAL_FREEZE_I2C2_TIMEOUT_DBGMCU __HAL_DBGMCU_FREEZE_I2C2_TIMEOUT +#define __HAL_UNFREEZE_I2C2_TIMEOUT_DBGMCU __HAL_DBGMCU_UNFREEZE_I2C2_TIMEOUT +#define __HAL_FREEZE_I2C3_TIMEOUT_DBGMCU __HAL_DBGMCU_FREEZE_I2C3_TIMEOUT +#define __HAL_UNFREEZE_I2C3_TIMEOUT_DBGMCU __HAL_DBGMCU_UNFREEZE_I2C3_TIMEOUT +#define __HAL_FREEZE_CAN1_DBGMCU __HAL_DBGMCU_FREEZE_CAN1 +#define __HAL_UNFREEZE_CAN1_DBGMCU __HAL_DBGMCU_UNFREEZE_CAN1 +#define __HAL_FREEZE_LPTIM1_DBGMCU __HAL_DBGMCU_FREEZE_LPTIM1 +#define __HAL_UNFREEZE_LPTIM1_DBGMCU __HAL_DBGMCU_UNFREEZE_LPTIM1 +#define __HAL_FREEZE_LPTIM2_DBGMCU __HAL_DBGMCU_FREEZE_LPTIM2 +#define __HAL_UNFREEZE_LPTIM2_DBGMCU __HAL_DBGMCU_UNFREEZE_LPTIM2 + +/** + * @} + */ + +/** @defgroup HAL_COMP_Aliased_Macros HAL COMP Aliased Macros maintained for legacy purpose + * @{ + */ +#if defined(STM32F3) +#define COMP_START __HAL_COMP_ENABLE +#define COMP_STOP __HAL_COMP_DISABLE +#define COMP_LOCK __HAL_COMP_LOCK + +#if defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) || defined(STM32F303x8) || \ + defined(STM32F334x8) || defined(STM32F328xx) +#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_RISING_EDGE() : \ + __HAL_COMP_COMP6_EXTI_ENABLE_RISING_EDGE()) +#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_RISING_EDGE() : \ + __HAL_COMP_COMP6_EXTI_DISABLE_RISING_EDGE()) +#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_FALLING_EDGE() : \ + __HAL_COMP_COMP6_EXTI_ENABLE_FALLING_EDGE()) +#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_FALLING_EDGE() : \ + __HAL_COMP_COMP6_EXTI_DISABLE_FALLING_EDGE()) +#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_IT() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_IT() : \ + __HAL_COMP_COMP6_EXTI_ENABLE_IT()) +#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_IT() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_IT() : \ + __HAL_COMP_COMP6_EXTI_DISABLE_IT()) +#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_GET_FLAG() : \ + ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_GET_FLAG() : \ + __HAL_COMP_COMP6_EXTI_GET_FLAG()) +#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_CLEAR_FLAG() : \ + ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_CLEAR_FLAG() : \ + __HAL_COMP_COMP6_EXTI_CLEAR_FLAG()) +#endif +#if defined(STM32F302xE) || defined(STM32F302xC) +#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_RISING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_RISING_EDGE() : \ + __HAL_COMP_COMP6_EXTI_ENABLE_RISING_EDGE()) +#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_RISING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_RISING_EDGE() : \ + __HAL_COMP_COMP6_EXTI_DISABLE_RISING_EDGE()) +#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_FALLING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_FALLING_EDGE() : \ + __HAL_COMP_COMP6_EXTI_ENABLE_FALLING_EDGE()) +#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_FALLING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_FALLING_EDGE() : \ + __HAL_COMP_COMP6_EXTI_DISABLE_FALLING_EDGE()) +#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_IT() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_IT() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_IT() : \ + __HAL_COMP_COMP6_EXTI_ENABLE_IT()) +#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_IT() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_IT() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_IT() : \ + __HAL_COMP_COMP6_EXTI_DISABLE_IT()) +#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_GET_FLAG() : \ + ((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_GET_FLAG() : \ + ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_GET_FLAG() : \ + __HAL_COMP_COMP6_EXTI_GET_FLAG()) +#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_CLEAR_FLAG() : \ + ((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_CLEAR_FLAG() : \ + ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_CLEAR_FLAG() : \ + __HAL_COMP_COMP6_EXTI_CLEAR_FLAG()) +#endif +#if defined(STM32F303xE) || defined(STM32F398xx) || defined(STM32F303xC) || defined(STM32F358xx) +#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_RISING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_ENABLE_RISING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_RISING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_ENABLE_RISING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_ENABLE_RISING_EDGE() : \ + __HAL_COMP_COMP7_EXTI_ENABLE_RISING_EDGE()) +#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_RISING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_DISABLE_RISING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_RISING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_DISABLE_RISING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_DISABLE_RISING_EDGE() : \ + __HAL_COMP_COMP7_EXTI_DISABLE_RISING_EDGE()) +#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_FALLING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_ENABLE_FALLING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_FALLING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_ENABLE_FALLING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_ENABLE_FALLING_EDGE() : \ + __HAL_COMP_COMP7_EXTI_ENABLE_FALLING_EDGE()) +#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_FALLING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_DISABLE_FALLING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_FALLING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_DISABLE_FALLING_EDGE() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_DISABLE_FALLING_EDGE() : \ + __HAL_COMP_COMP7_EXTI_DISABLE_FALLING_EDGE()) +#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_IT() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_IT() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_ENABLE_IT() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_IT() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_ENABLE_IT() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_ENABLE_IT() : \ + __HAL_COMP_COMP7_EXTI_ENABLE_IT()) +#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_IT() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_IT() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_DISABLE_IT() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_IT() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_DISABLE_IT() : \ + ((__EXTILINE__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_DISABLE_IT() : \ + __HAL_COMP_COMP7_EXTI_DISABLE_IT()) +#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_GET_FLAG() : \ + ((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_GET_FLAG() : \ + ((__FLAG__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_GET_FLAG() : \ + ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_GET_FLAG() : \ + ((__FLAG__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_GET_FLAG() : \ + ((__FLAG__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_GET_FLAG() : \ + __HAL_COMP_COMP7_EXTI_GET_FLAG()) +#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_CLEAR_FLAG() : \ + ((__FLAG__) == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_CLEAR_FLAG() : \ + ((__FLAG__) == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_CLEAR_FLAG() : \ + ((__FLAG__) == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_CLEAR_FLAG() : \ + ((__FLAG__) == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_CLEAR_FLAG() : \ + ((__FLAG__) == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_CLEAR_FLAG() : \ + __HAL_COMP_COMP7_EXTI_CLEAR_FLAG()) +#endif +#if defined(STM32F373xC) ||defined(STM32F378xx) +#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_RISING_EDGE() : \ + __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE()) +#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_RISING_EDGE() : \ + __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE()) +#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_FALLING_EDGE() : \ + __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE()) +#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_FALLING_EDGE() : \ + __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE()) +#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_IT() : \ + __HAL_COMP_COMP2_EXTI_ENABLE_IT()) +#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_IT() : \ + __HAL_COMP_COMP2_EXTI_DISABLE_IT()) +#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_GET_FLAG() : \ + __HAL_COMP_COMP2_EXTI_GET_FLAG()) +#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_CLEAR_FLAG() : \ + __HAL_COMP_COMP2_EXTI_CLEAR_FLAG()) +#endif +#else +#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_RISING_EDGE() : \ + __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE()) +#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_RISING_EDGE() : \ + __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE()) +#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_FALLING_EDGE() : \ + __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE()) +#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_FALLING_EDGE() : \ + __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE()) +#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_IT() : \ + __HAL_COMP_COMP2_EXTI_ENABLE_IT()) +#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__) (((__EXTILINE__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_IT() : \ + __HAL_COMP_COMP2_EXTI_DISABLE_IT()) +#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_GET_FLAG() : \ + __HAL_COMP_COMP2_EXTI_GET_FLAG()) +#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__) (((__FLAG__) == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_CLEAR_FLAG() : \ + __HAL_COMP_COMP2_EXTI_CLEAR_FLAG()) +#endif + +#define __HAL_COMP_GET_EXTI_LINE COMP_GET_EXTI_LINE + +#if defined(STM32L0) || defined(STM32L4) +/* Note: On these STM32 families, the only argument of this macro */ +/* is COMP_FLAG_LOCK. */ +/* This macro is replaced by __HAL_COMP_IS_LOCKED with only HAL handle */ +/* argument. */ +#define __HAL_COMP_GET_FLAG(__HANDLE__, __FLAG__) (__HAL_COMP_IS_LOCKED(__HANDLE__)) +#endif +/** + * @} + */ + +#if defined(STM32L0) || defined(STM32L4) +/** @defgroup HAL_COMP_Aliased_Functions HAL COMP Aliased Functions maintained for legacy purpose + * @{ + */ +#define HAL_COMP_Start_IT HAL_COMP_Start /* Function considered as legacy as EXTI event or IT configuration is + done into HAL_COMP_Init() */ +#define HAL_COMP_Stop_IT HAL_COMP_Stop /* Function considered as legacy as EXTI event or IT configuration is + done into HAL_COMP_Init() */ +/** + * @} + */ +#endif + +/** @defgroup HAL_DAC_Aliased_Macros HAL DAC Aliased Macros maintained for legacy purpose + * @{ + */ + +#define IS_DAC_WAVE(WAVE) (((WAVE) == DAC_WAVE_NONE) || \ + ((WAVE) == DAC_WAVE_NOISE)|| \ + ((WAVE) == DAC_WAVE_TRIANGLE)) + +/** + * @} + */ + +/** @defgroup HAL_FLASH_Aliased_Macros HAL FLASH Aliased Macros maintained for legacy purpose + * @{ + */ + +#define IS_WRPAREA IS_OB_WRPAREA +#define IS_TYPEPROGRAM IS_FLASH_TYPEPROGRAM +#define IS_TYPEPROGRAMFLASH IS_FLASH_TYPEPROGRAM +#define IS_TYPEERASE IS_FLASH_TYPEERASE +#define IS_NBSECTORS IS_FLASH_NBSECTORS +#define IS_OB_WDG_SOURCE IS_OB_IWDG_SOURCE + +/** + * @} + */ + +/** @defgroup HAL_I2C_Aliased_Macros HAL I2C Aliased Macros maintained for legacy purpose + * @{ + */ + +#define __HAL_I2C_RESET_CR2 I2C_RESET_CR2 +#define __HAL_I2C_GENERATE_START I2C_GENERATE_START +#if defined(STM32F1) +#define __HAL_I2C_FREQ_RANGE I2C_FREQRANGE +#else +#define __HAL_I2C_FREQ_RANGE I2C_FREQ_RANGE +#endif /* STM32F1 */ +#define __HAL_I2C_RISE_TIME I2C_RISE_TIME +#define __HAL_I2C_SPEED_STANDARD I2C_SPEED_STANDARD +#define __HAL_I2C_SPEED_FAST I2C_SPEED_FAST +#define __HAL_I2C_SPEED I2C_SPEED +#define __HAL_I2C_7BIT_ADD_WRITE I2C_7BIT_ADD_WRITE +#define __HAL_I2C_7BIT_ADD_READ I2C_7BIT_ADD_READ +#define __HAL_I2C_10BIT_ADDRESS I2C_10BIT_ADDRESS +#define __HAL_I2C_10BIT_HEADER_WRITE I2C_10BIT_HEADER_WRITE +#define __HAL_I2C_10BIT_HEADER_READ I2C_10BIT_HEADER_READ +#define __HAL_I2C_MEM_ADD_MSB I2C_MEM_ADD_MSB +#define __HAL_I2C_MEM_ADD_LSB I2C_MEM_ADD_LSB +#define __HAL_I2C_FREQRANGE I2C_FREQRANGE +/** + * @} + */ + +/** @defgroup HAL_I2S_Aliased_Macros HAL I2S Aliased Macros maintained for legacy purpose + * @{ + */ + +#define IS_I2S_INSTANCE IS_I2S_ALL_INSTANCE +#define IS_I2S_INSTANCE_EXT IS_I2S_ALL_INSTANCE_EXT + +#if defined(STM32H7) +#define __HAL_I2S_CLEAR_FREFLAG __HAL_I2S_CLEAR_TIFREFLAG +#endif + +/** + * @} + */ + +/** @defgroup HAL_IRDA_Aliased_Macros HAL IRDA Aliased Macros maintained for legacy purpose + * @{ + */ + +#define __IRDA_DISABLE __HAL_IRDA_DISABLE +#define __IRDA_ENABLE __HAL_IRDA_ENABLE + +#define __HAL_IRDA_GETCLOCKSOURCE IRDA_GETCLOCKSOURCE +#define __HAL_IRDA_MASK_COMPUTATION IRDA_MASK_COMPUTATION +#define __IRDA_GETCLOCKSOURCE IRDA_GETCLOCKSOURCE +#define __IRDA_MASK_COMPUTATION IRDA_MASK_COMPUTATION + +#define IS_IRDA_ONEBIT_SAMPLE IS_IRDA_ONE_BIT_SAMPLE + + +/** + * @} + */ + + +/** @defgroup HAL_IWDG_Aliased_Macros HAL IWDG Aliased Macros maintained for legacy purpose + * @{ + */ +#define __HAL_IWDG_ENABLE_WRITE_ACCESS IWDG_ENABLE_WRITE_ACCESS +#define __HAL_IWDG_DISABLE_WRITE_ACCESS IWDG_DISABLE_WRITE_ACCESS +/** + * @} + */ + + +/** @defgroup HAL_LPTIM_Aliased_Macros HAL LPTIM Aliased Macros maintained for legacy purpose + * @{ + */ + +#define __HAL_LPTIM_ENABLE_INTERRUPT __HAL_LPTIM_ENABLE_IT +#define __HAL_LPTIM_DISABLE_INTERRUPT __HAL_LPTIM_DISABLE_IT +#define __HAL_LPTIM_GET_ITSTATUS __HAL_LPTIM_GET_IT_SOURCE + +/** + * @} + */ + + +/** @defgroup HAL_OPAMP_Aliased_Macros HAL OPAMP Aliased Macros maintained for legacy purpose + * @{ + */ +#define __OPAMP_CSR_OPAXPD OPAMP_CSR_OPAXPD +#define __OPAMP_CSR_S3SELX OPAMP_CSR_S3SELX +#define __OPAMP_CSR_S4SELX OPAMP_CSR_S4SELX +#define __OPAMP_CSR_S5SELX OPAMP_CSR_S5SELX +#define __OPAMP_CSR_S6SELX OPAMP_CSR_S6SELX +#define __OPAMP_CSR_OPAXCAL_L OPAMP_CSR_OPAXCAL_L +#define __OPAMP_CSR_OPAXCAL_H OPAMP_CSR_OPAXCAL_H +#define __OPAMP_CSR_OPAXLPM OPAMP_CSR_OPAXLPM +#define __OPAMP_CSR_ALL_SWITCHES OPAMP_CSR_ALL_SWITCHES +#define __OPAMP_CSR_ANAWSELX OPAMP_CSR_ANAWSELX +#define __OPAMP_CSR_OPAXCALOUT OPAMP_CSR_OPAXCALOUT +#define __OPAMP_OFFSET_TRIM_BITSPOSITION OPAMP_OFFSET_TRIM_BITSPOSITION +#define __OPAMP_OFFSET_TRIM_SET OPAMP_OFFSET_TRIM_SET + +/** + * @} + */ + + +/** @defgroup HAL_PWR_Aliased_Macros HAL PWR Aliased Macros maintained for legacy purpose + * @{ + */ +#define __HAL_PVD_EVENT_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_EVENT +#define __HAL_PVD_EVENT_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_EVENT +#define __HAL_PVD_EXTI_FALLINGTRIGGER_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE +#define __HAL_PVD_EXTI_FALLINGTRIGGER_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE +#define __HAL_PVD_EXTI_RISINGTRIGGER_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE +#define __HAL_PVD_EXTI_RISINGTRIGGER_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE +#define __HAL_PVM_EVENT_DISABLE __HAL_PWR_PVM_EVENT_DISABLE +#define __HAL_PVM_EVENT_ENABLE __HAL_PWR_PVM_EVENT_ENABLE +#define __HAL_PVM_EXTI_FALLINGTRIGGER_DISABLE __HAL_PWR_PVM_EXTI_FALLINGTRIGGER_DISABLE +#define __HAL_PVM_EXTI_FALLINGTRIGGER_ENABLE __HAL_PWR_PVM_EXTI_FALLINGTRIGGER_ENABLE +#define __HAL_PVM_EXTI_RISINGTRIGGER_DISABLE __HAL_PWR_PVM_EXTI_RISINGTRIGGER_DISABLE +#define __HAL_PVM_EXTI_RISINGTRIGGER_ENABLE __HAL_PWR_PVM_EXTI_RISINGTRIGGER_ENABLE +#define __HAL_PWR_INTERNALWAKEUP_DISABLE HAL_PWREx_DisableInternalWakeUpLine +#define __HAL_PWR_INTERNALWAKEUP_ENABLE HAL_PWREx_EnableInternalWakeUpLine +#define __HAL_PWR_PULL_UP_DOWN_CONFIG_DISABLE HAL_PWREx_DisablePullUpPullDownConfig +#define __HAL_PWR_PULL_UP_DOWN_CONFIG_ENABLE HAL_PWREx_EnablePullUpPullDownConfig +#define __HAL_PWR_PVD_EXTI_CLEAR_EGDE_TRIGGER() do { __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE(); \ + __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE(); \ + } while(0) +#define __HAL_PWR_PVD_EXTI_EVENT_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_EVENT +#define __HAL_PWR_PVD_EXTI_EVENT_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_EVENT +#define __HAL_PWR_PVD_EXTI_FALLINGTRIGGER_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE +#define __HAL_PWR_PVD_EXTI_FALLINGTRIGGER_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE +#define __HAL_PWR_PVD_EXTI_RISINGTRIGGER_DISABLE __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE +#define __HAL_PWR_PVD_EXTI_RISINGTRIGGER_ENABLE __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE +#define __HAL_PWR_PVD_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE +#define __HAL_PWR_PVD_EXTI_SET_RISING_EDGE_TRIGGER __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE +#define __HAL_PWR_PVM_DISABLE() do { HAL_PWREx_DisablePVM1();HAL_PWREx_DisablePVM2(); \ + HAL_PWREx_DisablePVM3();HAL_PWREx_DisablePVM4(); \ + } while(0) +#define __HAL_PWR_PVM_ENABLE() do { HAL_PWREx_EnablePVM1();HAL_PWREx_EnablePVM2(); \ + HAL_PWREx_EnablePVM3();HAL_PWREx_EnablePVM4(); \ + } while(0) +#define __HAL_PWR_SRAM2CONTENT_PRESERVE_DISABLE HAL_PWREx_DisableSRAM2ContentRetention +#define __HAL_PWR_SRAM2CONTENT_PRESERVE_ENABLE HAL_PWREx_EnableSRAM2ContentRetention +#define __HAL_PWR_VDDIO2_DISABLE HAL_PWREx_DisableVddIO2 +#define __HAL_PWR_VDDIO2_ENABLE HAL_PWREx_EnableVddIO2 +#define __HAL_PWR_VDDIO2_EXTI_CLEAR_EGDE_TRIGGER __HAL_PWR_VDDIO2_EXTI_DISABLE_FALLING_EDGE +#define __HAL_PWR_VDDIO2_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_PWR_VDDIO2_EXTI_ENABLE_FALLING_EDGE +#define __HAL_PWR_VDDUSB_DISABLE HAL_PWREx_DisableVddUSB +#define __HAL_PWR_VDDUSB_ENABLE HAL_PWREx_EnableVddUSB + +#if defined (STM32F4) +#define __HAL_PVD_EXTI_ENABLE_IT(PWR_EXTI_LINE_PVD) __HAL_PWR_PVD_EXTI_ENABLE_IT() +#define __HAL_PVD_EXTI_DISABLE_IT(PWR_EXTI_LINE_PVD) __HAL_PWR_PVD_EXTI_DISABLE_IT() +#define __HAL_PVD_EXTI_GET_FLAG(PWR_EXTI_LINE_PVD) __HAL_PWR_PVD_EXTI_GET_FLAG() +#define __HAL_PVD_EXTI_CLEAR_FLAG(PWR_EXTI_LINE_PVD) __HAL_PWR_PVD_EXTI_CLEAR_FLAG() +#define __HAL_PVD_EXTI_GENERATE_SWIT(PWR_EXTI_LINE_PVD) __HAL_PWR_PVD_EXTI_GENERATE_SWIT() +#else +#define __HAL_PVD_EXTI_CLEAR_FLAG __HAL_PWR_PVD_EXTI_CLEAR_FLAG +#define __HAL_PVD_EXTI_DISABLE_IT __HAL_PWR_PVD_EXTI_DISABLE_IT +#define __HAL_PVD_EXTI_ENABLE_IT __HAL_PWR_PVD_EXTI_ENABLE_IT +#define __HAL_PVD_EXTI_GENERATE_SWIT __HAL_PWR_PVD_EXTI_GENERATE_SWIT +#define __HAL_PVD_EXTI_GET_FLAG __HAL_PWR_PVD_EXTI_GET_FLAG +#endif /* STM32F4 */ +/** + * @} + */ + + +/** @defgroup HAL_RCC_Aliased HAL RCC Aliased maintained for legacy purpose + * @{ + */ + +#define RCC_StopWakeUpClock_MSI RCC_STOP_WAKEUPCLOCK_MSI +#define RCC_StopWakeUpClock_HSI RCC_STOP_WAKEUPCLOCK_HSI + +#define HAL_RCC_CCSCallback HAL_RCC_CSSCallback +#define HAL_RC48_EnableBuffer_Cmd(cmd) (((cmd)==ENABLE) ? \ + HAL_RCCEx_EnableHSI48_VREFINT() : HAL_RCCEx_DisableHSI48_VREFINT()) + +#define __ADC_CLK_DISABLE __HAL_RCC_ADC_CLK_DISABLE +#define __ADC_CLK_ENABLE __HAL_RCC_ADC_CLK_ENABLE +#define __ADC_CLK_SLEEP_DISABLE __HAL_RCC_ADC_CLK_SLEEP_DISABLE +#define __ADC_CLK_SLEEP_ENABLE __HAL_RCC_ADC_CLK_SLEEP_ENABLE +#define __ADC_FORCE_RESET __HAL_RCC_ADC_FORCE_RESET +#define __ADC_RELEASE_RESET __HAL_RCC_ADC_RELEASE_RESET +#define __ADC1_CLK_DISABLE __HAL_RCC_ADC1_CLK_DISABLE +#define __ADC1_CLK_ENABLE __HAL_RCC_ADC1_CLK_ENABLE +#define __ADC1_FORCE_RESET __HAL_RCC_ADC1_FORCE_RESET +#define __ADC1_RELEASE_RESET __HAL_RCC_ADC1_RELEASE_RESET +#define __ADC1_CLK_SLEEP_ENABLE __HAL_RCC_ADC1_CLK_SLEEP_ENABLE +#define __ADC1_CLK_SLEEP_DISABLE __HAL_RCC_ADC1_CLK_SLEEP_DISABLE +#define __ADC2_CLK_DISABLE __HAL_RCC_ADC2_CLK_DISABLE +#define __ADC2_CLK_ENABLE __HAL_RCC_ADC2_CLK_ENABLE +#define __ADC2_FORCE_RESET __HAL_RCC_ADC2_FORCE_RESET +#define __ADC2_RELEASE_RESET __HAL_RCC_ADC2_RELEASE_RESET +#define __ADC3_CLK_DISABLE __HAL_RCC_ADC3_CLK_DISABLE +#define __ADC3_CLK_ENABLE __HAL_RCC_ADC3_CLK_ENABLE +#define __ADC3_FORCE_RESET __HAL_RCC_ADC3_FORCE_RESET +#define __ADC3_RELEASE_RESET __HAL_RCC_ADC3_RELEASE_RESET +#define __AES_CLK_DISABLE __HAL_RCC_AES_CLK_DISABLE +#define __AES_CLK_ENABLE __HAL_RCC_AES_CLK_ENABLE +#define __AES_CLK_SLEEP_DISABLE __HAL_RCC_AES_CLK_SLEEP_DISABLE +#define __AES_CLK_SLEEP_ENABLE __HAL_RCC_AES_CLK_SLEEP_ENABLE +#define __AES_FORCE_RESET __HAL_RCC_AES_FORCE_RESET +#define __AES_RELEASE_RESET __HAL_RCC_AES_RELEASE_RESET +#define __CRYP_CLK_SLEEP_ENABLE __HAL_RCC_CRYP_CLK_SLEEP_ENABLE +#define __CRYP_CLK_SLEEP_DISABLE __HAL_RCC_CRYP_CLK_SLEEP_DISABLE +#define __CRYP_CLK_ENABLE __HAL_RCC_CRYP_CLK_ENABLE +#define __CRYP_CLK_DISABLE __HAL_RCC_CRYP_CLK_DISABLE +#define __CRYP_FORCE_RESET __HAL_RCC_CRYP_FORCE_RESET +#define __CRYP_RELEASE_RESET __HAL_RCC_CRYP_RELEASE_RESET +#define __AFIO_CLK_DISABLE __HAL_RCC_AFIO_CLK_DISABLE +#define __AFIO_CLK_ENABLE __HAL_RCC_AFIO_CLK_ENABLE +#define __AFIO_FORCE_RESET __HAL_RCC_AFIO_FORCE_RESET +#define __AFIO_RELEASE_RESET __HAL_RCC_AFIO_RELEASE_RESET +#define __AHB_FORCE_RESET __HAL_RCC_AHB_FORCE_RESET +#define __AHB_RELEASE_RESET __HAL_RCC_AHB_RELEASE_RESET +#define __AHB1_FORCE_RESET __HAL_RCC_AHB1_FORCE_RESET +#define __AHB1_RELEASE_RESET __HAL_RCC_AHB1_RELEASE_RESET +#define __AHB2_FORCE_RESET __HAL_RCC_AHB2_FORCE_RESET +#define __AHB2_RELEASE_RESET __HAL_RCC_AHB2_RELEASE_RESET +#define __AHB3_FORCE_RESET __HAL_RCC_AHB3_FORCE_RESET +#define __AHB3_RELEASE_RESET __HAL_RCC_AHB3_RELEASE_RESET +#define __APB1_FORCE_RESET __HAL_RCC_APB1_FORCE_RESET +#define __APB1_RELEASE_RESET __HAL_RCC_APB1_RELEASE_RESET +#define __APB2_FORCE_RESET __HAL_RCC_APB2_FORCE_RESET +#define __APB2_RELEASE_RESET __HAL_RCC_APB2_RELEASE_RESET +#if defined(STM32C0) +#define __HAL_RCC_APB1_FORCE_RESET __HAL_RCC_APB1_GRP1_FORCE_RESET +#define __HAL_RCC_APB1_RELEASE_RESET __HAL_RCC_APB1_GRP1_RELEASE_RESET +#define __HAL_RCC_APB2_FORCE_RESET __HAL_RCC_APB1_GRP2_FORCE_RESET +#define __HAL_RCC_APB2_RELEASE_RESET __HAL_RCC_APB1_GRP2_RELEASE_RESET +#endif /* STM32C0 */ +#define __BKP_CLK_DISABLE __HAL_RCC_BKP_CLK_DISABLE +#define __BKP_CLK_ENABLE __HAL_RCC_BKP_CLK_ENABLE +#define __BKP_FORCE_RESET __HAL_RCC_BKP_FORCE_RESET +#define __BKP_RELEASE_RESET __HAL_RCC_BKP_RELEASE_RESET +#define __CAN1_CLK_DISABLE __HAL_RCC_CAN1_CLK_DISABLE +#define __CAN1_CLK_ENABLE __HAL_RCC_CAN1_CLK_ENABLE +#define __CAN1_CLK_SLEEP_DISABLE __HAL_RCC_CAN1_CLK_SLEEP_DISABLE +#define __CAN1_CLK_SLEEP_ENABLE __HAL_RCC_CAN1_CLK_SLEEP_ENABLE +#define __CAN1_FORCE_RESET __HAL_RCC_CAN1_FORCE_RESET +#define __CAN1_RELEASE_RESET __HAL_RCC_CAN1_RELEASE_RESET +#define __CAN_CLK_DISABLE __HAL_RCC_CAN1_CLK_DISABLE +#define __CAN_CLK_ENABLE __HAL_RCC_CAN1_CLK_ENABLE +#define __CAN_FORCE_RESET __HAL_RCC_CAN1_FORCE_RESET +#define __CAN_RELEASE_RESET __HAL_RCC_CAN1_RELEASE_RESET +#define __CAN2_CLK_DISABLE __HAL_RCC_CAN2_CLK_DISABLE +#define __CAN2_CLK_ENABLE __HAL_RCC_CAN2_CLK_ENABLE +#define __CAN2_FORCE_RESET __HAL_RCC_CAN2_FORCE_RESET +#define __CAN2_RELEASE_RESET __HAL_RCC_CAN2_RELEASE_RESET +#define __CEC_CLK_DISABLE __HAL_RCC_CEC_CLK_DISABLE +#define __CEC_CLK_ENABLE __HAL_RCC_CEC_CLK_ENABLE +#define __COMP_CLK_DISABLE __HAL_RCC_COMP_CLK_DISABLE +#define __COMP_CLK_ENABLE __HAL_RCC_COMP_CLK_ENABLE +#define __COMP_FORCE_RESET __HAL_RCC_COMP_FORCE_RESET +#define __COMP_RELEASE_RESET __HAL_RCC_COMP_RELEASE_RESET +#define __COMP_CLK_SLEEP_ENABLE __HAL_RCC_COMP_CLK_SLEEP_ENABLE +#define __COMP_CLK_SLEEP_DISABLE __HAL_RCC_COMP_CLK_SLEEP_DISABLE +#define __CEC_FORCE_RESET __HAL_RCC_CEC_FORCE_RESET +#define __CEC_RELEASE_RESET __HAL_RCC_CEC_RELEASE_RESET +#define __CRC_CLK_DISABLE __HAL_RCC_CRC_CLK_DISABLE +#define __CRC_CLK_ENABLE __HAL_RCC_CRC_CLK_ENABLE +#define __CRC_CLK_SLEEP_DISABLE __HAL_RCC_CRC_CLK_SLEEP_DISABLE +#define __CRC_CLK_SLEEP_ENABLE __HAL_RCC_CRC_CLK_SLEEP_ENABLE +#define __CRC_FORCE_RESET __HAL_RCC_CRC_FORCE_RESET +#define __CRC_RELEASE_RESET __HAL_RCC_CRC_RELEASE_RESET +#define __DAC_CLK_DISABLE __HAL_RCC_DAC_CLK_DISABLE +#define __DAC_CLK_ENABLE __HAL_RCC_DAC_CLK_ENABLE +#define __DAC_FORCE_RESET __HAL_RCC_DAC_FORCE_RESET +#define __DAC_RELEASE_RESET __HAL_RCC_DAC_RELEASE_RESET +#define __DAC1_CLK_DISABLE __HAL_RCC_DAC1_CLK_DISABLE +#define __DAC1_CLK_ENABLE __HAL_RCC_DAC1_CLK_ENABLE +#define __DAC1_CLK_SLEEP_DISABLE __HAL_RCC_DAC1_CLK_SLEEP_DISABLE +#define __DAC1_CLK_SLEEP_ENABLE __HAL_RCC_DAC1_CLK_SLEEP_ENABLE +#define __DAC1_FORCE_RESET __HAL_RCC_DAC1_FORCE_RESET +#define __DAC1_RELEASE_RESET __HAL_RCC_DAC1_RELEASE_RESET +#define __DBGMCU_CLK_ENABLE __HAL_RCC_DBGMCU_CLK_ENABLE +#define __DBGMCU_CLK_DISABLE __HAL_RCC_DBGMCU_CLK_DISABLE +#define __DBGMCU_FORCE_RESET __HAL_RCC_DBGMCU_FORCE_RESET +#define __DBGMCU_RELEASE_RESET __HAL_RCC_DBGMCU_RELEASE_RESET +#define __DFSDM_CLK_DISABLE __HAL_RCC_DFSDM_CLK_DISABLE +#define __DFSDM_CLK_ENABLE __HAL_RCC_DFSDM_CLK_ENABLE +#define __DFSDM_CLK_SLEEP_DISABLE __HAL_RCC_DFSDM_CLK_SLEEP_DISABLE +#define __DFSDM_CLK_SLEEP_ENABLE __HAL_RCC_DFSDM_CLK_SLEEP_ENABLE +#define __DFSDM_FORCE_RESET __HAL_RCC_DFSDM_FORCE_RESET +#define __DFSDM_RELEASE_RESET __HAL_RCC_DFSDM_RELEASE_RESET +#define __DMA1_CLK_DISABLE __HAL_RCC_DMA1_CLK_DISABLE +#define __DMA1_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE +#define __DMA1_CLK_SLEEP_DISABLE __HAL_RCC_DMA1_CLK_SLEEP_DISABLE +#define __DMA1_CLK_SLEEP_ENABLE __HAL_RCC_DMA1_CLK_SLEEP_ENABLE +#define __DMA1_FORCE_RESET __HAL_RCC_DMA1_FORCE_RESET +#define __DMA1_RELEASE_RESET __HAL_RCC_DMA1_RELEASE_RESET +#define __DMA2_CLK_DISABLE __HAL_RCC_DMA2_CLK_DISABLE +#define __DMA2_CLK_ENABLE __HAL_RCC_DMA2_CLK_ENABLE +#define __DMA2_CLK_SLEEP_DISABLE __HAL_RCC_DMA2_CLK_SLEEP_DISABLE +#define __DMA2_CLK_SLEEP_ENABLE __HAL_RCC_DMA2_CLK_SLEEP_ENABLE +#define __DMA2_FORCE_RESET __HAL_RCC_DMA2_FORCE_RESET +#define __DMA2_RELEASE_RESET __HAL_RCC_DMA2_RELEASE_RESET +#define __ETHMAC_CLK_DISABLE __HAL_RCC_ETHMAC_CLK_DISABLE +#define __ETHMAC_CLK_ENABLE __HAL_RCC_ETHMAC_CLK_ENABLE +#define __ETHMAC_FORCE_RESET __HAL_RCC_ETHMAC_FORCE_RESET +#define __ETHMAC_RELEASE_RESET __HAL_RCC_ETHMAC_RELEASE_RESET +#define __ETHMACRX_CLK_DISABLE __HAL_RCC_ETHMACRX_CLK_DISABLE +#define __ETHMACRX_CLK_ENABLE __HAL_RCC_ETHMACRX_CLK_ENABLE +#define __ETHMACTX_CLK_DISABLE __HAL_RCC_ETHMACTX_CLK_DISABLE +#define __ETHMACTX_CLK_ENABLE __HAL_RCC_ETHMACTX_CLK_ENABLE +#define __FIREWALL_CLK_DISABLE __HAL_RCC_FIREWALL_CLK_DISABLE +#define __FIREWALL_CLK_ENABLE __HAL_RCC_FIREWALL_CLK_ENABLE +#define __FLASH_CLK_DISABLE __HAL_RCC_FLASH_CLK_DISABLE +#define __FLASH_CLK_ENABLE __HAL_RCC_FLASH_CLK_ENABLE +#define __FLASH_CLK_SLEEP_DISABLE __HAL_RCC_FLASH_CLK_SLEEP_DISABLE +#define __FLASH_CLK_SLEEP_ENABLE __HAL_RCC_FLASH_CLK_SLEEP_ENABLE +#define __FLASH_FORCE_RESET __HAL_RCC_FLASH_FORCE_RESET +#define __FLASH_RELEASE_RESET __HAL_RCC_FLASH_RELEASE_RESET +#define __FLITF_CLK_DISABLE __HAL_RCC_FLITF_CLK_DISABLE +#define __FLITF_CLK_ENABLE __HAL_RCC_FLITF_CLK_ENABLE +#define __FLITF_FORCE_RESET __HAL_RCC_FLITF_FORCE_RESET +#define __FLITF_RELEASE_RESET __HAL_RCC_FLITF_RELEASE_RESET +#define __FLITF_CLK_SLEEP_ENABLE __HAL_RCC_FLITF_CLK_SLEEP_ENABLE +#define __FLITF_CLK_SLEEP_DISABLE __HAL_RCC_FLITF_CLK_SLEEP_DISABLE +#define __FMC_CLK_DISABLE __HAL_RCC_FMC_CLK_DISABLE +#define __FMC_CLK_ENABLE __HAL_RCC_FMC_CLK_ENABLE +#define __FMC_CLK_SLEEP_DISABLE __HAL_RCC_FMC_CLK_SLEEP_DISABLE +#define __FMC_CLK_SLEEP_ENABLE __HAL_RCC_FMC_CLK_SLEEP_ENABLE +#define __FMC_FORCE_RESET __HAL_RCC_FMC_FORCE_RESET +#define __FMC_RELEASE_RESET __HAL_RCC_FMC_RELEASE_RESET +#define __FSMC_CLK_DISABLE __HAL_RCC_FSMC_CLK_DISABLE +#define __FSMC_CLK_ENABLE __HAL_RCC_FSMC_CLK_ENABLE +#define __GPIOA_CLK_DISABLE __HAL_RCC_GPIOA_CLK_DISABLE +#define __GPIOA_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE +#define __GPIOA_CLK_SLEEP_DISABLE __HAL_RCC_GPIOA_CLK_SLEEP_DISABLE +#define __GPIOA_CLK_SLEEP_ENABLE __HAL_RCC_GPIOA_CLK_SLEEP_ENABLE +#define __GPIOA_FORCE_RESET __HAL_RCC_GPIOA_FORCE_RESET +#define __GPIOA_RELEASE_RESET __HAL_RCC_GPIOA_RELEASE_RESET +#define __GPIOB_CLK_DISABLE __HAL_RCC_GPIOB_CLK_DISABLE +#define __GPIOB_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE +#define __GPIOB_CLK_SLEEP_DISABLE __HAL_RCC_GPIOB_CLK_SLEEP_DISABLE +#define __GPIOB_CLK_SLEEP_ENABLE __HAL_RCC_GPIOB_CLK_SLEEP_ENABLE +#define __GPIOB_FORCE_RESET __HAL_RCC_GPIOB_FORCE_RESET +#define __GPIOB_RELEASE_RESET __HAL_RCC_GPIOB_RELEASE_RESET +#define __GPIOC_CLK_DISABLE __HAL_RCC_GPIOC_CLK_DISABLE +#define __GPIOC_CLK_ENABLE __HAL_RCC_GPIOC_CLK_ENABLE +#define __GPIOC_CLK_SLEEP_DISABLE __HAL_RCC_GPIOC_CLK_SLEEP_DISABLE +#define __GPIOC_CLK_SLEEP_ENABLE __HAL_RCC_GPIOC_CLK_SLEEP_ENABLE +#define __GPIOC_FORCE_RESET __HAL_RCC_GPIOC_FORCE_RESET +#define __GPIOC_RELEASE_RESET __HAL_RCC_GPIOC_RELEASE_RESET +#define __GPIOD_CLK_DISABLE __HAL_RCC_GPIOD_CLK_DISABLE +#define __GPIOD_CLK_ENABLE __HAL_RCC_GPIOD_CLK_ENABLE +#define __GPIOD_CLK_SLEEP_DISABLE __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE +#define __GPIOD_CLK_SLEEP_ENABLE __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE +#define __GPIOD_FORCE_RESET __HAL_RCC_GPIOD_FORCE_RESET +#define __GPIOD_RELEASE_RESET __HAL_RCC_GPIOD_RELEASE_RESET +#define __GPIOE_CLK_DISABLE __HAL_RCC_GPIOE_CLK_DISABLE +#define __GPIOE_CLK_ENABLE __HAL_RCC_GPIOE_CLK_ENABLE +#define __GPIOE_CLK_SLEEP_DISABLE __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE +#define __GPIOE_CLK_SLEEP_ENABLE __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE +#define __GPIOE_FORCE_RESET __HAL_RCC_GPIOE_FORCE_RESET +#define __GPIOE_RELEASE_RESET __HAL_RCC_GPIOE_RELEASE_RESET +#define __GPIOF_CLK_DISABLE __HAL_RCC_GPIOF_CLK_DISABLE +#define __GPIOF_CLK_ENABLE __HAL_RCC_GPIOF_CLK_ENABLE +#define __GPIOF_CLK_SLEEP_DISABLE __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE +#define __GPIOF_CLK_SLEEP_ENABLE __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE +#define __GPIOF_FORCE_RESET __HAL_RCC_GPIOF_FORCE_RESET +#define __GPIOF_RELEASE_RESET __HAL_RCC_GPIOF_RELEASE_RESET +#define __GPIOG_CLK_DISABLE __HAL_RCC_GPIOG_CLK_DISABLE +#define __GPIOG_CLK_ENABLE __HAL_RCC_GPIOG_CLK_ENABLE +#define __GPIOG_CLK_SLEEP_DISABLE __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE +#define __GPIOG_CLK_SLEEP_ENABLE __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE +#define __GPIOG_FORCE_RESET __HAL_RCC_GPIOG_FORCE_RESET +#define __GPIOG_RELEASE_RESET __HAL_RCC_GPIOG_RELEASE_RESET +#define __GPIOH_CLK_DISABLE __HAL_RCC_GPIOH_CLK_DISABLE +#define __GPIOH_CLK_ENABLE __HAL_RCC_GPIOH_CLK_ENABLE +#define __GPIOH_CLK_SLEEP_DISABLE __HAL_RCC_GPIOH_CLK_SLEEP_DISABLE +#define __GPIOH_CLK_SLEEP_ENABLE __HAL_RCC_GPIOH_CLK_SLEEP_ENABLE +#define __GPIOH_FORCE_RESET __HAL_RCC_GPIOH_FORCE_RESET +#define __GPIOH_RELEASE_RESET __HAL_RCC_GPIOH_RELEASE_RESET +#define __I2C1_CLK_DISABLE __HAL_RCC_I2C1_CLK_DISABLE +#define __I2C1_CLK_ENABLE __HAL_RCC_I2C1_CLK_ENABLE +#define __I2C1_CLK_SLEEP_DISABLE __HAL_RCC_I2C1_CLK_SLEEP_DISABLE +#define __I2C1_CLK_SLEEP_ENABLE __HAL_RCC_I2C1_CLK_SLEEP_ENABLE +#define __I2C1_FORCE_RESET __HAL_RCC_I2C1_FORCE_RESET +#define __I2C1_RELEASE_RESET __HAL_RCC_I2C1_RELEASE_RESET +#define __I2C2_CLK_DISABLE __HAL_RCC_I2C2_CLK_DISABLE +#define __I2C2_CLK_ENABLE __HAL_RCC_I2C2_CLK_ENABLE +#define __I2C2_CLK_SLEEP_DISABLE __HAL_RCC_I2C2_CLK_SLEEP_DISABLE +#define __I2C2_CLK_SLEEP_ENABLE __HAL_RCC_I2C2_CLK_SLEEP_ENABLE +#define __I2C2_FORCE_RESET __HAL_RCC_I2C2_FORCE_RESET +#define __I2C2_RELEASE_RESET __HAL_RCC_I2C2_RELEASE_RESET +#define __I2C3_CLK_DISABLE __HAL_RCC_I2C3_CLK_DISABLE +#define __I2C3_CLK_ENABLE __HAL_RCC_I2C3_CLK_ENABLE +#define __I2C3_CLK_SLEEP_DISABLE __HAL_RCC_I2C3_CLK_SLEEP_DISABLE +#define __I2C3_CLK_SLEEP_ENABLE __HAL_RCC_I2C3_CLK_SLEEP_ENABLE +#define __I2C3_FORCE_RESET __HAL_RCC_I2C3_FORCE_RESET +#define __I2C3_RELEASE_RESET __HAL_RCC_I2C3_RELEASE_RESET +#define __LCD_CLK_DISABLE __HAL_RCC_LCD_CLK_DISABLE +#define __LCD_CLK_ENABLE __HAL_RCC_LCD_CLK_ENABLE +#define __LCD_CLK_SLEEP_DISABLE __HAL_RCC_LCD_CLK_SLEEP_DISABLE +#define __LCD_CLK_SLEEP_ENABLE __HAL_RCC_LCD_CLK_SLEEP_ENABLE +#define __LCD_FORCE_RESET __HAL_RCC_LCD_FORCE_RESET +#define __LCD_RELEASE_RESET __HAL_RCC_LCD_RELEASE_RESET +#define __LPTIM1_CLK_DISABLE __HAL_RCC_LPTIM1_CLK_DISABLE +#define __LPTIM1_CLK_ENABLE __HAL_RCC_LPTIM1_CLK_ENABLE +#define __LPTIM1_CLK_SLEEP_DISABLE __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE +#define __LPTIM1_CLK_SLEEP_ENABLE __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE +#define __LPTIM1_FORCE_RESET __HAL_RCC_LPTIM1_FORCE_RESET +#define __LPTIM1_RELEASE_RESET __HAL_RCC_LPTIM1_RELEASE_RESET +#define __LPTIM2_CLK_DISABLE __HAL_RCC_LPTIM2_CLK_DISABLE +#define __LPTIM2_CLK_ENABLE __HAL_RCC_LPTIM2_CLK_ENABLE +#define __LPTIM2_CLK_SLEEP_DISABLE __HAL_RCC_LPTIM2_CLK_SLEEP_DISABLE +#define __LPTIM2_CLK_SLEEP_ENABLE __HAL_RCC_LPTIM2_CLK_SLEEP_ENABLE +#define __LPTIM2_FORCE_RESET __HAL_RCC_LPTIM2_FORCE_RESET +#define __LPTIM2_RELEASE_RESET __HAL_RCC_LPTIM2_RELEASE_RESET +#define __LPUART1_CLK_DISABLE __HAL_RCC_LPUART1_CLK_DISABLE +#define __LPUART1_CLK_ENABLE __HAL_RCC_LPUART1_CLK_ENABLE +#define __LPUART1_CLK_SLEEP_DISABLE __HAL_RCC_LPUART1_CLK_SLEEP_DISABLE +#define __LPUART1_CLK_SLEEP_ENABLE __HAL_RCC_LPUART1_CLK_SLEEP_ENABLE +#define __LPUART1_FORCE_RESET __HAL_RCC_LPUART1_FORCE_RESET +#define __LPUART1_RELEASE_RESET __HAL_RCC_LPUART1_RELEASE_RESET +#define __OPAMP_CLK_DISABLE __HAL_RCC_OPAMP_CLK_DISABLE +#define __OPAMP_CLK_ENABLE __HAL_RCC_OPAMP_CLK_ENABLE +#define __OPAMP_CLK_SLEEP_DISABLE __HAL_RCC_OPAMP_CLK_SLEEP_DISABLE +#define __OPAMP_CLK_SLEEP_ENABLE __HAL_RCC_OPAMP_CLK_SLEEP_ENABLE +#define __OPAMP_FORCE_RESET __HAL_RCC_OPAMP_FORCE_RESET +#define __OPAMP_RELEASE_RESET __HAL_RCC_OPAMP_RELEASE_RESET +#define __OTGFS_CLK_DISABLE __HAL_RCC_OTGFS_CLK_DISABLE +#define __OTGFS_CLK_ENABLE __HAL_RCC_OTGFS_CLK_ENABLE +#define __OTGFS_CLK_SLEEP_DISABLE __HAL_RCC_OTGFS_CLK_SLEEP_DISABLE +#define __OTGFS_CLK_SLEEP_ENABLE __HAL_RCC_OTGFS_CLK_SLEEP_ENABLE +#define __OTGFS_FORCE_RESET __HAL_RCC_OTGFS_FORCE_RESET +#define __OTGFS_RELEASE_RESET __HAL_RCC_OTGFS_RELEASE_RESET +#define __PWR_CLK_DISABLE __HAL_RCC_PWR_CLK_DISABLE +#define __PWR_CLK_ENABLE __HAL_RCC_PWR_CLK_ENABLE +#define __PWR_CLK_SLEEP_DISABLE __HAL_RCC_PWR_CLK_SLEEP_DISABLE +#define __PWR_CLK_SLEEP_ENABLE __HAL_RCC_PWR_CLK_SLEEP_ENABLE +#define __PWR_FORCE_RESET __HAL_RCC_PWR_FORCE_RESET +#define __PWR_RELEASE_RESET __HAL_RCC_PWR_RELEASE_RESET +#define __QSPI_CLK_DISABLE __HAL_RCC_QSPI_CLK_DISABLE +#define __QSPI_CLK_ENABLE __HAL_RCC_QSPI_CLK_ENABLE +#define __QSPI_CLK_SLEEP_DISABLE __HAL_RCC_QSPI_CLK_SLEEP_DISABLE +#define __QSPI_CLK_SLEEP_ENABLE __HAL_RCC_QSPI_CLK_SLEEP_ENABLE +#define __QSPI_FORCE_RESET __HAL_RCC_QSPI_FORCE_RESET +#define __QSPI_RELEASE_RESET __HAL_RCC_QSPI_RELEASE_RESET + +#if defined(STM32WB) +#define __HAL_RCC_QSPI_CLK_DISABLE __HAL_RCC_QUADSPI_CLK_DISABLE +#define __HAL_RCC_QSPI_CLK_ENABLE __HAL_RCC_QUADSPI_CLK_ENABLE +#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE __HAL_RCC_QUADSPI_CLK_SLEEP_DISABLE +#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE __HAL_RCC_QUADSPI_CLK_SLEEP_ENABLE +#define __HAL_RCC_QSPI_FORCE_RESET __HAL_RCC_QUADSPI_FORCE_RESET +#define __HAL_RCC_QSPI_RELEASE_RESET __HAL_RCC_QUADSPI_RELEASE_RESET +#define __HAL_RCC_QSPI_IS_CLK_ENABLED __HAL_RCC_QUADSPI_IS_CLK_ENABLED +#define __HAL_RCC_QSPI_IS_CLK_DISABLED __HAL_RCC_QUADSPI_IS_CLK_DISABLED +#define __HAL_RCC_QSPI_IS_CLK_SLEEP_ENABLED __HAL_RCC_QUADSPI_IS_CLK_SLEEP_ENABLED +#define __HAL_RCC_QSPI_IS_CLK_SLEEP_DISABLED __HAL_RCC_QUADSPI_IS_CLK_SLEEP_DISABLED +#define QSPI_IRQHandler QUADSPI_IRQHandler +#endif /* __HAL_RCC_QUADSPI_CLK_ENABLE */ + +#define __RNG_CLK_DISABLE __HAL_RCC_RNG_CLK_DISABLE +#define __RNG_CLK_ENABLE __HAL_RCC_RNG_CLK_ENABLE +#define __RNG_CLK_SLEEP_DISABLE __HAL_RCC_RNG_CLK_SLEEP_DISABLE +#define __RNG_CLK_SLEEP_ENABLE __HAL_RCC_RNG_CLK_SLEEP_ENABLE +#define __RNG_FORCE_RESET __HAL_RCC_RNG_FORCE_RESET +#define __RNG_RELEASE_RESET __HAL_RCC_RNG_RELEASE_RESET +#define __SAI1_CLK_DISABLE __HAL_RCC_SAI1_CLK_DISABLE +#define __SAI1_CLK_ENABLE __HAL_RCC_SAI1_CLK_ENABLE +#define __SAI1_CLK_SLEEP_DISABLE __HAL_RCC_SAI1_CLK_SLEEP_DISABLE +#define __SAI1_CLK_SLEEP_ENABLE __HAL_RCC_SAI1_CLK_SLEEP_ENABLE +#define __SAI1_FORCE_RESET __HAL_RCC_SAI1_FORCE_RESET +#define __SAI1_RELEASE_RESET __HAL_RCC_SAI1_RELEASE_RESET +#define __SAI2_CLK_DISABLE __HAL_RCC_SAI2_CLK_DISABLE +#define __SAI2_CLK_ENABLE __HAL_RCC_SAI2_CLK_ENABLE +#define __SAI2_CLK_SLEEP_DISABLE __HAL_RCC_SAI2_CLK_SLEEP_DISABLE +#define __SAI2_CLK_SLEEP_ENABLE __HAL_RCC_SAI2_CLK_SLEEP_ENABLE +#define __SAI2_FORCE_RESET __HAL_RCC_SAI2_FORCE_RESET +#define __SAI2_RELEASE_RESET __HAL_RCC_SAI2_RELEASE_RESET +#define __SDIO_CLK_DISABLE __HAL_RCC_SDIO_CLK_DISABLE +#define __SDIO_CLK_ENABLE __HAL_RCC_SDIO_CLK_ENABLE +#define __SDMMC_CLK_DISABLE __HAL_RCC_SDMMC_CLK_DISABLE +#define __SDMMC_CLK_ENABLE __HAL_RCC_SDMMC_CLK_ENABLE +#define __SDMMC_CLK_SLEEP_DISABLE __HAL_RCC_SDMMC_CLK_SLEEP_DISABLE +#define __SDMMC_CLK_SLEEP_ENABLE __HAL_RCC_SDMMC_CLK_SLEEP_ENABLE +#define __SDMMC_FORCE_RESET __HAL_RCC_SDMMC_FORCE_RESET +#define __SDMMC_RELEASE_RESET __HAL_RCC_SDMMC_RELEASE_RESET +#define __SPI1_CLK_DISABLE __HAL_RCC_SPI1_CLK_DISABLE +#define __SPI1_CLK_ENABLE __HAL_RCC_SPI1_CLK_ENABLE +#define __SPI1_CLK_SLEEP_DISABLE __HAL_RCC_SPI1_CLK_SLEEP_DISABLE +#define __SPI1_CLK_SLEEP_ENABLE __HAL_RCC_SPI1_CLK_SLEEP_ENABLE +#define __SPI1_FORCE_RESET __HAL_RCC_SPI1_FORCE_RESET +#define __SPI1_RELEASE_RESET __HAL_RCC_SPI1_RELEASE_RESET +#define __SPI2_CLK_DISABLE __HAL_RCC_SPI2_CLK_DISABLE +#define __SPI2_CLK_ENABLE __HAL_RCC_SPI2_CLK_ENABLE +#define __SPI2_CLK_SLEEP_DISABLE __HAL_RCC_SPI2_CLK_SLEEP_DISABLE +#define __SPI2_CLK_SLEEP_ENABLE __HAL_RCC_SPI2_CLK_SLEEP_ENABLE +#define __SPI2_FORCE_RESET __HAL_RCC_SPI2_FORCE_RESET +#define __SPI2_RELEASE_RESET __HAL_RCC_SPI2_RELEASE_RESET +#define __SPI3_CLK_DISABLE __HAL_RCC_SPI3_CLK_DISABLE +#define __SPI3_CLK_ENABLE __HAL_RCC_SPI3_CLK_ENABLE +#define __SPI3_CLK_SLEEP_DISABLE __HAL_RCC_SPI3_CLK_SLEEP_DISABLE +#define __SPI3_CLK_SLEEP_ENABLE __HAL_RCC_SPI3_CLK_SLEEP_ENABLE +#define __SPI3_FORCE_RESET __HAL_RCC_SPI3_FORCE_RESET +#define __SPI3_RELEASE_RESET __HAL_RCC_SPI3_RELEASE_RESET +#define __SRAM_CLK_DISABLE __HAL_RCC_SRAM_CLK_DISABLE +#define __SRAM_CLK_ENABLE __HAL_RCC_SRAM_CLK_ENABLE +#define __SRAM1_CLK_SLEEP_DISABLE __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE +#define __SRAM1_CLK_SLEEP_ENABLE __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE +#define __SRAM2_CLK_SLEEP_DISABLE __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE +#define __SRAM2_CLK_SLEEP_ENABLE __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE +#define __SWPMI1_CLK_DISABLE __HAL_RCC_SWPMI1_CLK_DISABLE +#define __SWPMI1_CLK_ENABLE __HAL_RCC_SWPMI1_CLK_ENABLE +#define __SWPMI1_CLK_SLEEP_DISABLE __HAL_RCC_SWPMI1_CLK_SLEEP_DISABLE +#define __SWPMI1_CLK_SLEEP_ENABLE __HAL_RCC_SWPMI1_CLK_SLEEP_ENABLE +#define __SWPMI1_FORCE_RESET __HAL_RCC_SWPMI1_FORCE_RESET +#define __SWPMI1_RELEASE_RESET __HAL_RCC_SWPMI1_RELEASE_RESET +#define __SYSCFG_CLK_DISABLE __HAL_RCC_SYSCFG_CLK_DISABLE +#define __SYSCFG_CLK_ENABLE __HAL_RCC_SYSCFG_CLK_ENABLE +#define __SYSCFG_CLK_SLEEP_DISABLE __HAL_RCC_SYSCFG_CLK_SLEEP_DISABLE +#define __SYSCFG_CLK_SLEEP_ENABLE __HAL_RCC_SYSCFG_CLK_SLEEP_ENABLE +#define __SYSCFG_FORCE_RESET __HAL_RCC_SYSCFG_FORCE_RESET +#define __SYSCFG_RELEASE_RESET __HAL_RCC_SYSCFG_RELEASE_RESET +#define __TIM1_CLK_DISABLE __HAL_RCC_TIM1_CLK_DISABLE +#define __TIM1_CLK_ENABLE __HAL_RCC_TIM1_CLK_ENABLE +#define __TIM1_CLK_SLEEP_DISABLE __HAL_RCC_TIM1_CLK_SLEEP_DISABLE +#define __TIM1_CLK_SLEEP_ENABLE __HAL_RCC_TIM1_CLK_SLEEP_ENABLE +#define __TIM1_FORCE_RESET __HAL_RCC_TIM1_FORCE_RESET +#define __TIM1_RELEASE_RESET __HAL_RCC_TIM1_RELEASE_RESET +#define __TIM10_CLK_DISABLE __HAL_RCC_TIM10_CLK_DISABLE +#define __TIM10_CLK_ENABLE __HAL_RCC_TIM10_CLK_ENABLE +#define __TIM10_FORCE_RESET __HAL_RCC_TIM10_FORCE_RESET +#define __TIM10_RELEASE_RESET __HAL_RCC_TIM10_RELEASE_RESET +#define __TIM11_CLK_DISABLE __HAL_RCC_TIM11_CLK_DISABLE +#define __TIM11_CLK_ENABLE __HAL_RCC_TIM11_CLK_ENABLE +#define __TIM11_FORCE_RESET __HAL_RCC_TIM11_FORCE_RESET +#define __TIM11_RELEASE_RESET __HAL_RCC_TIM11_RELEASE_RESET +#define __TIM12_CLK_DISABLE __HAL_RCC_TIM12_CLK_DISABLE +#define __TIM12_CLK_ENABLE __HAL_RCC_TIM12_CLK_ENABLE +#define __TIM12_FORCE_RESET __HAL_RCC_TIM12_FORCE_RESET +#define __TIM12_RELEASE_RESET __HAL_RCC_TIM12_RELEASE_RESET +#define __TIM13_CLK_DISABLE __HAL_RCC_TIM13_CLK_DISABLE +#define __TIM13_CLK_ENABLE __HAL_RCC_TIM13_CLK_ENABLE +#define __TIM13_FORCE_RESET __HAL_RCC_TIM13_FORCE_RESET +#define __TIM13_RELEASE_RESET __HAL_RCC_TIM13_RELEASE_RESET +#define __TIM14_CLK_DISABLE __HAL_RCC_TIM14_CLK_DISABLE +#define __TIM14_CLK_ENABLE __HAL_RCC_TIM14_CLK_ENABLE +#define __TIM14_FORCE_RESET __HAL_RCC_TIM14_FORCE_RESET +#define __TIM14_RELEASE_RESET __HAL_RCC_TIM14_RELEASE_RESET +#define __TIM15_CLK_DISABLE __HAL_RCC_TIM15_CLK_DISABLE +#define __TIM15_CLK_ENABLE __HAL_RCC_TIM15_CLK_ENABLE +#define __TIM15_CLK_SLEEP_DISABLE __HAL_RCC_TIM15_CLK_SLEEP_DISABLE +#define __TIM15_CLK_SLEEP_ENABLE __HAL_RCC_TIM15_CLK_SLEEP_ENABLE +#define __TIM15_FORCE_RESET __HAL_RCC_TIM15_FORCE_RESET +#define __TIM15_RELEASE_RESET __HAL_RCC_TIM15_RELEASE_RESET +#define __TIM16_CLK_DISABLE __HAL_RCC_TIM16_CLK_DISABLE +#define __TIM16_CLK_ENABLE __HAL_RCC_TIM16_CLK_ENABLE +#define __TIM16_CLK_SLEEP_DISABLE __HAL_RCC_TIM16_CLK_SLEEP_DISABLE +#define __TIM16_CLK_SLEEP_ENABLE __HAL_RCC_TIM16_CLK_SLEEP_ENABLE +#define __TIM16_FORCE_RESET __HAL_RCC_TIM16_FORCE_RESET +#define __TIM16_RELEASE_RESET __HAL_RCC_TIM16_RELEASE_RESET +#define __TIM17_CLK_DISABLE __HAL_RCC_TIM17_CLK_DISABLE +#define __TIM17_CLK_ENABLE __HAL_RCC_TIM17_CLK_ENABLE +#define __TIM17_CLK_SLEEP_DISABLE __HAL_RCC_TIM17_CLK_SLEEP_DISABLE +#define __TIM17_CLK_SLEEP_ENABLE __HAL_RCC_TIM17_CLK_SLEEP_ENABLE +#define __TIM17_FORCE_RESET __HAL_RCC_TIM17_FORCE_RESET +#define __TIM17_RELEASE_RESET __HAL_RCC_TIM17_RELEASE_RESET +#define __TIM2_CLK_DISABLE __HAL_RCC_TIM2_CLK_DISABLE +#define __TIM2_CLK_ENABLE __HAL_RCC_TIM2_CLK_ENABLE +#define __TIM2_CLK_SLEEP_DISABLE __HAL_RCC_TIM2_CLK_SLEEP_DISABLE +#define __TIM2_CLK_SLEEP_ENABLE __HAL_RCC_TIM2_CLK_SLEEP_ENABLE +#define __TIM2_FORCE_RESET __HAL_RCC_TIM2_FORCE_RESET +#define __TIM2_RELEASE_RESET __HAL_RCC_TIM2_RELEASE_RESET +#define __TIM3_CLK_DISABLE __HAL_RCC_TIM3_CLK_DISABLE +#define __TIM3_CLK_ENABLE __HAL_RCC_TIM3_CLK_ENABLE +#define __TIM3_CLK_SLEEP_DISABLE __HAL_RCC_TIM3_CLK_SLEEP_DISABLE +#define __TIM3_CLK_SLEEP_ENABLE __HAL_RCC_TIM3_CLK_SLEEP_ENABLE +#define __TIM3_FORCE_RESET __HAL_RCC_TIM3_FORCE_RESET +#define __TIM3_RELEASE_RESET __HAL_RCC_TIM3_RELEASE_RESET +#define __TIM4_CLK_DISABLE __HAL_RCC_TIM4_CLK_DISABLE +#define __TIM4_CLK_ENABLE __HAL_RCC_TIM4_CLK_ENABLE +#define __TIM4_CLK_SLEEP_DISABLE __HAL_RCC_TIM4_CLK_SLEEP_DISABLE +#define __TIM4_CLK_SLEEP_ENABLE __HAL_RCC_TIM4_CLK_SLEEP_ENABLE +#define __TIM4_FORCE_RESET __HAL_RCC_TIM4_FORCE_RESET +#define __TIM4_RELEASE_RESET __HAL_RCC_TIM4_RELEASE_RESET +#define __TIM5_CLK_DISABLE __HAL_RCC_TIM5_CLK_DISABLE +#define __TIM5_CLK_ENABLE __HAL_RCC_TIM5_CLK_ENABLE +#define __TIM5_CLK_SLEEP_DISABLE __HAL_RCC_TIM5_CLK_SLEEP_DISABLE +#define __TIM5_CLK_SLEEP_ENABLE __HAL_RCC_TIM5_CLK_SLEEP_ENABLE +#define __TIM5_FORCE_RESET __HAL_RCC_TIM5_FORCE_RESET +#define __TIM5_RELEASE_RESET __HAL_RCC_TIM5_RELEASE_RESET +#define __TIM6_CLK_DISABLE __HAL_RCC_TIM6_CLK_DISABLE +#define __TIM6_CLK_ENABLE __HAL_RCC_TIM6_CLK_ENABLE +#define __TIM6_CLK_SLEEP_DISABLE __HAL_RCC_TIM6_CLK_SLEEP_DISABLE +#define __TIM6_CLK_SLEEP_ENABLE __HAL_RCC_TIM6_CLK_SLEEP_ENABLE +#define __TIM6_FORCE_RESET __HAL_RCC_TIM6_FORCE_RESET +#define __TIM6_RELEASE_RESET __HAL_RCC_TIM6_RELEASE_RESET +#define __TIM7_CLK_DISABLE __HAL_RCC_TIM7_CLK_DISABLE +#define __TIM7_CLK_ENABLE __HAL_RCC_TIM7_CLK_ENABLE +#define __TIM7_CLK_SLEEP_DISABLE __HAL_RCC_TIM7_CLK_SLEEP_DISABLE +#define __TIM7_CLK_SLEEP_ENABLE __HAL_RCC_TIM7_CLK_SLEEP_ENABLE +#define __TIM7_FORCE_RESET __HAL_RCC_TIM7_FORCE_RESET +#define __TIM7_RELEASE_RESET __HAL_RCC_TIM7_RELEASE_RESET +#define __TIM8_CLK_DISABLE __HAL_RCC_TIM8_CLK_DISABLE +#define __TIM8_CLK_ENABLE __HAL_RCC_TIM8_CLK_ENABLE +#define __TIM8_CLK_SLEEP_DISABLE __HAL_RCC_TIM8_CLK_SLEEP_DISABLE +#define __TIM8_CLK_SLEEP_ENABLE __HAL_RCC_TIM8_CLK_SLEEP_ENABLE +#define __TIM8_FORCE_RESET __HAL_RCC_TIM8_FORCE_RESET +#define __TIM8_RELEASE_RESET __HAL_RCC_TIM8_RELEASE_RESET +#define __TIM9_CLK_DISABLE __HAL_RCC_TIM9_CLK_DISABLE +#define __TIM9_CLK_ENABLE __HAL_RCC_TIM9_CLK_ENABLE +#define __TIM9_FORCE_RESET __HAL_RCC_TIM9_FORCE_RESET +#define __TIM9_RELEASE_RESET __HAL_RCC_TIM9_RELEASE_RESET +#define __TSC_CLK_DISABLE __HAL_RCC_TSC_CLK_DISABLE +#define __TSC_CLK_ENABLE __HAL_RCC_TSC_CLK_ENABLE +#define __TSC_CLK_SLEEP_DISABLE __HAL_RCC_TSC_CLK_SLEEP_DISABLE +#define __TSC_CLK_SLEEP_ENABLE __HAL_RCC_TSC_CLK_SLEEP_ENABLE +#define __TSC_FORCE_RESET __HAL_RCC_TSC_FORCE_RESET +#define __TSC_RELEASE_RESET __HAL_RCC_TSC_RELEASE_RESET +#define __UART4_CLK_DISABLE __HAL_RCC_UART4_CLK_DISABLE +#define __UART4_CLK_ENABLE __HAL_RCC_UART4_CLK_ENABLE +#define __UART4_CLK_SLEEP_DISABLE __HAL_RCC_UART4_CLK_SLEEP_DISABLE +#define __UART4_CLK_SLEEP_ENABLE __HAL_RCC_UART4_CLK_SLEEP_ENABLE +#define __UART4_FORCE_RESET __HAL_RCC_UART4_FORCE_RESET +#define __UART4_RELEASE_RESET __HAL_RCC_UART4_RELEASE_RESET +#define __UART5_CLK_DISABLE __HAL_RCC_UART5_CLK_DISABLE +#define __UART5_CLK_ENABLE __HAL_RCC_UART5_CLK_ENABLE +#define __UART5_CLK_SLEEP_DISABLE __HAL_RCC_UART5_CLK_SLEEP_DISABLE +#define __UART5_CLK_SLEEP_ENABLE __HAL_RCC_UART5_CLK_SLEEP_ENABLE +#define __UART5_FORCE_RESET __HAL_RCC_UART5_FORCE_RESET +#define __UART5_RELEASE_RESET __HAL_RCC_UART5_RELEASE_RESET +#define __USART1_CLK_DISABLE __HAL_RCC_USART1_CLK_DISABLE +#define __USART1_CLK_ENABLE __HAL_RCC_USART1_CLK_ENABLE +#define __USART1_CLK_SLEEP_DISABLE __HAL_RCC_USART1_CLK_SLEEP_DISABLE +#define __USART1_CLK_SLEEP_ENABLE __HAL_RCC_USART1_CLK_SLEEP_ENABLE +#define __USART1_FORCE_RESET __HAL_RCC_USART1_FORCE_RESET +#define __USART1_RELEASE_RESET __HAL_RCC_USART1_RELEASE_RESET +#define __USART2_CLK_DISABLE __HAL_RCC_USART2_CLK_DISABLE +#define __USART2_CLK_ENABLE __HAL_RCC_USART2_CLK_ENABLE +#define __USART2_CLK_SLEEP_DISABLE __HAL_RCC_USART2_CLK_SLEEP_DISABLE +#define __USART2_CLK_SLEEP_ENABLE __HAL_RCC_USART2_CLK_SLEEP_ENABLE +#define __USART2_FORCE_RESET __HAL_RCC_USART2_FORCE_RESET +#define __USART2_RELEASE_RESET __HAL_RCC_USART2_RELEASE_RESET +#define __USART3_CLK_DISABLE __HAL_RCC_USART3_CLK_DISABLE +#define __USART3_CLK_ENABLE __HAL_RCC_USART3_CLK_ENABLE +#define __USART3_CLK_SLEEP_DISABLE __HAL_RCC_USART3_CLK_SLEEP_DISABLE +#define __USART3_CLK_SLEEP_ENABLE __HAL_RCC_USART3_CLK_SLEEP_ENABLE +#define __USART3_FORCE_RESET __HAL_RCC_USART3_FORCE_RESET +#define __USART3_RELEASE_RESET __HAL_RCC_USART3_RELEASE_RESET +#define __USART4_CLK_DISABLE __HAL_RCC_UART4_CLK_DISABLE +#define __USART4_CLK_ENABLE __HAL_RCC_UART4_CLK_ENABLE +#define __USART4_CLK_SLEEP_ENABLE __HAL_RCC_UART4_CLK_SLEEP_ENABLE +#define __USART4_CLK_SLEEP_DISABLE __HAL_RCC_UART4_CLK_SLEEP_DISABLE +#define __USART4_FORCE_RESET __HAL_RCC_UART4_FORCE_RESET +#define __USART4_RELEASE_RESET __HAL_RCC_UART4_RELEASE_RESET +#define __USART5_CLK_DISABLE __HAL_RCC_UART5_CLK_DISABLE +#define __USART5_CLK_ENABLE __HAL_RCC_UART5_CLK_ENABLE +#define __USART5_CLK_SLEEP_ENABLE __HAL_RCC_UART5_CLK_SLEEP_ENABLE +#define __USART5_CLK_SLEEP_DISABLE __HAL_RCC_UART5_CLK_SLEEP_DISABLE +#define __USART5_FORCE_RESET __HAL_RCC_UART5_FORCE_RESET +#define __USART5_RELEASE_RESET __HAL_RCC_UART5_RELEASE_RESET +#define __USART7_CLK_DISABLE __HAL_RCC_UART7_CLK_DISABLE +#define __USART7_CLK_ENABLE __HAL_RCC_UART7_CLK_ENABLE +#define __USART7_FORCE_RESET __HAL_RCC_UART7_FORCE_RESET +#define __USART7_RELEASE_RESET __HAL_RCC_UART7_RELEASE_RESET +#define __USART8_CLK_DISABLE __HAL_RCC_UART8_CLK_DISABLE +#define __USART8_CLK_ENABLE __HAL_RCC_UART8_CLK_ENABLE +#define __USART8_FORCE_RESET __HAL_RCC_UART8_FORCE_RESET +#define __USART8_RELEASE_RESET __HAL_RCC_UART8_RELEASE_RESET +#define __USB_CLK_DISABLE __HAL_RCC_USB_CLK_DISABLE +#define __USB_CLK_ENABLE __HAL_RCC_USB_CLK_ENABLE +#define __USB_FORCE_RESET __HAL_RCC_USB_FORCE_RESET +#define __USB_CLK_SLEEP_ENABLE __HAL_RCC_USB_CLK_SLEEP_ENABLE +#define __USB_CLK_SLEEP_DISABLE __HAL_RCC_USB_CLK_SLEEP_DISABLE +#define __USB_OTG_FS_CLK_DISABLE __HAL_RCC_USB_OTG_FS_CLK_DISABLE +#define __USB_OTG_FS_CLK_ENABLE __HAL_RCC_USB_OTG_FS_CLK_ENABLE +#define __USB_RELEASE_RESET __HAL_RCC_USB_RELEASE_RESET + +#if defined(STM32H7) +#define __HAL_RCC_WWDG_CLK_DISABLE __HAL_RCC_WWDG1_CLK_DISABLE +#define __HAL_RCC_WWDG_CLK_ENABLE __HAL_RCC_WWDG1_CLK_ENABLE +#define __HAL_RCC_WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG1_CLK_SLEEP_DISABLE +#define __HAL_RCC_WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG1_CLK_SLEEP_ENABLE + +#define __HAL_RCC_WWDG_FORCE_RESET ((void)0U) /* Not available on the STM32H7*/ +#define __HAL_RCC_WWDG_RELEASE_RESET ((void)0U) /* Not available on the STM32H7*/ + + +#define __HAL_RCC_WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG1_IS_CLK_ENABLED +#define __HAL_RCC_WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG1_IS_CLK_DISABLED +#define RCC_SPI4CLKSOURCE_D2PCLK1 RCC_SPI4CLKSOURCE_D2PCLK2 +#define RCC_SPI5CLKSOURCE_D2PCLK1 RCC_SPI5CLKSOURCE_D2PCLK2 +#define RCC_SPI45CLKSOURCE_D2PCLK1 RCC_SPI45CLKSOURCE_D2PCLK2 +#define RCC_SPI45CLKSOURCE_CDPCLK1 RCC_SPI45CLKSOURCE_CDPCLK2 +#define RCC_SPI45CLKSOURCE_PCLK1 RCC_SPI45CLKSOURCE_PCLK2 +#endif + +#define __WWDG_CLK_DISABLE __HAL_RCC_WWDG_CLK_DISABLE +#define __WWDG_CLK_ENABLE __HAL_RCC_WWDG_CLK_ENABLE +#define __WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG_CLK_SLEEP_DISABLE +#define __WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG_CLK_SLEEP_ENABLE +#define __WWDG_FORCE_RESET __HAL_RCC_WWDG_FORCE_RESET +#define __WWDG_RELEASE_RESET __HAL_RCC_WWDG_RELEASE_RESET + +#define __TIM21_CLK_ENABLE __HAL_RCC_TIM21_CLK_ENABLE +#define __TIM21_CLK_DISABLE __HAL_RCC_TIM21_CLK_DISABLE +#define __TIM21_FORCE_RESET __HAL_RCC_TIM21_FORCE_RESET +#define __TIM21_RELEASE_RESET __HAL_RCC_TIM21_RELEASE_RESET +#define __TIM21_CLK_SLEEP_ENABLE __HAL_RCC_TIM21_CLK_SLEEP_ENABLE +#define __TIM21_CLK_SLEEP_DISABLE __HAL_RCC_TIM21_CLK_SLEEP_DISABLE +#define __TIM22_CLK_ENABLE __HAL_RCC_TIM22_CLK_ENABLE +#define __TIM22_CLK_DISABLE __HAL_RCC_TIM22_CLK_DISABLE +#define __TIM22_FORCE_RESET __HAL_RCC_TIM22_FORCE_RESET +#define __TIM22_RELEASE_RESET __HAL_RCC_TIM22_RELEASE_RESET +#define __TIM22_CLK_SLEEP_ENABLE __HAL_RCC_TIM22_CLK_SLEEP_ENABLE +#define __TIM22_CLK_SLEEP_DISABLE __HAL_RCC_TIM22_CLK_SLEEP_DISABLE +#define __CRS_CLK_DISABLE __HAL_RCC_CRS_CLK_DISABLE +#define __CRS_CLK_ENABLE __HAL_RCC_CRS_CLK_ENABLE +#define __CRS_CLK_SLEEP_DISABLE __HAL_RCC_CRS_CLK_SLEEP_DISABLE +#define __CRS_CLK_SLEEP_ENABLE __HAL_RCC_CRS_CLK_SLEEP_ENABLE +#define __CRS_FORCE_RESET __HAL_RCC_CRS_FORCE_RESET +#define __CRS_RELEASE_RESET __HAL_RCC_CRS_RELEASE_RESET +#define __RCC_BACKUPRESET_FORCE __HAL_RCC_BACKUPRESET_FORCE +#define __RCC_BACKUPRESET_RELEASE __HAL_RCC_BACKUPRESET_RELEASE + +#define __USB_OTG_FS_FORCE_RESET __HAL_RCC_USB_OTG_FS_FORCE_RESET +#define __USB_OTG_FS_RELEASE_RESET __HAL_RCC_USB_OTG_FS_RELEASE_RESET +#define __USB_OTG_FS_CLK_SLEEP_ENABLE __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE +#define __USB_OTG_FS_CLK_SLEEP_DISABLE __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE +#define __USB_OTG_HS_CLK_DISABLE __HAL_RCC_USB_OTG_HS_CLK_DISABLE +#define __USB_OTG_HS_CLK_ENABLE __HAL_RCC_USB_OTG_HS_CLK_ENABLE +#define __USB_OTG_HS_ULPI_CLK_ENABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE +#define __USB_OTG_HS_ULPI_CLK_DISABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE +#define __TIM9_CLK_SLEEP_ENABLE __HAL_RCC_TIM9_CLK_SLEEP_ENABLE +#define __TIM9_CLK_SLEEP_DISABLE __HAL_RCC_TIM9_CLK_SLEEP_DISABLE +#define __TIM10_CLK_SLEEP_ENABLE __HAL_RCC_TIM10_CLK_SLEEP_ENABLE +#define __TIM10_CLK_SLEEP_DISABLE __HAL_RCC_TIM10_CLK_SLEEP_DISABLE +#define __TIM11_CLK_SLEEP_ENABLE __HAL_RCC_TIM11_CLK_SLEEP_ENABLE +#define __TIM11_CLK_SLEEP_DISABLE __HAL_RCC_TIM11_CLK_SLEEP_DISABLE +#define __ETHMACPTP_CLK_SLEEP_ENABLE __HAL_RCC_ETHMACPTP_CLK_SLEEP_ENABLE +#define __ETHMACPTP_CLK_SLEEP_DISABLE __HAL_RCC_ETHMACPTP_CLK_SLEEP_DISABLE +#define __ETHMACPTP_CLK_ENABLE __HAL_RCC_ETHMACPTP_CLK_ENABLE +#define __ETHMACPTP_CLK_DISABLE __HAL_RCC_ETHMACPTP_CLK_DISABLE +#define __HASH_CLK_ENABLE __HAL_RCC_HASH_CLK_ENABLE +#define __HASH_FORCE_RESET __HAL_RCC_HASH_FORCE_RESET +#define __HASH_RELEASE_RESET __HAL_RCC_HASH_RELEASE_RESET +#define __HASH_CLK_SLEEP_ENABLE __HAL_RCC_HASH_CLK_SLEEP_ENABLE +#define __HASH_CLK_SLEEP_DISABLE __HAL_RCC_HASH_CLK_SLEEP_DISABLE +#define __HASH_CLK_DISABLE __HAL_RCC_HASH_CLK_DISABLE +#define __SPI5_CLK_ENABLE __HAL_RCC_SPI5_CLK_ENABLE +#define __SPI5_CLK_DISABLE __HAL_RCC_SPI5_CLK_DISABLE +#define __SPI5_FORCE_RESET __HAL_RCC_SPI5_FORCE_RESET +#define __SPI5_RELEASE_RESET __HAL_RCC_SPI5_RELEASE_RESET +#define __SPI5_CLK_SLEEP_ENABLE __HAL_RCC_SPI5_CLK_SLEEP_ENABLE +#define __SPI5_CLK_SLEEP_DISABLE __HAL_RCC_SPI5_CLK_SLEEP_DISABLE +#define __SPI6_CLK_ENABLE __HAL_RCC_SPI6_CLK_ENABLE +#define __SPI6_CLK_DISABLE __HAL_RCC_SPI6_CLK_DISABLE +#define __SPI6_FORCE_RESET __HAL_RCC_SPI6_FORCE_RESET +#define __SPI6_RELEASE_RESET __HAL_RCC_SPI6_RELEASE_RESET +#define __SPI6_CLK_SLEEP_ENABLE __HAL_RCC_SPI6_CLK_SLEEP_ENABLE +#define __SPI6_CLK_SLEEP_DISABLE __HAL_RCC_SPI6_CLK_SLEEP_DISABLE +#define __LTDC_CLK_ENABLE __HAL_RCC_LTDC_CLK_ENABLE +#define __LTDC_CLK_DISABLE __HAL_RCC_LTDC_CLK_DISABLE +#define __LTDC_FORCE_RESET __HAL_RCC_LTDC_FORCE_RESET +#define __LTDC_RELEASE_RESET __HAL_RCC_LTDC_RELEASE_RESET +#define __LTDC_CLK_SLEEP_ENABLE __HAL_RCC_LTDC_CLK_SLEEP_ENABLE +#define __ETHMAC_CLK_SLEEP_ENABLE __HAL_RCC_ETHMAC_CLK_SLEEP_ENABLE +#define __ETHMAC_CLK_SLEEP_DISABLE __HAL_RCC_ETHMAC_CLK_SLEEP_DISABLE +#define __ETHMACTX_CLK_SLEEP_ENABLE __HAL_RCC_ETHMACTX_CLK_SLEEP_ENABLE +#define __ETHMACTX_CLK_SLEEP_DISABLE __HAL_RCC_ETHMACTX_CLK_SLEEP_DISABLE +#define __ETHMACRX_CLK_SLEEP_ENABLE __HAL_RCC_ETHMACRX_CLK_SLEEP_ENABLE +#define __ETHMACRX_CLK_SLEEP_DISABLE __HAL_RCC_ETHMACRX_CLK_SLEEP_DISABLE +#define __TIM12_CLK_SLEEP_ENABLE __HAL_RCC_TIM12_CLK_SLEEP_ENABLE +#define __TIM12_CLK_SLEEP_DISABLE __HAL_RCC_TIM12_CLK_SLEEP_DISABLE +#define __TIM13_CLK_SLEEP_ENABLE __HAL_RCC_TIM13_CLK_SLEEP_ENABLE +#define __TIM13_CLK_SLEEP_DISABLE __HAL_RCC_TIM13_CLK_SLEEP_DISABLE +#define __TIM14_CLK_SLEEP_ENABLE __HAL_RCC_TIM14_CLK_SLEEP_ENABLE +#define __TIM14_CLK_SLEEP_DISABLE __HAL_RCC_TIM14_CLK_SLEEP_DISABLE +#define __BKPSRAM_CLK_ENABLE __HAL_RCC_BKPSRAM_CLK_ENABLE +#define __BKPSRAM_CLK_DISABLE __HAL_RCC_BKPSRAM_CLK_DISABLE +#define __BKPSRAM_CLK_SLEEP_ENABLE __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE +#define __BKPSRAM_CLK_SLEEP_DISABLE __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE +#define __CCMDATARAMEN_CLK_ENABLE __HAL_RCC_CCMDATARAMEN_CLK_ENABLE +#define __CCMDATARAMEN_CLK_DISABLE __HAL_RCC_CCMDATARAMEN_CLK_DISABLE +#define __USART6_CLK_ENABLE __HAL_RCC_USART6_CLK_ENABLE +#define __USART6_CLK_DISABLE __HAL_RCC_USART6_CLK_DISABLE +#define __USART6_FORCE_RESET __HAL_RCC_USART6_FORCE_RESET +#define __USART6_RELEASE_RESET __HAL_RCC_USART6_RELEASE_RESET +#define __USART6_CLK_SLEEP_ENABLE __HAL_RCC_USART6_CLK_SLEEP_ENABLE +#define __USART6_CLK_SLEEP_DISABLE __HAL_RCC_USART6_CLK_SLEEP_DISABLE +#define __SPI4_CLK_ENABLE __HAL_RCC_SPI4_CLK_ENABLE +#define __SPI4_CLK_DISABLE __HAL_RCC_SPI4_CLK_DISABLE +#define __SPI4_FORCE_RESET __HAL_RCC_SPI4_FORCE_RESET +#define __SPI4_RELEASE_RESET __HAL_RCC_SPI4_RELEASE_RESET +#define __SPI4_CLK_SLEEP_ENABLE __HAL_RCC_SPI4_CLK_SLEEP_ENABLE +#define __SPI4_CLK_SLEEP_DISABLE __HAL_RCC_SPI4_CLK_SLEEP_DISABLE +#define __GPIOI_CLK_ENABLE __HAL_RCC_GPIOI_CLK_ENABLE +#define __GPIOI_CLK_DISABLE __HAL_RCC_GPIOI_CLK_DISABLE +#define __GPIOI_FORCE_RESET __HAL_RCC_GPIOI_FORCE_RESET +#define __GPIOI_RELEASE_RESET __HAL_RCC_GPIOI_RELEASE_RESET +#define __GPIOI_CLK_SLEEP_ENABLE __HAL_RCC_GPIOI_CLK_SLEEP_ENABLE +#define __GPIOI_CLK_SLEEP_DISABLE __HAL_RCC_GPIOI_CLK_SLEEP_DISABLE +#define __GPIOJ_CLK_ENABLE __HAL_RCC_GPIOJ_CLK_ENABLE +#define __GPIOJ_CLK_DISABLE __HAL_RCC_GPIOJ_CLK_DISABLE +#define __GPIOJ_FORCE_RESET __HAL_RCC_GPIOJ_FORCE_RESET +#define __GPIOJ_RELEASE_RESET __HAL_RCC_GPIOJ_RELEASE_RESET +#define __GPIOJ_CLK_SLEEP_ENABLE __HAL_RCC_GPIOJ_CLK_SLEEP_ENABLE +#define __GPIOJ_CLK_SLEEP_DISABLE __HAL_RCC_GPIOJ_CLK_SLEEP_DISABLE +#define __GPIOK_CLK_ENABLE __HAL_RCC_GPIOK_CLK_ENABLE +#define __GPIOK_CLK_DISABLE __HAL_RCC_GPIOK_CLK_DISABLE +#define __GPIOK_RELEASE_RESET __HAL_RCC_GPIOK_RELEASE_RESET +#define __GPIOK_CLK_SLEEP_ENABLE __HAL_RCC_GPIOK_CLK_SLEEP_ENABLE +#define __GPIOK_CLK_SLEEP_DISABLE __HAL_RCC_GPIOK_CLK_SLEEP_DISABLE +#define __ETH_CLK_ENABLE __HAL_RCC_ETH_CLK_ENABLE +#define __ETH_CLK_DISABLE __HAL_RCC_ETH_CLK_DISABLE +#define __DCMI_CLK_ENABLE __HAL_RCC_DCMI_CLK_ENABLE +#define __DCMI_CLK_DISABLE __HAL_RCC_DCMI_CLK_DISABLE +#define __DCMI_FORCE_RESET __HAL_RCC_DCMI_FORCE_RESET +#define __DCMI_RELEASE_RESET __HAL_RCC_DCMI_RELEASE_RESET +#define __DCMI_CLK_SLEEP_ENABLE __HAL_RCC_DCMI_CLK_SLEEP_ENABLE +#define __DCMI_CLK_SLEEP_DISABLE __HAL_RCC_DCMI_CLK_SLEEP_DISABLE +#define __UART7_CLK_ENABLE __HAL_RCC_UART7_CLK_ENABLE +#define __UART7_CLK_DISABLE __HAL_RCC_UART7_CLK_DISABLE +#define __UART7_RELEASE_RESET __HAL_RCC_UART7_RELEASE_RESET +#define __UART7_FORCE_RESET __HAL_RCC_UART7_FORCE_RESET +#define __UART7_CLK_SLEEP_ENABLE __HAL_RCC_UART7_CLK_SLEEP_ENABLE +#define __UART7_CLK_SLEEP_DISABLE __HAL_RCC_UART7_CLK_SLEEP_DISABLE +#define __UART8_CLK_ENABLE __HAL_RCC_UART8_CLK_ENABLE +#define __UART8_CLK_DISABLE __HAL_RCC_UART8_CLK_DISABLE +#define __UART8_FORCE_RESET __HAL_RCC_UART8_FORCE_RESET +#define __UART8_RELEASE_RESET __HAL_RCC_UART8_RELEASE_RESET +#define __UART8_CLK_SLEEP_ENABLE __HAL_RCC_UART8_CLK_SLEEP_ENABLE +#define __UART8_CLK_SLEEP_DISABLE __HAL_RCC_UART8_CLK_SLEEP_DISABLE +#define __OTGHS_CLK_SLEEP_ENABLE __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE +#define __OTGHS_CLK_SLEEP_DISABLE __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE +#define __OTGHS_FORCE_RESET __HAL_RCC_USB_OTG_HS_FORCE_RESET +#define __OTGHS_RELEASE_RESET __HAL_RCC_USB_OTG_HS_RELEASE_RESET +#define __OTGHSULPI_CLK_SLEEP_ENABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE +#define __OTGHSULPI_CLK_SLEEP_DISABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE +#define __HAL_RCC_OTGHS_CLK_SLEEP_ENABLE __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE +#define __HAL_RCC_OTGHS_CLK_SLEEP_DISABLE __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE +#define __HAL_RCC_OTGHS_IS_CLK_SLEEP_ENABLED __HAL_RCC_USB_OTG_HS_IS_CLK_SLEEP_ENABLED +#define __HAL_RCC_OTGHS_IS_CLK_SLEEP_DISABLED __HAL_RCC_USB_OTG_HS_IS_CLK_SLEEP_DISABLED +#define __HAL_RCC_OTGHS_FORCE_RESET __HAL_RCC_USB_OTG_HS_FORCE_RESET +#define __HAL_RCC_OTGHS_RELEASE_RESET __HAL_RCC_USB_OTG_HS_RELEASE_RESET +#define __HAL_RCC_OTGHSULPI_CLK_SLEEP_ENABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE +#define __HAL_RCC_OTGHSULPI_CLK_SLEEP_DISABLE __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE +#define __HAL_RCC_OTGHSULPI_IS_CLK_SLEEP_ENABLED __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_SLEEP_ENABLED +#define __HAL_RCC_OTGHSULPI_IS_CLK_SLEEP_DISABLED __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_SLEEP_DISABLED +#define __SRAM3_CLK_SLEEP_ENABLE __HAL_RCC_SRAM3_CLK_SLEEP_ENABLE +#define __CAN2_CLK_SLEEP_ENABLE __HAL_RCC_CAN2_CLK_SLEEP_ENABLE +#define __CAN2_CLK_SLEEP_DISABLE __HAL_RCC_CAN2_CLK_SLEEP_DISABLE +#define __DAC_CLK_SLEEP_ENABLE __HAL_RCC_DAC_CLK_SLEEP_ENABLE +#define __DAC_CLK_SLEEP_DISABLE __HAL_RCC_DAC_CLK_SLEEP_DISABLE +#define __ADC2_CLK_SLEEP_ENABLE __HAL_RCC_ADC2_CLK_SLEEP_ENABLE +#define __ADC2_CLK_SLEEP_DISABLE __HAL_RCC_ADC2_CLK_SLEEP_DISABLE +#define __ADC3_CLK_SLEEP_ENABLE __HAL_RCC_ADC3_CLK_SLEEP_ENABLE +#define __ADC3_CLK_SLEEP_DISABLE __HAL_RCC_ADC3_CLK_SLEEP_DISABLE +#define __FSMC_FORCE_RESET __HAL_RCC_FSMC_FORCE_RESET +#define __FSMC_RELEASE_RESET __HAL_RCC_FSMC_RELEASE_RESET +#define __FSMC_CLK_SLEEP_ENABLE __HAL_RCC_FSMC_CLK_SLEEP_ENABLE +#define __FSMC_CLK_SLEEP_DISABLE __HAL_RCC_FSMC_CLK_SLEEP_DISABLE +#define __SDIO_FORCE_RESET __HAL_RCC_SDIO_FORCE_RESET +#define __SDIO_RELEASE_RESET __HAL_RCC_SDIO_RELEASE_RESET +#define __SDIO_CLK_SLEEP_DISABLE __HAL_RCC_SDIO_CLK_SLEEP_DISABLE +#define __SDIO_CLK_SLEEP_ENABLE __HAL_RCC_SDIO_CLK_SLEEP_ENABLE +#define __DMA2D_CLK_ENABLE __HAL_RCC_DMA2D_CLK_ENABLE +#define __DMA2D_CLK_DISABLE __HAL_RCC_DMA2D_CLK_DISABLE +#define __DMA2D_FORCE_RESET __HAL_RCC_DMA2D_FORCE_RESET +#define __DMA2D_RELEASE_RESET __HAL_RCC_DMA2D_RELEASE_RESET +#define __DMA2D_CLK_SLEEP_ENABLE __HAL_RCC_DMA2D_CLK_SLEEP_ENABLE +#define __DMA2D_CLK_SLEEP_DISABLE __HAL_RCC_DMA2D_CLK_SLEEP_DISABLE + +/* alias define maintained for legacy */ +#define __HAL_RCC_OTGFS_FORCE_RESET __HAL_RCC_USB_OTG_FS_FORCE_RESET +#define __HAL_RCC_OTGFS_RELEASE_RESET __HAL_RCC_USB_OTG_FS_RELEASE_RESET + +#define __ADC12_CLK_ENABLE __HAL_RCC_ADC12_CLK_ENABLE +#define __ADC12_CLK_DISABLE __HAL_RCC_ADC12_CLK_DISABLE +#define __ADC34_CLK_ENABLE __HAL_RCC_ADC34_CLK_ENABLE +#define __ADC34_CLK_DISABLE __HAL_RCC_ADC34_CLK_DISABLE +#define __DAC2_CLK_ENABLE __HAL_RCC_DAC2_CLK_ENABLE +#define __DAC2_CLK_DISABLE __HAL_RCC_DAC2_CLK_DISABLE +#define __TIM18_CLK_ENABLE __HAL_RCC_TIM18_CLK_ENABLE +#define __TIM18_CLK_DISABLE __HAL_RCC_TIM18_CLK_DISABLE +#define __TIM19_CLK_ENABLE __HAL_RCC_TIM19_CLK_ENABLE +#define __TIM19_CLK_DISABLE __HAL_RCC_TIM19_CLK_DISABLE +#define __TIM20_CLK_ENABLE __HAL_RCC_TIM20_CLK_ENABLE +#define __TIM20_CLK_DISABLE __HAL_RCC_TIM20_CLK_DISABLE +#define __HRTIM1_CLK_ENABLE __HAL_RCC_HRTIM1_CLK_ENABLE +#define __HRTIM1_CLK_DISABLE __HAL_RCC_HRTIM1_CLK_DISABLE +#define __SDADC1_CLK_ENABLE __HAL_RCC_SDADC1_CLK_ENABLE +#define __SDADC2_CLK_ENABLE __HAL_RCC_SDADC2_CLK_ENABLE +#define __SDADC3_CLK_ENABLE __HAL_RCC_SDADC3_CLK_ENABLE +#define __SDADC1_CLK_DISABLE __HAL_RCC_SDADC1_CLK_DISABLE +#define __SDADC2_CLK_DISABLE __HAL_RCC_SDADC2_CLK_DISABLE +#define __SDADC3_CLK_DISABLE __HAL_RCC_SDADC3_CLK_DISABLE + +#define __ADC12_FORCE_RESET __HAL_RCC_ADC12_FORCE_RESET +#define __ADC12_RELEASE_RESET __HAL_RCC_ADC12_RELEASE_RESET +#define __ADC34_FORCE_RESET __HAL_RCC_ADC34_FORCE_RESET +#define __ADC34_RELEASE_RESET __HAL_RCC_ADC34_RELEASE_RESET +#define __DAC2_FORCE_RESET __HAL_RCC_DAC2_FORCE_RESET +#define __DAC2_RELEASE_RESET __HAL_RCC_DAC2_RELEASE_RESET +#define __TIM18_FORCE_RESET __HAL_RCC_TIM18_FORCE_RESET +#define __TIM18_RELEASE_RESET __HAL_RCC_TIM18_RELEASE_RESET +#define __TIM19_FORCE_RESET __HAL_RCC_TIM19_FORCE_RESET +#define __TIM19_RELEASE_RESET __HAL_RCC_TIM19_RELEASE_RESET +#define __TIM20_FORCE_RESET __HAL_RCC_TIM20_FORCE_RESET +#define __TIM20_RELEASE_RESET __HAL_RCC_TIM20_RELEASE_RESET +#define __HRTIM1_FORCE_RESET __HAL_RCC_HRTIM1_FORCE_RESET +#define __HRTIM1_RELEASE_RESET __HAL_RCC_HRTIM1_RELEASE_RESET +#define __SDADC1_FORCE_RESET __HAL_RCC_SDADC1_FORCE_RESET +#define __SDADC2_FORCE_RESET __HAL_RCC_SDADC2_FORCE_RESET +#define __SDADC3_FORCE_RESET __HAL_RCC_SDADC3_FORCE_RESET +#define __SDADC1_RELEASE_RESET __HAL_RCC_SDADC1_RELEASE_RESET +#define __SDADC2_RELEASE_RESET __HAL_RCC_SDADC2_RELEASE_RESET +#define __SDADC3_RELEASE_RESET __HAL_RCC_SDADC3_RELEASE_RESET + +#define __ADC1_IS_CLK_ENABLED __HAL_RCC_ADC1_IS_CLK_ENABLED +#define __ADC1_IS_CLK_DISABLED __HAL_RCC_ADC1_IS_CLK_DISABLED +#define __ADC12_IS_CLK_ENABLED __HAL_RCC_ADC12_IS_CLK_ENABLED +#define __ADC12_IS_CLK_DISABLED __HAL_RCC_ADC12_IS_CLK_DISABLED +#define __ADC34_IS_CLK_ENABLED __HAL_RCC_ADC34_IS_CLK_ENABLED +#define __ADC34_IS_CLK_DISABLED __HAL_RCC_ADC34_IS_CLK_DISABLED +#define __CEC_IS_CLK_ENABLED __HAL_RCC_CEC_IS_CLK_ENABLED +#define __CEC_IS_CLK_DISABLED __HAL_RCC_CEC_IS_CLK_DISABLED +#define __CRC_IS_CLK_ENABLED __HAL_RCC_CRC_IS_CLK_ENABLED +#define __CRC_IS_CLK_DISABLED __HAL_RCC_CRC_IS_CLK_DISABLED +#define __DAC1_IS_CLK_ENABLED __HAL_RCC_DAC1_IS_CLK_ENABLED +#define __DAC1_IS_CLK_DISABLED __HAL_RCC_DAC1_IS_CLK_DISABLED +#define __DAC2_IS_CLK_ENABLED __HAL_RCC_DAC2_IS_CLK_ENABLED +#define __DAC2_IS_CLK_DISABLED __HAL_RCC_DAC2_IS_CLK_DISABLED +#define __DMA1_IS_CLK_ENABLED __HAL_RCC_DMA1_IS_CLK_ENABLED +#define __DMA1_IS_CLK_DISABLED __HAL_RCC_DMA1_IS_CLK_DISABLED +#define __DMA2_IS_CLK_ENABLED __HAL_RCC_DMA2_IS_CLK_ENABLED +#define __DMA2_IS_CLK_DISABLED __HAL_RCC_DMA2_IS_CLK_DISABLED +#define __FLITF_IS_CLK_ENABLED __HAL_RCC_FLITF_IS_CLK_ENABLED +#define __FLITF_IS_CLK_DISABLED __HAL_RCC_FLITF_IS_CLK_DISABLED +#define __FMC_IS_CLK_ENABLED __HAL_RCC_FMC_IS_CLK_ENABLED +#define __FMC_IS_CLK_DISABLED __HAL_RCC_FMC_IS_CLK_DISABLED +#define __GPIOA_IS_CLK_ENABLED __HAL_RCC_GPIOA_IS_CLK_ENABLED +#define __GPIOA_IS_CLK_DISABLED __HAL_RCC_GPIOA_IS_CLK_DISABLED +#define __GPIOB_IS_CLK_ENABLED __HAL_RCC_GPIOB_IS_CLK_ENABLED +#define __GPIOB_IS_CLK_DISABLED __HAL_RCC_GPIOB_IS_CLK_DISABLED +#define __GPIOC_IS_CLK_ENABLED __HAL_RCC_GPIOC_IS_CLK_ENABLED +#define __GPIOC_IS_CLK_DISABLED __HAL_RCC_GPIOC_IS_CLK_DISABLED +#define __GPIOD_IS_CLK_ENABLED __HAL_RCC_GPIOD_IS_CLK_ENABLED +#define __GPIOD_IS_CLK_DISABLED __HAL_RCC_GPIOD_IS_CLK_DISABLED +#define __GPIOE_IS_CLK_ENABLED __HAL_RCC_GPIOE_IS_CLK_ENABLED +#define __GPIOE_IS_CLK_DISABLED __HAL_RCC_GPIOE_IS_CLK_DISABLED +#define __GPIOF_IS_CLK_ENABLED __HAL_RCC_GPIOF_IS_CLK_ENABLED +#define __GPIOF_IS_CLK_DISABLED __HAL_RCC_GPIOF_IS_CLK_DISABLED +#define __GPIOG_IS_CLK_ENABLED __HAL_RCC_GPIOG_IS_CLK_ENABLED +#define __GPIOG_IS_CLK_DISABLED __HAL_RCC_GPIOG_IS_CLK_DISABLED +#define __GPIOH_IS_CLK_ENABLED __HAL_RCC_GPIOH_IS_CLK_ENABLED +#define __GPIOH_IS_CLK_DISABLED __HAL_RCC_GPIOH_IS_CLK_DISABLED +#define __HRTIM1_IS_CLK_ENABLED __HAL_RCC_HRTIM1_IS_CLK_ENABLED +#define __HRTIM1_IS_CLK_DISABLED __HAL_RCC_HRTIM1_IS_CLK_DISABLED +#define __I2C1_IS_CLK_ENABLED __HAL_RCC_I2C1_IS_CLK_ENABLED +#define __I2C1_IS_CLK_DISABLED __HAL_RCC_I2C1_IS_CLK_DISABLED +#define __I2C2_IS_CLK_ENABLED __HAL_RCC_I2C2_IS_CLK_ENABLED +#define __I2C2_IS_CLK_DISABLED __HAL_RCC_I2C2_IS_CLK_DISABLED +#define __I2C3_IS_CLK_ENABLED __HAL_RCC_I2C3_IS_CLK_ENABLED +#define __I2C3_IS_CLK_DISABLED __HAL_RCC_I2C3_IS_CLK_DISABLED +#define __PWR_IS_CLK_ENABLED __HAL_RCC_PWR_IS_CLK_ENABLED +#define __PWR_IS_CLK_DISABLED __HAL_RCC_PWR_IS_CLK_DISABLED +#define __SYSCFG_IS_CLK_ENABLED __HAL_RCC_SYSCFG_IS_CLK_ENABLED +#define __SYSCFG_IS_CLK_DISABLED __HAL_RCC_SYSCFG_IS_CLK_DISABLED +#define __SPI1_IS_CLK_ENABLED __HAL_RCC_SPI1_IS_CLK_ENABLED +#define __SPI1_IS_CLK_DISABLED __HAL_RCC_SPI1_IS_CLK_DISABLED +#define __SPI2_IS_CLK_ENABLED __HAL_RCC_SPI2_IS_CLK_ENABLED +#define __SPI2_IS_CLK_DISABLED __HAL_RCC_SPI2_IS_CLK_DISABLED +#define __SPI3_IS_CLK_ENABLED __HAL_RCC_SPI3_IS_CLK_ENABLED +#define __SPI3_IS_CLK_DISABLED __HAL_RCC_SPI3_IS_CLK_DISABLED +#define __SPI4_IS_CLK_ENABLED __HAL_RCC_SPI4_IS_CLK_ENABLED +#define __SPI4_IS_CLK_DISABLED __HAL_RCC_SPI4_IS_CLK_DISABLED +#define __SDADC1_IS_CLK_ENABLED __HAL_RCC_SDADC1_IS_CLK_ENABLED +#define __SDADC1_IS_CLK_DISABLED __HAL_RCC_SDADC1_IS_CLK_DISABLED +#define __SDADC2_IS_CLK_ENABLED __HAL_RCC_SDADC2_IS_CLK_ENABLED +#define __SDADC2_IS_CLK_DISABLED __HAL_RCC_SDADC2_IS_CLK_DISABLED +#define __SDADC3_IS_CLK_ENABLED __HAL_RCC_SDADC3_IS_CLK_ENABLED +#define __SDADC3_IS_CLK_DISABLED __HAL_RCC_SDADC3_IS_CLK_DISABLED +#define __SRAM_IS_CLK_ENABLED __HAL_RCC_SRAM_IS_CLK_ENABLED +#define __SRAM_IS_CLK_DISABLED __HAL_RCC_SRAM_IS_CLK_DISABLED +#define __TIM1_IS_CLK_ENABLED __HAL_RCC_TIM1_IS_CLK_ENABLED +#define __TIM1_IS_CLK_DISABLED __HAL_RCC_TIM1_IS_CLK_DISABLED +#define __TIM2_IS_CLK_ENABLED __HAL_RCC_TIM2_IS_CLK_ENABLED +#define __TIM2_IS_CLK_DISABLED __HAL_RCC_TIM2_IS_CLK_DISABLED +#define __TIM3_IS_CLK_ENABLED __HAL_RCC_TIM3_IS_CLK_ENABLED +#define __TIM3_IS_CLK_DISABLED __HAL_RCC_TIM3_IS_CLK_DISABLED +#define __TIM4_IS_CLK_ENABLED __HAL_RCC_TIM4_IS_CLK_ENABLED +#define __TIM4_IS_CLK_DISABLED __HAL_RCC_TIM4_IS_CLK_DISABLED +#define __TIM5_IS_CLK_ENABLED __HAL_RCC_TIM5_IS_CLK_ENABLED +#define __TIM5_IS_CLK_DISABLED __HAL_RCC_TIM5_IS_CLK_DISABLED +#define __TIM6_IS_CLK_ENABLED __HAL_RCC_TIM6_IS_CLK_ENABLED +#define __TIM6_IS_CLK_DISABLED __HAL_RCC_TIM6_IS_CLK_DISABLED +#define __TIM7_IS_CLK_ENABLED __HAL_RCC_TIM7_IS_CLK_ENABLED +#define __TIM7_IS_CLK_DISABLED __HAL_RCC_TIM7_IS_CLK_DISABLED +#define __TIM8_IS_CLK_ENABLED __HAL_RCC_TIM8_IS_CLK_ENABLED +#define __TIM8_IS_CLK_DISABLED __HAL_RCC_TIM8_IS_CLK_DISABLED +#define __TIM12_IS_CLK_ENABLED __HAL_RCC_TIM12_IS_CLK_ENABLED +#define __TIM12_IS_CLK_DISABLED __HAL_RCC_TIM12_IS_CLK_DISABLED +#define __TIM13_IS_CLK_ENABLED __HAL_RCC_TIM13_IS_CLK_ENABLED +#define __TIM13_IS_CLK_DISABLED __HAL_RCC_TIM13_IS_CLK_DISABLED +#define __TIM14_IS_CLK_ENABLED __HAL_RCC_TIM14_IS_CLK_ENABLED +#define __TIM14_IS_CLK_DISABLED __HAL_RCC_TIM14_IS_CLK_DISABLED +#define __TIM15_IS_CLK_ENABLED __HAL_RCC_TIM15_IS_CLK_ENABLED +#define __TIM15_IS_CLK_DISABLED __HAL_RCC_TIM15_IS_CLK_DISABLED +#define __TIM16_IS_CLK_ENABLED __HAL_RCC_TIM16_IS_CLK_ENABLED +#define __TIM16_IS_CLK_DISABLED __HAL_RCC_TIM16_IS_CLK_DISABLED +#define __TIM17_IS_CLK_ENABLED __HAL_RCC_TIM17_IS_CLK_ENABLED +#define __TIM17_IS_CLK_DISABLED __HAL_RCC_TIM17_IS_CLK_DISABLED +#define __TIM18_IS_CLK_ENABLED __HAL_RCC_TIM18_IS_CLK_ENABLED +#define __TIM18_IS_CLK_DISABLED __HAL_RCC_TIM18_IS_CLK_DISABLED +#define __TIM19_IS_CLK_ENABLED __HAL_RCC_TIM19_IS_CLK_ENABLED +#define __TIM19_IS_CLK_DISABLED __HAL_RCC_TIM19_IS_CLK_DISABLED +#define __TIM20_IS_CLK_ENABLED __HAL_RCC_TIM20_IS_CLK_ENABLED +#define __TIM20_IS_CLK_DISABLED __HAL_RCC_TIM20_IS_CLK_DISABLED +#define __TSC_IS_CLK_ENABLED __HAL_RCC_TSC_IS_CLK_ENABLED +#define __TSC_IS_CLK_DISABLED __HAL_RCC_TSC_IS_CLK_DISABLED +#define __UART4_IS_CLK_ENABLED __HAL_RCC_UART4_IS_CLK_ENABLED +#define __UART4_IS_CLK_DISABLED __HAL_RCC_UART4_IS_CLK_DISABLED +#define __UART5_IS_CLK_ENABLED __HAL_RCC_UART5_IS_CLK_ENABLED +#define __UART5_IS_CLK_DISABLED __HAL_RCC_UART5_IS_CLK_DISABLED +#define __USART1_IS_CLK_ENABLED __HAL_RCC_USART1_IS_CLK_ENABLED +#define __USART1_IS_CLK_DISABLED __HAL_RCC_USART1_IS_CLK_DISABLED +#define __USART2_IS_CLK_ENABLED __HAL_RCC_USART2_IS_CLK_ENABLED +#define __USART2_IS_CLK_DISABLED __HAL_RCC_USART2_IS_CLK_DISABLED +#define __USART3_IS_CLK_ENABLED __HAL_RCC_USART3_IS_CLK_ENABLED +#define __USART3_IS_CLK_DISABLED __HAL_RCC_USART3_IS_CLK_DISABLED +#define __USB_IS_CLK_ENABLED __HAL_RCC_USB_IS_CLK_ENABLED +#define __USB_IS_CLK_DISABLED __HAL_RCC_USB_IS_CLK_DISABLED +#define __WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG_IS_CLK_ENABLED +#define __WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG_IS_CLK_DISABLED + +#if defined(STM32L1) +#define __HAL_RCC_CRYP_CLK_DISABLE __HAL_RCC_AES_CLK_DISABLE +#define __HAL_RCC_CRYP_CLK_ENABLE __HAL_RCC_AES_CLK_ENABLE +#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE __HAL_RCC_AES_CLK_SLEEP_DISABLE +#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE __HAL_RCC_AES_CLK_SLEEP_ENABLE +#define __HAL_RCC_CRYP_FORCE_RESET __HAL_RCC_AES_FORCE_RESET +#define __HAL_RCC_CRYP_RELEASE_RESET __HAL_RCC_AES_RELEASE_RESET +#endif /* STM32L1 */ + +#if defined(STM32F4) +#define __HAL_RCC_SDMMC1_FORCE_RESET __HAL_RCC_SDIO_FORCE_RESET +#define __HAL_RCC_SDMMC1_RELEASE_RESET __HAL_RCC_SDIO_RELEASE_RESET +#define __HAL_RCC_SDMMC1_CLK_SLEEP_ENABLE __HAL_RCC_SDIO_CLK_SLEEP_ENABLE +#define __HAL_RCC_SDMMC1_CLK_SLEEP_DISABLE __HAL_RCC_SDIO_CLK_SLEEP_DISABLE +#define __HAL_RCC_SDMMC1_CLK_ENABLE __HAL_RCC_SDIO_CLK_ENABLE +#define __HAL_RCC_SDMMC1_CLK_DISABLE __HAL_RCC_SDIO_CLK_DISABLE +#define __HAL_RCC_SDMMC1_IS_CLK_ENABLED __HAL_RCC_SDIO_IS_CLK_ENABLED +#define __HAL_RCC_SDMMC1_IS_CLK_DISABLED __HAL_RCC_SDIO_IS_CLK_DISABLED +#define Sdmmc1ClockSelection SdioClockSelection +#define RCC_PERIPHCLK_SDMMC1 RCC_PERIPHCLK_SDIO +#define RCC_SDMMC1CLKSOURCE_CLK48 RCC_SDIOCLKSOURCE_CK48 +#define RCC_SDMMC1CLKSOURCE_SYSCLK RCC_SDIOCLKSOURCE_SYSCLK +#define __HAL_RCC_SDMMC1_CONFIG __HAL_RCC_SDIO_CONFIG +#define __HAL_RCC_GET_SDMMC1_SOURCE __HAL_RCC_GET_SDIO_SOURCE +#endif + +#if defined(STM32F7) || defined(STM32L4) +#define __HAL_RCC_SDIO_FORCE_RESET __HAL_RCC_SDMMC1_FORCE_RESET +#define __HAL_RCC_SDIO_RELEASE_RESET __HAL_RCC_SDMMC1_RELEASE_RESET +#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE __HAL_RCC_SDMMC1_CLK_SLEEP_ENABLE +#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE __HAL_RCC_SDMMC1_CLK_SLEEP_DISABLE +#define __HAL_RCC_SDIO_CLK_ENABLE __HAL_RCC_SDMMC1_CLK_ENABLE +#define __HAL_RCC_SDIO_CLK_DISABLE __HAL_RCC_SDMMC1_CLK_DISABLE +#define __HAL_RCC_SDIO_IS_CLK_ENABLED __HAL_RCC_SDMMC1_IS_CLK_ENABLED +#define __HAL_RCC_SDIO_IS_CLK_DISABLED __HAL_RCC_SDMMC1_IS_CLK_DISABLED +#define SdioClockSelection Sdmmc1ClockSelection +#define RCC_PERIPHCLK_SDIO RCC_PERIPHCLK_SDMMC1 +#define __HAL_RCC_SDIO_CONFIG __HAL_RCC_SDMMC1_CONFIG +#define __HAL_RCC_GET_SDIO_SOURCE __HAL_RCC_GET_SDMMC1_SOURCE +#endif + +#if defined(STM32F7) +#define RCC_SDIOCLKSOURCE_CLK48 RCC_SDMMC1CLKSOURCE_CLK48 +#define RCC_SDIOCLKSOURCE_SYSCLK RCC_SDMMC1CLKSOURCE_SYSCLK +#endif + +#if defined(STM32H7) +#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() __HAL_RCC_USB1_OTG_HS_CLK_ENABLE() +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() __HAL_RCC_USB1_OTG_HS_ULPI_CLK_ENABLE() +#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() __HAL_RCC_USB1_OTG_HS_CLK_DISABLE() +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() __HAL_RCC_USB1_OTG_HS_ULPI_CLK_DISABLE() +#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() __HAL_RCC_USB1_OTG_HS_FORCE_RESET() +#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() __HAL_RCC_USB1_OTG_HS_RELEASE_RESET() +#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() __HAL_RCC_USB1_OTG_HS_CLK_SLEEP_ENABLE() +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() __HAL_RCC_USB1_OTG_HS_ULPI_CLK_SLEEP_ENABLE() +#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() __HAL_RCC_USB1_OTG_HS_CLK_SLEEP_DISABLE() +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() __HAL_RCC_USB1_OTG_HS_ULPI_CLK_SLEEP_DISABLE() + +#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() __HAL_RCC_USB2_OTG_FS_CLK_ENABLE() +#define __HAL_RCC_USB_OTG_FS_ULPI_CLK_ENABLE() __HAL_RCC_USB2_OTG_FS_ULPI_CLK_ENABLE() +#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() __HAL_RCC_USB2_OTG_FS_CLK_DISABLE() +#define __HAL_RCC_USB_OTG_FS_ULPI_CLK_DISABLE() __HAL_RCC_USB2_OTG_FS_ULPI_CLK_DISABLE() +#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() __HAL_RCC_USB2_OTG_FS_FORCE_RESET() +#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() __HAL_RCC_USB2_OTG_FS_RELEASE_RESET() +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() __HAL_RCC_USB2_OTG_FS_CLK_SLEEP_ENABLE() +#define __HAL_RCC_USB_OTG_FS_ULPI_CLK_SLEEP_ENABLE() __HAL_RCC_USB2_OTG_FS_ULPI_CLK_SLEEP_ENABLE() +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() __HAL_RCC_USB2_OTG_FS_CLK_SLEEP_DISABLE() +#define __HAL_RCC_USB_OTG_FS_ULPI_CLK_SLEEP_DISABLE() __HAL_RCC_USB2_OTG_FS_ULPI_CLK_SLEEP_DISABLE() +#endif + +#define __HAL_RCC_I2SCLK __HAL_RCC_I2S_CONFIG +#define __HAL_RCC_I2SCLK_CONFIG __HAL_RCC_I2S_CONFIG + +#define __RCC_PLLSRC RCC_GET_PLL_OSCSOURCE + +#define IS_RCC_MSIRANGE IS_RCC_MSI_CLOCK_RANGE +#define IS_RCC_RTCCLK_SOURCE IS_RCC_RTCCLKSOURCE +#define IS_RCC_SYSCLK_DIV IS_RCC_HCLK +#define IS_RCC_HCLK_DIV IS_RCC_PCLK +#define IS_RCC_PERIPHCLK IS_RCC_PERIPHCLOCK + +#define RCC_IT_HSI14 RCC_IT_HSI14RDY + +#define RCC_IT_CSSLSE RCC_IT_LSECSS +#define RCC_IT_CSSHSE RCC_IT_CSS + +#define RCC_PLLMUL_3 RCC_PLL_MUL3 +#define RCC_PLLMUL_4 RCC_PLL_MUL4 +#define RCC_PLLMUL_6 RCC_PLL_MUL6 +#define RCC_PLLMUL_8 RCC_PLL_MUL8 +#define RCC_PLLMUL_12 RCC_PLL_MUL12 +#define RCC_PLLMUL_16 RCC_PLL_MUL16 +#define RCC_PLLMUL_24 RCC_PLL_MUL24 +#define RCC_PLLMUL_32 RCC_PLL_MUL32 +#define RCC_PLLMUL_48 RCC_PLL_MUL48 + +#define RCC_PLLDIV_2 RCC_PLL_DIV2 +#define RCC_PLLDIV_3 RCC_PLL_DIV3 +#define RCC_PLLDIV_4 RCC_PLL_DIV4 + +#define IS_RCC_MCOSOURCE IS_RCC_MCO1SOURCE +#define __HAL_RCC_MCO_CONFIG __HAL_RCC_MCO1_CONFIG +#define RCC_MCO_NODIV RCC_MCODIV_1 +#define RCC_MCO_DIV1 RCC_MCODIV_1 +#define RCC_MCO_DIV2 RCC_MCODIV_2 +#define RCC_MCO_DIV4 RCC_MCODIV_4 +#define RCC_MCO_DIV8 RCC_MCODIV_8 +#define RCC_MCO_DIV16 RCC_MCODIV_16 +#define RCC_MCO_DIV32 RCC_MCODIV_32 +#define RCC_MCO_DIV64 RCC_MCODIV_64 +#define RCC_MCO_DIV128 RCC_MCODIV_128 +#define RCC_MCOSOURCE_NONE RCC_MCO1SOURCE_NOCLOCK +#define RCC_MCOSOURCE_LSI RCC_MCO1SOURCE_LSI +#define RCC_MCOSOURCE_LSE RCC_MCO1SOURCE_LSE +#define RCC_MCOSOURCE_SYSCLK RCC_MCO1SOURCE_SYSCLK +#define RCC_MCOSOURCE_HSI RCC_MCO1SOURCE_HSI +#define RCC_MCOSOURCE_HSI14 RCC_MCO1SOURCE_HSI14 +#define RCC_MCOSOURCE_HSI48 RCC_MCO1SOURCE_HSI48 +#define RCC_MCOSOURCE_HSE RCC_MCO1SOURCE_HSE +#define RCC_MCOSOURCE_PLLCLK_DIV1 RCC_MCO1SOURCE_PLLCLK +#define RCC_MCOSOURCE_PLLCLK_NODIV RCC_MCO1SOURCE_PLLCLK +#define RCC_MCOSOURCE_PLLCLK_DIV2 RCC_MCO1SOURCE_PLLCLK_DIV2 + +#if defined(STM32U0) +#define RCC_SYSCLKSOURCE_STATUS_PLLR RCC_SYSCLKSOURCE_STATUS_PLLCLK +#endif + +#if defined(STM32L4) || defined(STM32WB) || defined(STM32G0) || defined(STM32G4) || defined(STM32L5) || \ + defined(STM32WL) || defined(STM32C0) || defined(STM32N6) || defined(STM32H7RS) || \ + defined(STM32U0) +#define RCC_RTCCLKSOURCE_NO_CLK RCC_RTCCLKSOURCE_NONE +#else +#define RCC_RTCCLKSOURCE_NONE RCC_RTCCLKSOURCE_NO_CLK +#endif + +#define RCC_USBCLK_PLLSAI1 RCC_USBCLKSOURCE_PLLSAI1 +#define RCC_USBCLK_PLL RCC_USBCLKSOURCE_PLL +#define RCC_USBCLK_MSI RCC_USBCLKSOURCE_MSI +#define RCC_USBCLKSOURCE_PLLCLK RCC_USBCLKSOURCE_PLL +#define RCC_USBPLLCLK_DIV1 RCC_USBCLKSOURCE_PLL +#define RCC_USBPLLCLK_DIV1_5 RCC_USBCLKSOURCE_PLL_DIV1_5 +#define RCC_USBPLLCLK_DIV2 RCC_USBCLKSOURCE_PLL_DIV2 +#define RCC_USBPLLCLK_DIV3 RCC_USBCLKSOURCE_PLL_DIV3 + +#define HSION_BitNumber RCC_HSION_BIT_NUMBER +#define HSION_BITNUMBER RCC_HSION_BIT_NUMBER +#define HSEON_BitNumber RCC_HSEON_BIT_NUMBER +#define HSEON_BITNUMBER RCC_HSEON_BIT_NUMBER +#define MSION_BITNUMBER RCC_MSION_BIT_NUMBER +#define CSSON_BitNumber RCC_CSSON_BIT_NUMBER +#define CSSON_BITNUMBER RCC_CSSON_BIT_NUMBER +#define PLLON_BitNumber RCC_PLLON_BIT_NUMBER +#define PLLON_BITNUMBER RCC_PLLON_BIT_NUMBER +#define PLLI2SON_BitNumber RCC_PLLI2SON_BIT_NUMBER +#define I2SSRC_BitNumber RCC_I2SSRC_BIT_NUMBER +#define RTCEN_BitNumber RCC_RTCEN_BIT_NUMBER +#define RTCEN_BITNUMBER RCC_RTCEN_BIT_NUMBER +#define BDRST_BitNumber RCC_BDRST_BIT_NUMBER +#define BDRST_BITNUMBER RCC_BDRST_BIT_NUMBER +#define RTCRST_BITNUMBER RCC_RTCRST_BIT_NUMBER +#define LSION_BitNumber RCC_LSION_BIT_NUMBER +#define LSION_BITNUMBER RCC_LSION_BIT_NUMBER +#define LSEON_BitNumber RCC_LSEON_BIT_NUMBER +#define LSEON_BITNUMBER RCC_LSEON_BIT_NUMBER +#define LSEBYP_BITNUMBER RCC_LSEBYP_BIT_NUMBER +#define PLLSAION_BitNumber RCC_PLLSAION_BIT_NUMBER +#define TIMPRE_BitNumber RCC_TIMPRE_BIT_NUMBER +#define RMVF_BitNumber RCC_RMVF_BIT_NUMBER +#define RMVF_BITNUMBER RCC_RMVF_BIT_NUMBER +#define RCC_CR2_HSI14TRIM_BitNumber RCC_HSI14TRIM_BIT_NUMBER +#define CR_BYTE2_ADDRESS RCC_CR_BYTE2_ADDRESS +#define CIR_BYTE1_ADDRESS RCC_CIR_BYTE1_ADDRESS +#define CIR_BYTE2_ADDRESS RCC_CIR_BYTE2_ADDRESS +#define BDCR_BYTE0_ADDRESS RCC_BDCR_BYTE0_ADDRESS +#define DBP_TIMEOUT_VALUE RCC_DBP_TIMEOUT_VALUE +#define LSE_TIMEOUT_VALUE RCC_LSE_TIMEOUT_VALUE + +#define CR_HSION_BB RCC_CR_HSION_BB +#define CR_CSSON_BB RCC_CR_CSSON_BB +#define CR_PLLON_BB RCC_CR_PLLON_BB +#define CR_PLLI2SON_BB RCC_CR_PLLI2SON_BB +#define CR_MSION_BB RCC_CR_MSION_BB +#define CSR_LSION_BB RCC_CSR_LSION_BB +#define CSR_LSEON_BB RCC_CSR_LSEON_BB +#define CSR_LSEBYP_BB RCC_CSR_LSEBYP_BB +#define CSR_RTCEN_BB RCC_CSR_RTCEN_BB +#define CSR_RTCRST_BB RCC_CSR_RTCRST_BB +#define CFGR_I2SSRC_BB RCC_CFGR_I2SSRC_BB +#define BDCR_RTCEN_BB RCC_BDCR_RTCEN_BB +#define BDCR_BDRST_BB RCC_BDCR_BDRST_BB +#define CR_HSEON_BB RCC_CR_HSEON_BB +#define CSR_RMVF_BB RCC_CSR_RMVF_BB +#define CR_PLLSAION_BB RCC_CR_PLLSAION_BB +#define DCKCFGR_TIMPRE_BB RCC_DCKCFGR_TIMPRE_BB + +#define __HAL_RCC_CRS_ENABLE_FREQ_ERROR_COUNTER __HAL_RCC_CRS_FREQ_ERROR_COUNTER_ENABLE +#define __HAL_RCC_CRS_DISABLE_FREQ_ERROR_COUNTER __HAL_RCC_CRS_FREQ_ERROR_COUNTER_DISABLE +#define __HAL_RCC_CRS_ENABLE_AUTOMATIC_CALIB __HAL_RCC_CRS_AUTOMATIC_CALIB_ENABLE +#define __HAL_RCC_CRS_DISABLE_AUTOMATIC_CALIB __HAL_RCC_CRS_AUTOMATIC_CALIB_DISABLE +#define __HAL_RCC_CRS_CALCULATE_RELOADVALUE __HAL_RCC_CRS_RELOADVALUE_CALCULATE + +#define __HAL_RCC_GET_IT_SOURCE __HAL_RCC_GET_IT + +#define RCC_CRS_SYNCWARM RCC_CRS_SYNCWARN +#define RCC_CRS_TRIMOV RCC_CRS_TRIMOVF + +#define RCC_PERIPHCLK_CK48 RCC_PERIPHCLK_CLK48 +#define RCC_CK48CLKSOURCE_PLLQ RCC_CLK48CLKSOURCE_PLLQ +#define RCC_CK48CLKSOURCE_PLLSAIP RCC_CLK48CLKSOURCE_PLLSAIP +#define RCC_CK48CLKSOURCE_PLLI2SQ RCC_CLK48CLKSOURCE_PLLI2SQ +#define IS_RCC_CK48CLKSOURCE IS_RCC_CLK48CLKSOURCE +#define RCC_SDIOCLKSOURCE_CK48 RCC_SDIOCLKSOURCE_CLK48 + +#define __HAL_RCC_DFSDM_CLK_ENABLE __HAL_RCC_DFSDM1_CLK_ENABLE +#define __HAL_RCC_DFSDM_CLK_DISABLE __HAL_RCC_DFSDM1_CLK_DISABLE +#define __HAL_RCC_DFSDM_IS_CLK_ENABLED __HAL_RCC_DFSDM1_IS_CLK_ENABLED +#define __HAL_RCC_DFSDM_IS_CLK_DISABLED __HAL_RCC_DFSDM1_IS_CLK_DISABLED +#define __HAL_RCC_DFSDM_FORCE_RESET __HAL_RCC_DFSDM1_FORCE_RESET +#define __HAL_RCC_DFSDM_RELEASE_RESET __HAL_RCC_DFSDM1_RELEASE_RESET +#define __HAL_RCC_DFSDM_CLK_SLEEP_ENABLE __HAL_RCC_DFSDM1_CLK_SLEEP_ENABLE +#define __HAL_RCC_DFSDM_CLK_SLEEP_DISABLE __HAL_RCC_DFSDM1_CLK_SLEEP_DISABLE +#define __HAL_RCC_DFSDM_IS_CLK_SLEEP_ENABLED __HAL_RCC_DFSDM1_IS_CLK_SLEEP_ENABLED +#define __HAL_RCC_DFSDM_IS_CLK_SLEEP_DISABLED __HAL_RCC_DFSDM1_IS_CLK_SLEEP_DISABLED +#define DfsdmClockSelection Dfsdm1ClockSelection +#define RCC_PERIPHCLK_DFSDM RCC_PERIPHCLK_DFSDM1 +#define RCC_DFSDMCLKSOURCE_PCLK RCC_DFSDM1CLKSOURCE_PCLK2 +#define RCC_DFSDMCLKSOURCE_SYSCLK RCC_DFSDM1CLKSOURCE_SYSCLK +#define __HAL_RCC_DFSDM_CONFIG __HAL_RCC_DFSDM1_CONFIG +#define __HAL_RCC_GET_DFSDM_SOURCE __HAL_RCC_GET_DFSDM1_SOURCE +#define RCC_DFSDM1CLKSOURCE_PCLK RCC_DFSDM1CLKSOURCE_PCLK2 +#define RCC_SWPMI1CLKSOURCE_PCLK RCC_SWPMI1CLKSOURCE_PCLK1 +#if !defined(STM32U0) +#define RCC_LPTIM1CLKSOURCE_PCLK RCC_LPTIM1CLKSOURCE_PCLK1 +#define RCC_LPTIM2CLKSOURCE_PCLK RCC_LPTIM2CLKSOURCE_PCLK1 +#endif + +#define RCC_DFSDM1AUDIOCLKSOURCE_I2SAPB1 RCC_DFSDM1AUDIOCLKSOURCE_I2S1 +#define RCC_DFSDM1AUDIOCLKSOURCE_I2SAPB2 RCC_DFSDM1AUDIOCLKSOURCE_I2S2 +#define RCC_DFSDM2AUDIOCLKSOURCE_I2SAPB1 RCC_DFSDM2AUDIOCLKSOURCE_I2S1 +#define RCC_DFSDM2AUDIOCLKSOURCE_I2SAPB2 RCC_DFSDM2AUDIOCLKSOURCE_I2S2 +#define RCC_DFSDM1CLKSOURCE_APB2 RCC_DFSDM1CLKSOURCE_PCLK2 +#define RCC_DFSDM2CLKSOURCE_APB2 RCC_DFSDM2CLKSOURCE_PCLK2 +#define RCC_FMPI2C1CLKSOURCE_APB RCC_FMPI2C1CLKSOURCE_PCLK1 +#if defined(STM32U5) +#define MSIKPLLModeSEL RCC_MSIKPLL_MODE_SEL +#define MSISPLLModeSEL RCC_MSISPLL_MODE_SEL +#define __HAL_RCC_AHB21_CLK_DISABLE __HAL_RCC_AHB2_1_CLK_DISABLE +#define __HAL_RCC_AHB22_CLK_DISABLE __HAL_RCC_AHB2_2_CLK_DISABLE +#define __HAL_RCC_AHB1_CLK_Disable_Clear __HAL_RCC_AHB1_CLK_ENABLE +#define __HAL_RCC_AHB21_CLK_Disable_Clear __HAL_RCC_AHB2_1_CLK_ENABLE +#define __HAL_RCC_AHB22_CLK_Disable_Clear __HAL_RCC_AHB2_2_CLK_ENABLE +#define __HAL_RCC_AHB3_CLK_Disable_Clear __HAL_RCC_AHB3_CLK_ENABLE +#define __HAL_RCC_APB1_CLK_Disable_Clear __HAL_RCC_APB1_CLK_ENABLE +#define __HAL_RCC_APB2_CLK_Disable_Clear __HAL_RCC_APB2_CLK_ENABLE +#define __HAL_RCC_APB3_CLK_Disable_Clear __HAL_RCC_APB3_CLK_ENABLE +#define IS_RCC_MSIPLLModeSelection IS_RCC_MSIPLLMODE_SELECT +#define RCC_PERIPHCLK_CLK48 RCC_PERIPHCLK_ICLK +#define RCC_CLK48CLKSOURCE_HSI48 RCC_ICLK_CLKSOURCE_HSI48 +#define RCC_CLK48CLKSOURCE_PLL2 RCC_ICLK_CLKSOURCE_PLL2 +#define RCC_CLK48CLKSOURCE_PLL1 RCC_ICLK_CLKSOURCE_PLL1 +#define RCC_CLK48CLKSOURCE_MSIK RCC_ICLK_CLKSOURCE_MSIK +#define __HAL_RCC_ADC1_CLK_ENABLE __HAL_RCC_ADC12_CLK_ENABLE +#define __HAL_RCC_ADC1_CLK_DISABLE __HAL_RCC_ADC12_CLK_DISABLE +#define __HAL_RCC_ADC1_IS_CLK_ENABLED __HAL_RCC_ADC12_IS_CLK_ENABLED +#define __HAL_RCC_ADC1_IS_CLK_DISABLED __HAL_RCC_ADC12_IS_CLK_DISABLED +#define __HAL_RCC_ADC1_FORCE_RESET __HAL_RCC_ADC12_FORCE_RESET +#define __HAL_RCC_ADC1_RELEASE_RESET __HAL_RCC_ADC12_RELEASE_RESET +#define __HAL_RCC_ADC1_CLK_SLEEP_ENABLE __HAL_RCC_ADC12_CLK_SLEEP_ENABLE +#define __HAL_RCC_ADC1_CLK_SLEEP_DISABLE __HAL_RCC_ADC12_CLK_SLEEP_DISABLE +#define __HAL_RCC_GET_CLK48_SOURCE __HAL_RCC_GET_ICLK_SOURCE +#define __HAL_RCC_PLLFRACN_ENABLE __HAL_RCC_PLL_FRACN_ENABLE +#define __HAL_RCC_PLLFRACN_DISABLE __HAL_RCC_PLL_FRACN_DISABLE +#define __HAL_RCC_PLLFRACN_CONFIG __HAL_RCC_PLL_FRACN_CONFIG +#define IS_RCC_PLLFRACN_VALUE IS_RCC_PLL_FRACN_VALUE +#endif /* STM32U5 */ + +#if defined(STM32H5) +#define __HAL_RCC_PLLFRACN_ENABLE __HAL_RCC_PLL_FRACN_ENABLE +#define __HAL_RCC_PLLFRACN_DISABLE __HAL_RCC_PLL_FRACN_DISABLE +#define __HAL_RCC_PLLFRACN_CONFIG __HAL_RCC_PLL_FRACN_CONFIG +#define IS_RCC_PLLFRACN_VALUE IS_RCC_PLL_FRACN_VALUE + +#define RCC_PLLSOURCE_NONE RCC_PLL1_SOURCE_NONE +#define RCC_PLLSOURCE_HSI RCC_PLL1_SOURCE_HSI +#define RCC_PLLSOURCE_CSI RCC_PLL1_SOURCE_CSI +#define RCC_PLLSOURCE_HSE RCC_PLL1_SOURCE_HSE +#define RCC_PLLVCIRANGE_0 RCC_PLL1_VCIRANGE_0 +#define RCC_PLLVCIRANGE_1 RCC_PLL1_VCIRANGE_1 +#define RCC_PLLVCIRANGE_2 RCC_PLL1_VCIRANGE_2 +#define RCC_PLLVCIRANGE_3 RCC_PLL1_VCIRANGE_3 +#define RCC_PLL1VCOWIDE RCC_PLL1_VCORANGE_WIDE +#define RCC_PLL1VCOMEDIUM RCC_PLL1_VCORANGE_MEDIUM + +#define IS_RCC_PLLSOURCE IS_RCC_PLL1_SOURCE +#define IS_RCC_PLLRGE_VALUE IS_RCC_PLL1_VCIRGE_VALUE +#define IS_RCC_PLLVCORGE_VALUE IS_RCC_PLL1_VCORGE_VALUE +#define IS_RCC_PLLCLOCKOUT_VALUE IS_RCC_PLL1_CLOCKOUT_VALUE +#define IS_RCC_PLL_FRACN_VALUE IS_RCC_PLL1_FRACN_VALUE +#define IS_RCC_PLLM_VALUE IS_RCC_PLL1_DIVM_VALUE +#define IS_RCC_PLLN_VALUE IS_RCC_PLL1_MULN_VALUE +#define IS_RCC_PLLP_VALUE IS_RCC_PLL1_DIVP_VALUE +#define IS_RCC_PLLQ_VALUE IS_RCC_PLL1_DIVQ_VALUE +#define IS_RCC_PLLR_VALUE IS_RCC_PLL1_DIVR_VALUE + +#define __HAL_RCC_PLL_ENABLE __HAL_RCC_PLL1_ENABLE +#define __HAL_RCC_PLL_DISABLE __HAL_RCC_PLL1_DISABLE +#define __HAL_RCC_PLL_FRACN_ENABLE __HAL_RCC_PLL1_FRACN_ENABLE +#define __HAL_RCC_PLL_FRACN_DISABLE __HAL_RCC_PLL1_FRACN_DISABLE +#define __HAL_RCC_PLL_CONFIG __HAL_RCC_PLL1_CONFIG +#define __HAL_RCC_PLL_PLLSOURCE_CONFIG __HAL_RCC_PLL1_PLLSOURCE_CONFIG +#define __HAL_RCC_PLL_DIVM_CONFIG __HAL_RCC_PLL1_DIVM_CONFIG +#define __HAL_RCC_PLL_FRACN_CONFIG __HAL_RCC_PLL1_FRACN_CONFIG +#define __HAL_RCC_PLL_VCIRANGE __HAL_RCC_PLL1_VCIRANGE +#define __HAL_RCC_PLL_VCORANGE __HAL_RCC_PLL1_VCORANGE +#define __HAL_RCC_GET_PLL_OSCSOURCE __HAL_RCC_GET_PLL1_OSCSOURCE +#define __HAL_RCC_PLLCLKOUT_ENABLE __HAL_RCC_PLL1_CLKOUT_ENABLE +#define __HAL_RCC_PLLCLKOUT_DISABLE __HAL_RCC_PLL1_CLKOUT_DISABLE +#define __HAL_RCC_GET_PLLCLKOUT_CONFIG __HAL_RCC_GET_PLL1_CLKOUT_CONFIG + +#define __HAL_RCC_PLL2FRACN_ENABLE __HAL_RCC_PLL2_FRACN_ENABLE +#define __HAL_RCC_PLL2FRACN_DISABLE __HAL_RCC_PLL2_FRACN_DISABLE +#define __HAL_RCC_PLL2CLKOUT_ENABLE __HAL_RCC_PLL2_CLKOUT_ENABLE +#define __HAL_RCC_PLL2CLKOUT_DISABLE __HAL_RCC_PLL2_CLKOUT_DISABLE +#define __HAL_RCC_PLL2FRACN_CONFIG __HAL_RCC_PLL2_FRACN_CONFIG +#define __HAL_RCC_GET_PLL2CLKOUT_CONFIG __HAL_RCC_GET_PLL2_CLKOUT_CONFIG + +#define __HAL_RCC_PLL3FRACN_ENABLE __HAL_RCC_PLL3_FRACN_ENABLE +#define __HAL_RCC_PLL3FRACN_DISABLE __HAL_RCC_PLL3_FRACN_DISABLE +#define __HAL_RCC_PLL3CLKOUT_ENABLE __HAL_RCC_PLL3_CLKOUT_ENABLE +#define __HAL_RCC_PLL3CLKOUT_DISABLE __HAL_RCC_PLL3_CLKOUT_DISABLE +#define __HAL_RCC_PLL3FRACN_CONFIG __HAL_RCC_PLL3_FRACN_CONFIG +#define __HAL_RCC_GET_PLL3CLKOUT_CONFIG __HAL_RCC_GET_PLL3_CLKOUT_CONFIG + +#define RCC_PLL2VCIRANGE_0 RCC_PLL2_VCIRANGE_0 +#define RCC_PLL2VCIRANGE_1 RCC_PLL2_VCIRANGE_1 +#define RCC_PLL2VCIRANGE_2 RCC_PLL2_VCIRANGE_2 +#define RCC_PLL2VCIRANGE_3 RCC_PLL2_VCIRANGE_3 + +#define RCC_PLL2VCOWIDE RCC_PLL2_VCORANGE_WIDE +#define RCC_PLL2VCOMEDIUM RCC_PLL2_VCORANGE_MEDIUM + +#define RCC_PLL2SOURCE_NONE RCC_PLL2_SOURCE_NONE +#define RCC_PLL2SOURCE_HSI RCC_PLL2_SOURCE_HSI +#define RCC_PLL2SOURCE_CSI RCC_PLL2_SOURCE_CSI +#define RCC_PLL2SOURCE_HSE RCC_PLL2_SOURCE_HSE + +#define RCC_PLL3VCIRANGE_0 RCC_PLL3_VCIRANGE_0 +#define RCC_PLL3VCIRANGE_1 RCC_PLL3_VCIRANGE_1 +#define RCC_PLL3VCIRANGE_2 RCC_PLL3_VCIRANGE_2 +#define RCC_PLL3VCIRANGE_3 RCC_PLL3_VCIRANGE_3 + +#define RCC_PLL3VCOWIDE RCC_PLL3_VCORANGE_WIDE +#define RCC_PLL3VCOMEDIUM RCC_PLL3_VCORANGE_MEDIUM + +#define RCC_PLL3SOURCE_NONE RCC_PLL3_SOURCE_NONE +#define RCC_PLL3SOURCE_HSI RCC_PLL3_SOURCE_HSI +#define RCC_PLL3SOURCE_CSI RCC_PLL3_SOURCE_CSI +#define RCC_PLL3SOURCE_HSE RCC_PLL3_SOURCE_HSE + + +#endif /* STM32H5 */ + +/** + * @} + */ + +/** @defgroup HAL_RNG_Aliased_Macros HAL RNG Aliased Macros maintained for legacy purpose + * @{ + */ +#define HAL_RNG_ReadyCallback(__HANDLE__) HAL_RNG_ReadyDataCallback((__HANDLE__), uint32_t random32bit) + +/** + * @} + */ + +/** @defgroup HAL_RTC_Aliased_Macros HAL RTC Aliased Macros maintained for legacy purpose + * @{ + */ +#if defined (STM32G0) || defined (STM32L5) || defined (STM32L412xx) || defined (STM32L422xx) || \ + defined (STM32L4P5xx)|| defined (STM32L4Q5xx) || defined (STM32G4) || defined (STM32WL) || defined (STM32U5) || \ + defined (STM32WBA) || defined (STM32H5) || \ + defined (STM32C0) || defined (STM32N6) || defined (STM32H7RS) || defined (STM32U0) || defined (STM32U3) +#else +#define __HAL_RTC_CLEAR_FLAG __HAL_RTC_EXTI_CLEAR_FLAG +#endif +#define __HAL_RTC_DISABLE_IT __HAL_RTC_EXTI_DISABLE_IT +#define __HAL_RTC_ENABLE_IT __HAL_RTC_EXTI_ENABLE_IT + +#if defined (STM32F1) +#define __HAL_RTC_EXTI_CLEAR_FLAG(RTC_EXTI_LINE_ALARM_EVENT) __HAL_RTC_ALARM_EXTI_CLEAR_FLAG() + +#define __HAL_RTC_EXTI_ENABLE_IT(RTC_EXTI_LINE_ALARM_EVENT) __HAL_RTC_ALARM_EXTI_ENABLE_IT() + +#define __HAL_RTC_EXTI_DISABLE_IT(RTC_EXTI_LINE_ALARM_EVENT) __HAL_RTC_ALARM_EXTI_DISABLE_IT() + +#define __HAL_RTC_EXTI_GET_FLAG(RTC_EXTI_LINE_ALARM_EVENT) __HAL_RTC_ALARM_EXTI_GET_FLAG() + +#define __HAL_RTC_EXTI_GENERATE_SWIT(RTC_EXTI_LINE_ALARM_EVENT) __HAL_RTC_ALARM_EXTI_GENERATE_SWIT() +#else +#define __HAL_RTC_EXTI_CLEAR_FLAG(__EXTI_LINE__) (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_CLEAR_FLAG() : \ + (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG() : \ + __HAL_RTC_TAMPER_TIMESTAMP_EXTI_CLEAR_FLAG())) +#define __HAL_RTC_EXTI_ENABLE_IT(__EXTI_LINE__) (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_ENABLE_IT() : \ + (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_IT() : \ + __HAL_RTC_TAMPER_TIMESTAMP_EXTI_ENABLE_IT())) +#define __HAL_RTC_EXTI_DISABLE_IT(__EXTI_LINE__) (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_DISABLE_IT() : \ + (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_DISABLE_IT() : \ + __HAL_RTC_TAMPER_TIMESTAMP_EXTI_DISABLE_IT())) +#define __HAL_RTC_EXTI_GET_FLAG(__EXTI_LINE__) (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_GET_FLAG() : \ + (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_GET_FLAG() : \ + __HAL_RTC_TAMPER_TIMESTAMP_EXTI_GET_FLAG())) +#define __HAL_RTC_EXTI_GENERATE_SWIT(__EXTI_LINE__) (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_GENERATE_SWIT() : \ + (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_GENERATE_SWIT() : \ + __HAL_RTC_TAMPER_TIMESTAMP_EXTI_GENERATE_SWIT())) +#endif /* STM32F1 */ + +#if defined (STM32F0) || defined (STM32F2) || defined (STM32F3) || defined (STM32F4) || defined (STM32F7) || \ + defined (STM32H7) || \ + defined (STM32L0) || defined (STM32L1) || \ + defined (STM32WB) +#define __HAL_RTC_TAMPER_GET_IT __HAL_RTC_TAMPER_GET_FLAG +#endif + +#define IS_ALARM IS_RTC_ALARM +#define IS_ALARM_MASK IS_RTC_ALARM_MASK +#define IS_TAMPER IS_RTC_TAMPER +#define IS_TAMPER_ERASE_MODE IS_RTC_TAMPER_ERASE_MODE +#define IS_TAMPER_FILTER IS_RTC_TAMPER_FILTER +#define IS_TAMPER_INTERRUPT IS_RTC_TAMPER_INTERRUPT +#define IS_TAMPER_MASKFLAG_STATE IS_RTC_TAMPER_MASKFLAG_STATE +#define IS_TAMPER_PRECHARGE_DURATION IS_RTC_TAMPER_PRECHARGE_DURATION +#define IS_TAMPER_PULLUP_STATE IS_RTC_TAMPER_PULLUP_STATE +#define IS_TAMPER_SAMPLING_FREQ IS_RTC_TAMPER_SAMPLING_FREQ +#define IS_TAMPER_TIMESTAMPONTAMPER_DETECTION IS_RTC_TAMPER_TIMESTAMPONTAMPER_DETECTION +#define IS_TAMPER_TRIGGER IS_RTC_TAMPER_TRIGGER +#define IS_WAKEUP_CLOCK IS_RTC_WAKEUP_CLOCK +#define IS_WAKEUP_COUNTER IS_RTC_WAKEUP_COUNTER + +#define __RTC_WRITEPROTECTION_ENABLE __HAL_RTC_WRITEPROTECTION_ENABLE +#define __RTC_WRITEPROTECTION_DISABLE __HAL_RTC_WRITEPROTECTION_DISABLE + +#if defined (STM32H5) +#define __HAL_RCC_RTCAPB_CLK_ENABLE __HAL_RCC_RTC_CLK_ENABLE +#define __HAL_RCC_RTCAPB_CLK_DISABLE __HAL_RCC_RTC_CLK_DISABLE +#endif /* STM32H5 */ + +/** + * @} + */ + +/** @defgroup HAL_SD_Aliased_Macros HAL SD/MMC Aliased Macros maintained for legacy purpose + * @{ + */ + +#define SD_OCR_CID_CSD_OVERWRIETE SD_OCR_CID_CSD_OVERWRITE +#define SD_CMD_SD_APP_STAUS SD_CMD_SD_APP_STATUS + +#if !defined(STM32F1) && !defined(STM32F2) && !defined(STM32F4) && !defined(STM32L1) +#define eMMC_HIGH_VOLTAGE_RANGE EMMC_HIGH_VOLTAGE_RANGE +#define eMMC_DUAL_VOLTAGE_RANGE EMMC_DUAL_VOLTAGE_RANGE +#define eMMC_LOW_VOLTAGE_RANGE EMMC_LOW_VOLTAGE_RANGE + +#define SDMMC_NSpeed_CLK_DIV SDMMC_NSPEED_CLK_DIV +#define SDMMC_HSpeed_CLK_DIV SDMMC_HSPEED_CLK_DIV +#endif + +#if defined(STM32F4) || defined(STM32F2) +#define SD_SDMMC_DISABLED SD_SDIO_DISABLED +#define SD_SDMMC_FUNCTION_BUSY SD_SDIO_FUNCTION_BUSY +#define SD_SDMMC_FUNCTION_FAILED SD_SDIO_FUNCTION_FAILED +#define SD_SDMMC_UNKNOWN_FUNCTION SD_SDIO_UNKNOWN_FUNCTION +#define SD_CMD_SDMMC_SEN_OP_COND SD_CMD_SDIO_SEN_OP_COND +#define SD_CMD_SDMMC_RW_DIRECT SD_CMD_SDIO_RW_DIRECT +#define SD_CMD_SDMMC_RW_EXTENDED SD_CMD_SDIO_RW_EXTENDED +#define __HAL_SD_SDMMC_ENABLE __HAL_SD_SDIO_ENABLE +#define __HAL_SD_SDMMC_DISABLE __HAL_SD_SDIO_DISABLE +#define __HAL_SD_SDMMC_DMA_ENABLE __HAL_SD_SDIO_DMA_ENABLE +#define __HAL_SD_SDMMC_DMA_DISABLE __HAL_SD_SDIO_DMA_DISABL +#define __HAL_SD_SDMMC_ENABLE_IT __HAL_SD_SDIO_ENABLE_IT +#define __HAL_SD_SDMMC_DISABLE_IT __HAL_SD_SDIO_DISABLE_IT +#define __HAL_SD_SDMMC_GET_FLAG __HAL_SD_SDIO_GET_FLAG +#define __HAL_SD_SDMMC_CLEAR_FLAG __HAL_SD_SDIO_CLEAR_FLAG +#define __HAL_SD_SDMMC_GET_IT __HAL_SD_SDIO_GET_IT +#define __HAL_SD_SDMMC_CLEAR_IT __HAL_SD_SDIO_CLEAR_IT +#define SDMMC_STATIC_FLAGS SDIO_STATIC_FLAGS +#define SDMMC_CMD0TIMEOUT SDIO_CMD0TIMEOUT +#define SD_SDMMC_SEND_IF_COND SD_SDIO_SEND_IF_COND +/* alias CMSIS */ +#define SDMMC1_IRQn SDIO_IRQn +#define SDMMC1_IRQHandler SDIO_IRQHandler +#endif + +#if defined(STM32F7) || defined(STM32L4) +#define SD_SDIO_DISABLED SD_SDMMC_DISABLED +#define SD_SDIO_FUNCTION_BUSY SD_SDMMC_FUNCTION_BUSY +#define SD_SDIO_FUNCTION_FAILED SD_SDMMC_FUNCTION_FAILED +#define SD_SDIO_UNKNOWN_FUNCTION SD_SDMMC_UNKNOWN_FUNCTION +#define SD_CMD_SDIO_SEN_OP_COND SD_CMD_SDMMC_SEN_OP_COND +#define SD_CMD_SDIO_RW_DIRECT SD_CMD_SDMMC_RW_DIRECT +#define SD_CMD_SDIO_RW_EXTENDED SD_CMD_SDMMC_RW_EXTENDED +#define __HAL_SD_SDIO_ENABLE __HAL_SD_SDMMC_ENABLE +#define __HAL_SD_SDIO_DISABLE __HAL_SD_SDMMC_DISABLE +#define __HAL_SD_SDIO_DMA_ENABLE __HAL_SD_SDMMC_DMA_ENABLE +#define __HAL_SD_SDIO_DMA_DISABL __HAL_SD_SDMMC_DMA_DISABLE +#define __HAL_SD_SDIO_ENABLE_IT __HAL_SD_SDMMC_ENABLE_IT +#define __HAL_SD_SDIO_DISABLE_IT __HAL_SD_SDMMC_DISABLE_IT +#define __HAL_SD_SDIO_GET_FLAG __HAL_SD_SDMMC_GET_FLAG +#define __HAL_SD_SDIO_CLEAR_FLAG __HAL_SD_SDMMC_CLEAR_FLAG +#define __HAL_SD_SDIO_GET_IT __HAL_SD_SDMMC_GET_IT +#define __HAL_SD_SDIO_CLEAR_IT __HAL_SD_SDMMC_CLEAR_IT +#define SDIO_STATIC_FLAGS SDMMC_STATIC_FLAGS +#define SDIO_CMD0TIMEOUT SDMMC_CMD0TIMEOUT +#define SD_SDIO_SEND_IF_COND SD_SDMMC_SEND_IF_COND +/* alias CMSIS for compatibilities */ +#define SDIO_IRQn SDMMC1_IRQn +#define SDIO_IRQHandler SDMMC1_IRQHandler +#endif + +#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) || defined(STM32L4) || defined(STM32H7) +#define HAL_SD_CardCIDTypedef HAL_SD_CardCIDTypeDef +#define HAL_SD_CardCSDTypedef HAL_SD_CardCSDTypeDef +#define HAL_SD_CardStatusTypedef HAL_SD_CardStatusTypeDef +#define HAL_SD_CardStateTypedef HAL_SD_CardStateTypeDef +#endif + +#if defined(STM32H7) || defined(STM32L5) +#define HAL_MMCEx_Read_DMADoubleBuffer0CpltCallback HAL_MMCEx_Read_DMADoubleBuf0CpltCallback +#define HAL_MMCEx_Read_DMADoubleBuffer1CpltCallback HAL_MMCEx_Read_DMADoubleBuf1CpltCallback +#define HAL_MMCEx_Write_DMADoubleBuffer0CpltCallback HAL_MMCEx_Write_DMADoubleBuf0CpltCallback +#define HAL_MMCEx_Write_DMADoubleBuffer1CpltCallback HAL_MMCEx_Write_DMADoubleBuf1CpltCallback +#define HAL_SDEx_Read_DMADoubleBuffer0CpltCallback HAL_SDEx_Read_DMADoubleBuf0CpltCallback +#define HAL_SDEx_Read_DMADoubleBuffer1CpltCallback HAL_SDEx_Read_DMADoubleBuf1CpltCallback +#define HAL_SDEx_Write_DMADoubleBuffer0CpltCallback HAL_SDEx_Write_DMADoubleBuf0CpltCallback +#define HAL_SDEx_Write_DMADoubleBuffer1CpltCallback HAL_SDEx_Write_DMADoubleBuf1CpltCallback +#define HAL_SD_DriveTransciver_1_8V_Callback HAL_SD_DriveTransceiver_1_8V_Callback +#endif +/** + * @} + */ + +/** @defgroup HAL_SMARTCARD_Aliased_Macros HAL SMARTCARD Aliased Macros maintained for legacy purpose + * @{ + */ + +#define __SMARTCARD_ENABLE_IT __HAL_SMARTCARD_ENABLE_IT +#define __SMARTCARD_DISABLE_IT __HAL_SMARTCARD_DISABLE_IT +#define __SMARTCARD_ENABLE __HAL_SMARTCARD_ENABLE +#define __SMARTCARD_DISABLE __HAL_SMARTCARD_DISABLE +#define __SMARTCARD_DMA_REQUEST_ENABLE __HAL_SMARTCARD_DMA_REQUEST_ENABLE +#define __SMARTCARD_DMA_REQUEST_DISABLE __HAL_SMARTCARD_DMA_REQUEST_DISABLE + +#define __HAL_SMARTCARD_GETCLOCKSOURCE SMARTCARD_GETCLOCKSOURCE +#define __SMARTCARD_GETCLOCKSOURCE SMARTCARD_GETCLOCKSOURCE + +#define IS_SMARTCARD_ONEBIT_SAMPLING IS_SMARTCARD_ONE_BIT_SAMPLE + +/** + * @} + */ + +/** @defgroup HAL_SMBUS_Aliased_Macros HAL SMBUS Aliased Macros maintained for legacy purpose + * @{ + */ +#define __HAL_SMBUS_RESET_CR1 SMBUS_RESET_CR1 +#define __HAL_SMBUS_RESET_CR2 SMBUS_RESET_CR2 +#define __HAL_SMBUS_GENERATE_START SMBUS_GENERATE_START +#define __HAL_SMBUS_GET_ADDR_MATCH SMBUS_GET_ADDR_MATCH +#define __HAL_SMBUS_GET_DIR SMBUS_GET_DIR +#define __HAL_SMBUS_GET_STOP_MODE SMBUS_GET_STOP_MODE +#define __HAL_SMBUS_GET_PEC_MODE SMBUS_GET_PEC_MODE +#define __HAL_SMBUS_GET_ALERT_ENABLED SMBUS_GET_ALERT_ENABLED +/** + * @} + */ + +/** @defgroup HAL_SPI_Aliased_Macros HAL SPI Aliased Macros maintained for legacy purpose + * @{ + */ + +#define __HAL_SPI_1LINE_TX SPI_1LINE_TX +#define __HAL_SPI_1LINE_RX SPI_1LINE_RX +#define __HAL_SPI_RESET_CRC SPI_RESET_CRC + +/** + * @} + */ + +/** @defgroup HAL_UART_Aliased_Macros HAL UART Aliased Macros maintained for legacy purpose + * @{ + */ + +#define __HAL_UART_GETCLOCKSOURCE UART_GETCLOCKSOURCE +#define __HAL_UART_MASK_COMPUTATION UART_MASK_COMPUTATION +#define __UART_GETCLOCKSOURCE UART_GETCLOCKSOURCE +#define __UART_MASK_COMPUTATION UART_MASK_COMPUTATION + +#define IS_UART_WAKEUPMETHODE IS_UART_WAKEUPMETHOD + +#define IS_UART_ONEBIT_SAMPLE IS_UART_ONE_BIT_SAMPLE +#define IS_UART_ONEBIT_SAMPLING IS_UART_ONE_BIT_SAMPLE + +/** + * @} + */ + + +/** @defgroup HAL_USART_Aliased_Macros HAL USART Aliased Macros maintained for legacy purpose + * @{ + */ + +#define __USART_ENABLE_IT __HAL_USART_ENABLE_IT +#define __USART_DISABLE_IT __HAL_USART_DISABLE_IT +#define __USART_ENABLE __HAL_USART_ENABLE +#define __USART_DISABLE __HAL_USART_DISABLE + +#define __HAL_USART_GETCLOCKSOURCE USART_GETCLOCKSOURCE +#define __USART_GETCLOCKSOURCE USART_GETCLOCKSOURCE + +#if defined(STM32F0) || defined(STM32F3) || defined(STM32F7) +#define USART_OVERSAMPLING_16 0x00000000U +#define USART_OVERSAMPLING_8 USART_CR1_OVER8 + +#define IS_USART_OVERSAMPLING(__SAMPLING__) (((__SAMPLING__) == USART_OVERSAMPLING_16) || \ + ((__SAMPLING__) == USART_OVERSAMPLING_8)) +#endif /* STM32F0 || STM32F3 || STM32F7 */ +/** + * @} + */ + +/** @defgroup HAL_USB_Aliased_Macros HAL USB Aliased Macros maintained for legacy purpose + * @{ + */ +#define USB_EXTI_LINE_WAKEUP USB_WAKEUP_EXTI_LINE + +#define USB_FS_EXTI_TRIGGER_RISING_EDGE USB_OTG_FS_WAKEUP_EXTI_RISING_EDGE +#define USB_FS_EXTI_TRIGGER_FALLING_EDGE USB_OTG_FS_WAKEUP_EXTI_FALLING_EDGE +#define USB_FS_EXTI_TRIGGER_BOTH_EDGE USB_OTG_FS_WAKEUP_EXTI_RISING_FALLING_EDGE +#define USB_FS_EXTI_LINE_WAKEUP USB_OTG_FS_WAKEUP_EXTI_LINE + +#define USB_HS_EXTI_TRIGGER_RISING_EDGE USB_OTG_HS_WAKEUP_EXTI_RISING_EDGE +#define USB_HS_EXTI_TRIGGER_FALLING_EDGE USB_OTG_HS_WAKEUP_EXTI_FALLING_EDGE +#define USB_HS_EXTI_TRIGGER_BOTH_EDGE USB_OTG_HS_WAKEUP_EXTI_RISING_FALLING_EDGE +#define USB_HS_EXTI_LINE_WAKEUP USB_OTG_HS_WAKEUP_EXTI_LINE + +#define __HAL_USB_EXTI_ENABLE_IT __HAL_USB_WAKEUP_EXTI_ENABLE_IT +#define __HAL_USB_EXTI_DISABLE_IT __HAL_USB_WAKEUP_EXTI_DISABLE_IT +#define __HAL_USB_EXTI_GET_FLAG __HAL_USB_WAKEUP_EXTI_GET_FLAG +#define __HAL_USB_EXTI_CLEAR_FLAG __HAL_USB_WAKEUP_EXTI_CLEAR_FLAG +#define __HAL_USB_EXTI_SET_RISING_EDGE_TRIGGER __HAL_USB_WAKEUP_EXTI_ENABLE_RISING_EDGE +#define __HAL_USB_EXTI_SET_FALLING_EDGE_TRIGGER __HAL_USB_WAKEUP_EXTI_ENABLE_FALLING_EDGE +#define __HAL_USB_EXTI_SET_FALLINGRISING_TRIGGER __HAL_USB_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE + +#define __HAL_USB_FS_EXTI_ENABLE_IT __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT +#define __HAL_USB_FS_EXTI_DISABLE_IT __HAL_USB_OTG_FS_WAKEUP_EXTI_DISABLE_IT +#define __HAL_USB_FS_EXTI_GET_FLAG __HAL_USB_OTG_FS_WAKEUP_EXTI_GET_FLAG +#define __HAL_USB_FS_EXTI_CLEAR_FLAG __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG +#define __HAL_USB_FS_EXTI_SET_RISING_EGDE_TRIGGER __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE +#define __HAL_USB_FS_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_FALLING_EDGE +#define __HAL_USB_FS_EXTI_SET_FALLINGRISING_TRIGGER __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE +#define __HAL_USB_FS_EXTI_GENERATE_SWIT __HAL_USB_OTG_FS_WAKEUP_EXTI_GENERATE_SWIT + +#define __HAL_USB_HS_EXTI_ENABLE_IT __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_IT +#define __HAL_USB_HS_EXTI_DISABLE_IT __HAL_USB_OTG_HS_WAKEUP_EXTI_DISABLE_IT +#define __HAL_USB_HS_EXTI_GET_FLAG __HAL_USB_OTG_HS_WAKEUP_EXTI_GET_FLAG +#define __HAL_USB_HS_EXTI_CLEAR_FLAG __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG +#define __HAL_USB_HS_EXTI_SET_RISING_EGDE_TRIGGER __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE +#define __HAL_USB_HS_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_FALLING_EDGE +#define __HAL_USB_HS_EXTI_SET_FALLINGRISING_TRIGGER __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE +#define __HAL_USB_HS_EXTI_GENERATE_SWIT __HAL_USB_OTG_HS_WAKEUP_EXTI_GENERATE_SWIT + +#define HAL_PCD_ActiveRemoteWakeup HAL_PCD_ActivateRemoteWakeup +#define HAL_PCD_DeActiveRemoteWakeup HAL_PCD_DeActivateRemoteWakeup + +#define HAL_PCD_SetTxFiFo HAL_PCDEx_SetTxFiFo +#define HAL_PCD_SetRxFiFo HAL_PCDEx_SetRxFiFo +#if defined(STM32U5) +#define USB_OTG_GOTGCTL_BSESVLD USB_OTG_GOTGCTL_BSVLD +#define USB_OTG_GAHBCFG_GINT USB_OTG_GAHBCFG_GINTMSK +#define USB_OTG_GUSBCFG_PHYLPCS USB_OTG_GUSBCFG_PHYLPC +#define USB_OTG_GRSTCTL_HSRST USB_OTG_GRSTCTL_PSRST +#define USB_OTG_GINTSTS_BOUTNAKEFF USB_OTG_GINTSTS_GONAKEFF +#define USB_OTG_GINTSTS_WKUINT USB_OTG_GINTSTS_WKUPINT +#define USB_OTG_GINTMSK_PXFRM_IISOOXFRM USB_OTG_GINTMSK_IPXFRM_IISOOXFRM +#define USB_OTG_GRXSTSP_EPNUM USB_OTG_GRXSTSP_EPNUM_CHNUM +#define USB_OTG_GLPMCFG_L1ResumeOK USB_OTG_GLPMCFG_L1RSMOK +#define USB_OTG_HPTXFSIZ_PTXFD USB_OTG_HPTXFSIZ_PTXFSIZ +#define USB_OTG_HCCHAR_MC USB_OTG_HCCHAR_MCNT +#define USB_OTG_HCCHAR_MC_0 USB_OTG_HCCHAR_MCNT_0 +#define USB_OTG_HCCHAR_MC_1 USB_OTG_HCCHAR_MCNT_1 +#define USB_OTG_HCINTMSK_AHBERR USB_OTG_HCINTMSK_AHBERRM +#define USB_OTG_HCTSIZ_DOPING USB_OTG_HCTSIZ_DOPNG +#define USB_OTG_DOEPMSK_OPEM USB_OTG_DOEPMSK_OUTPKTERRM +#define USB_OTG_DIEPCTL_SODDFRM USB_OTG_DIEPCTL_SD1PID_SODDFRM +#define USB_OTG_DIEPTSIZ_MULCNT USB_OTG_DIEPTSIZ_MCNT +#define USB_OTG_DOEPCTL_SODDFRM USB_OTG_DOEPCTL_SD1PID_SODDFRM +#define USB_OTG_DOEPCTL_DPID USB_OTG_DOEPCTL_DPID_EONUM +#define USB_OTG_DOEPTSIZ_STUPCNT USB_OTG_DOEPTSIZ_RXDPID +#define USB_OTG_DOEPTSIZ_STUPCNT_0 USB_OTG_DOEPTSIZ_RXDPID_0 +#define USB_OTG_DOEPTSIZ_STUPCNT_1 USB_OTG_DOEPTSIZ_RXDPID_1 +#define USB_OTG_PCGCCTL_STOPCLK USB_OTG_PCGCCTL_STPPCLK +#define USB_OTG_PCGCCTL_GATECLK USB_OTG_PCGCCTL_GATEHCLK +#endif +/** + * @} + */ + +/** @defgroup HAL_TIM_Aliased_Macros HAL TIM Aliased Macros maintained for legacy purpose + * @{ + */ +#define __HAL_TIM_SetICPrescalerValue TIM_SET_ICPRESCALERVALUE +#define __HAL_TIM_ResetICPrescalerValue TIM_RESET_ICPRESCALERVALUE + +#define TIM_GET_ITSTATUS __HAL_TIM_GET_IT_SOURCE +#define TIM_GET_CLEAR_IT __HAL_TIM_CLEAR_IT + +#define __HAL_TIM_GET_ITSTATUS __HAL_TIM_GET_IT_SOURCE + +#define __HAL_TIM_DIRECTION_STATUS __HAL_TIM_IS_TIM_COUNTING_DOWN +#define __HAL_TIM_PRESCALER __HAL_TIM_SET_PRESCALER +#define __HAL_TIM_SetCounter __HAL_TIM_SET_COUNTER +#define __HAL_TIM_GetCounter __HAL_TIM_GET_COUNTER +#define __HAL_TIM_SetAutoreload __HAL_TIM_SET_AUTORELOAD +#define __HAL_TIM_GetAutoreload __HAL_TIM_GET_AUTORELOAD +#define __HAL_TIM_SetClockDivision __HAL_TIM_SET_CLOCKDIVISION +#define __HAL_TIM_GetClockDivision __HAL_TIM_GET_CLOCKDIVISION +#define __HAL_TIM_SetICPrescaler __HAL_TIM_SET_ICPRESCALER +#define __HAL_TIM_GetICPrescaler __HAL_TIM_GET_ICPRESCALER +#define __HAL_TIM_SetCompare __HAL_TIM_SET_COMPARE +#define __HAL_TIM_GetCompare __HAL_TIM_GET_COMPARE + +#define TIM_BREAKINPUTSOURCE_DFSDM TIM_BREAKINPUTSOURCE_DFSDM1 + +#define TIM_OCMODE_ASSYMETRIC_PWM1 TIM_OCMODE_ASYMMETRIC_PWM1 +#define TIM_OCMODE_ASSYMETRIC_PWM2 TIM_OCMODE_ASYMMETRIC_PWM2 +/** + * @} + */ + +/** @defgroup HAL_ETH_Aliased_Macros HAL ETH Aliased Macros maintained for legacy purpose + * @{ + */ + +#define __HAL_ETH_EXTI_ENABLE_IT __HAL_ETH_WAKEUP_EXTI_ENABLE_IT +#define __HAL_ETH_EXTI_DISABLE_IT __HAL_ETH_WAKEUP_EXTI_DISABLE_IT +#define __HAL_ETH_EXTI_GET_FLAG __HAL_ETH_WAKEUP_EXTI_GET_FLAG +#define __HAL_ETH_EXTI_CLEAR_FLAG __HAL_ETH_WAKEUP_EXTI_CLEAR_FLAG +#define __HAL_ETH_EXTI_SET_RISING_EGDE_TRIGGER __HAL_ETH_WAKEUP_EXTI_ENABLE_RISING_EDGE_TRIGGER +#define __HAL_ETH_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_ETH_WAKEUP_EXTI_ENABLE_FALLING_EDGE_TRIGGER +#define __HAL_ETH_EXTI_SET_FALLINGRISING_TRIGGER __HAL_ETH_WAKEUP_EXTI_ENABLE_FALLINGRISING_TRIGGER + +#define ETH_PROMISCIOUSMODE_ENABLE ETH_PROMISCUOUS_MODE_ENABLE +#define ETH_PROMISCIOUSMODE_DISABLE ETH_PROMISCUOUS_MODE_DISABLE +#define IS_ETH_PROMISCIOUS_MODE IS_ETH_PROMISCUOUS_MODE +/** + * @} + */ + +/** @defgroup HAL_LTDC_Aliased_Macros HAL LTDC Aliased Macros maintained for legacy purpose + * @{ + */ +#define __HAL_LTDC_LAYER LTDC_LAYER +#define __HAL_LTDC_RELOAD_CONFIG __HAL_LTDC_RELOAD_IMMEDIATE_CONFIG +/** + * @} + */ + +/** @defgroup HAL_SAI_Aliased_Macros HAL SAI Aliased Macros maintained for legacy purpose + * @{ + */ +#define SAI_OUTPUTDRIVE_DISABLED SAI_OUTPUTDRIVE_DISABLE +#define SAI_OUTPUTDRIVE_ENABLED SAI_OUTPUTDRIVE_ENABLE +#define SAI_MASTERDIVIDER_ENABLED SAI_MASTERDIVIDER_ENABLE +#define SAI_MASTERDIVIDER_DISABLED SAI_MASTERDIVIDER_DISABLE +#define SAI_STREOMODE SAI_STEREOMODE +#define SAI_FIFOStatus_Empty SAI_FIFOSTATUS_EMPTY +#define SAI_FIFOStatus_Less1QuarterFull SAI_FIFOSTATUS_LESS1QUARTERFULL +#define SAI_FIFOStatus_1QuarterFull SAI_FIFOSTATUS_1QUARTERFULL +#define SAI_FIFOStatus_HalfFull SAI_FIFOSTATUS_HALFFULL +#define SAI_FIFOStatus_3QuartersFull SAI_FIFOSTATUS_3QUARTERFULL +#define SAI_FIFOStatus_Full SAI_FIFOSTATUS_FULL +#define IS_SAI_BLOCK_MONO_STREO_MODE IS_SAI_BLOCK_MONO_STEREO_MODE +#define SAI_SYNCHRONOUS_EXT SAI_SYNCHRONOUS_EXT_SAI1 +#define SAI_SYNCEXT_IN_ENABLE SAI_SYNCEXT_OUTBLOCKA_ENABLE +/** + * @} + */ + +/** @defgroup HAL_SPDIFRX_Aliased_Macros HAL SPDIFRX Aliased Macros maintained for legacy purpose + * @{ + */ +#if defined(STM32H7) +#define HAL_SPDIFRX_ReceiveControlFlow HAL_SPDIFRX_ReceiveCtrlFlow +#define HAL_SPDIFRX_ReceiveControlFlow_IT HAL_SPDIFRX_ReceiveCtrlFlow_IT +#define HAL_SPDIFRX_ReceiveControlFlow_DMA HAL_SPDIFRX_ReceiveCtrlFlow_DMA +#endif +/** + * @} + */ + +/** @defgroup HAL_HRTIM_Aliased_Functions HAL HRTIM Aliased Functions maintained for legacy purpose + * @{ + */ +#if defined (STM32H7) || defined (STM32G4) || defined (STM32F3) +#define HAL_HRTIM_WaveformCounterStart_IT HAL_HRTIM_WaveformCountStart_IT +#define HAL_HRTIM_WaveformCounterStart_DMA HAL_HRTIM_WaveformCountStart_DMA +#define HAL_HRTIM_WaveformCounterStart HAL_HRTIM_WaveformCountStart +#define HAL_HRTIM_WaveformCounterStop_IT HAL_HRTIM_WaveformCountStop_IT +#define HAL_HRTIM_WaveformCounterStop_DMA HAL_HRTIM_WaveformCountStop_DMA +#define HAL_HRTIM_WaveformCounterStop HAL_HRTIM_WaveformCountStop +#endif +/** + * @} + */ + +/** @defgroup HAL_QSPI_Aliased_Macros HAL QSPI Aliased Macros maintained for legacy purpose + * @{ + */ +#if defined (STM32L4) || defined (STM32F4) || defined (STM32F7) || defined(STM32H7) +#define HAL_QPSI_TIMEOUT_DEFAULT_VALUE HAL_QSPI_TIMEOUT_DEFAULT_VALUE +#endif /* STM32L4 || STM32F4 || STM32F7 */ +/** + * @} + */ + +/** @defgroup HAL_Generic_Aliased_Macros HAL Generic Aliased Macros maintained for legacy purpose + * @{ + */ +#if defined (STM32F7) +#define ART_ACCLERATOR_ENABLE ART_ACCELERATOR_ENABLE +#endif /* STM32F7 */ +/** + * @} + */ + +/** @defgroup HAL_PPP_Aliased_Macros HAL PPP Aliased Macros maintained for legacy purpose + * @{ + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32_HAL_LEGACY */ + + diff --git a/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h new file mode 100644 index 0000000..f7eb847 --- /dev/null +++ b/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/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h new file mode 100644 index 0000000..7690930 --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h @@ -0,0 +1,410 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_cortex.h + * @author MCD Application Team + * @brief Header file of CORTEX HAL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CORTEX_H +#define __STM32F4xx_HAL_CORTEX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup CORTEX + * @{ + */ +/* Exported types ------------------------------------------------------------*/ +/** @defgroup CORTEX_Exported_Types Cortex Exported Types + * @{ + */ + +#if (__MPU_PRESENT == 1U) +/** @defgroup CORTEX_MPU_Region_Initialization_Structure_definition MPU Region Initialization Structure Definition + * @brief MPU Region initialization structure + * @{ + */ +typedef struct +{ + uint8_t Enable; /*!< Specifies the status of the region. + This parameter can be a value of @ref CORTEX_MPU_Region_Enable */ + uint8_t Number; /*!< Specifies the number of the region to protect. + This parameter can be a value of @ref CORTEX_MPU_Region_Number */ + uint32_t BaseAddress; /*!< Specifies the base address of the region to protect. */ + uint8_t Size; /*!< Specifies the size of the region to protect. + This parameter can be a value of @ref CORTEX_MPU_Region_Size */ + uint8_t SubRegionDisable; /*!< Specifies the number of the subregion protection to disable. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF */ + uint8_t TypeExtField; /*!< Specifies the TEX field level. + This parameter can be a value of @ref CORTEX_MPU_TEX_Levels */ + uint8_t AccessPermission; /*!< Specifies the region access permission type. + This parameter can be a value of @ref CORTEX_MPU_Region_Permission_Attributes */ + uint8_t DisableExec; /*!< Specifies the instruction access status. + This parameter can be a value of @ref CORTEX_MPU_Instruction_Access */ + uint8_t IsShareable; /*!< Specifies the shareability status of the protected region. + This parameter can be a value of @ref CORTEX_MPU_Access_Shareable */ + uint8_t IsCacheable; /*!< Specifies the cacheable status of the region protected. + This parameter can be a value of @ref CORTEX_MPU_Access_Cacheable */ + uint8_t IsBufferable; /*!< Specifies the bufferable status of the protected region. + This parameter can be a value of @ref CORTEX_MPU_Access_Bufferable */ +}MPU_Region_InitTypeDef; +/** + * @} + */ +#endif /* __MPU_PRESENT */ + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup CORTEX_Exported_Constants CORTEX Exported Constants + * @{ + */ + +/** @defgroup CORTEX_Preemption_Priority_Group CORTEX Preemption Priority Group + * @{ + */ +#define NVIC_PRIORITYGROUP_0 0x00000007U /*!< 0 bits for pre-emption priority + 4 bits for subpriority */ +#define NVIC_PRIORITYGROUP_1 0x00000006U /*!< 1 bits for pre-emption priority + 3 bits for subpriority */ +#define NVIC_PRIORITYGROUP_2 0x00000005U /*!< 2 bits for pre-emption priority + 2 bits for subpriority */ +#define NVIC_PRIORITYGROUP_3 0x00000004U /*!< 3 bits for pre-emption priority + 1 bits for subpriority */ +#define NVIC_PRIORITYGROUP_4 0x00000003U /*!< 4 bits for pre-emption priority + 0 bits for subpriority */ +/** + * @} + */ + +/** @defgroup CORTEX_SysTick_clock_source CORTEX _SysTick clock source + * @{ + */ +#define SYSTICK_CLKSOURCE_HCLK_DIV8 0x00000000U +#define SYSTICK_CLKSOURCE_HCLK 0x00000004U + +/** + * @} + */ + +#if (__MPU_PRESENT == 1) +/** @defgroup CORTEX_MPU_HFNMI_PRIVDEF_Control MPU HFNMI and PRIVILEGED Access control + * @{ + */ +#define MPU_HFNMI_PRIVDEF_NONE 0x00000000U +#define MPU_HARDFAULT_NMI MPU_CTRL_HFNMIENA_Msk +#define MPU_PRIVILEGED_DEFAULT MPU_CTRL_PRIVDEFENA_Msk +#define MPU_HFNMI_PRIVDEF (MPU_CTRL_HFNMIENA_Msk | MPU_CTRL_PRIVDEFENA_Msk) + +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Region_Enable CORTEX MPU Region Enable + * @{ + */ +#define MPU_REGION_ENABLE ((uint8_t)0x01) +#define MPU_REGION_DISABLE ((uint8_t)0x00) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Instruction_Access CORTEX MPU Instruction Access + * @{ + */ +#define MPU_INSTRUCTION_ACCESS_ENABLE ((uint8_t)0x00) +#define MPU_INSTRUCTION_ACCESS_DISABLE ((uint8_t)0x01) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Access_Shareable CORTEX MPU Instruction Access Shareable + * @{ + */ +#define MPU_ACCESS_SHAREABLE ((uint8_t)0x01) +#define MPU_ACCESS_NOT_SHAREABLE ((uint8_t)0x00) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Access_Cacheable CORTEX MPU Instruction Access Cacheable + * @{ + */ +#define MPU_ACCESS_CACHEABLE ((uint8_t)0x01) +#define MPU_ACCESS_NOT_CACHEABLE ((uint8_t)0x00) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Access_Bufferable CORTEX MPU Instruction Access Bufferable + * @{ + */ +#define MPU_ACCESS_BUFFERABLE ((uint8_t)0x01) +#define MPU_ACCESS_NOT_BUFFERABLE ((uint8_t)0x00) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_TEX_Levels MPU TEX Levels + * @{ + */ +#define MPU_TEX_LEVEL0 ((uint8_t)0x00) +#define MPU_TEX_LEVEL1 ((uint8_t)0x01) +#define MPU_TEX_LEVEL2 ((uint8_t)0x02) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Region_Size CORTEX MPU Region Size + * @{ + */ +#define MPU_REGION_SIZE_32B ((uint8_t)0x04) +#define MPU_REGION_SIZE_64B ((uint8_t)0x05) +#define MPU_REGION_SIZE_128B ((uint8_t)0x06) +#define MPU_REGION_SIZE_256B ((uint8_t)0x07) +#define MPU_REGION_SIZE_512B ((uint8_t)0x08) +#define MPU_REGION_SIZE_1KB ((uint8_t)0x09) +#define MPU_REGION_SIZE_2KB ((uint8_t)0x0A) +#define MPU_REGION_SIZE_4KB ((uint8_t)0x0B) +#define MPU_REGION_SIZE_8KB ((uint8_t)0x0C) +#define MPU_REGION_SIZE_16KB ((uint8_t)0x0D) +#define MPU_REGION_SIZE_32KB ((uint8_t)0x0E) +#define MPU_REGION_SIZE_64KB ((uint8_t)0x0F) +#define MPU_REGION_SIZE_128KB ((uint8_t)0x10) +#define MPU_REGION_SIZE_256KB ((uint8_t)0x11) +#define MPU_REGION_SIZE_512KB ((uint8_t)0x12) +#define MPU_REGION_SIZE_1MB ((uint8_t)0x13) +#define MPU_REGION_SIZE_2MB ((uint8_t)0x14) +#define MPU_REGION_SIZE_4MB ((uint8_t)0x15) +#define MPU_REGION_SIZE_8MB ((uint8_t)0x16) +#define MPU_REGION_SIZE_16MB ((uint8_t)0x17) +#define MPU_REGION_SIZE_32MB ((uint8_t)0x18) +#define MPU_REGION_SIZE_64MB ((uint8_t)0x19) +#define MPU_REGION_SIZE_128MB ((uint8_t)0x1A) +#define MPU_REGION_SIZE_256MB ((uint8_t)0x1B) +#define MPU_REGION_SIZE_512MB ((uint8_t)0x1C) +#define MPU_REGION_SIZE_1GB ((uint8_t)0x1D) +#define MPU_REGION_SIZE_2GB ((uint8_t)0x1E) +#define MPU_REGION_SIZE_4GB ((uint8_t)0x1F) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Region_Permission_Attributes CORTEX MPU Region Permission Attributes + * @{ + */ +#define MPU_REGION_NO_ACCESS ((uint8_t)0x00) +#define MPU_REGION_PRIV_RW ((uint8_t)0x01) +#define MPU_REGION_PRIV_RW_URO ((uint8_t)0x02) +#define MPU_REGION_FULL_ACCESS ((uint8_t)0x03) +#define MPU_REGION_PRIV_RO ((uint8_t)0x05) +#define MPU_REGION_PRIV_RO_URO ((uint8_t)0x06) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Region_Number CORTEX MPU Region Number + * @{ + */ +#define MPU_REGION_NUMBER0 ((uint8_t)0x00) +#define MPU_REGION_NUMBER1 ((uint8_t)0x01) +#define MPU_REGION_NUMBER2 ((uint8_t)0x02) +#define MPU_REGION_NUMBER3 ((uint8_t)0x03) +#define MPU_REGION_NUMBER4 ((uint8_t)0x04) +#define MPU_REGION_NUMBER5 ((uint8_t)0x05) +#define MPU_REGION_NUMBER6 ((uint8_t)0x06) +#define MPU_REGION_NUMBER7 ((uint8_t)0x07) +/** + * @} + */ +#endif /* __MPU_PRESENT */ + +/** + * @} + */ + + +/* Exported Macros -----------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup CORTEX_Exported_Functions + * @{ + */ + +/** @addtogroup CORTEX_Exported_Functions_Group1 + * @{ + */ +/* Initialization and de-initialization functions *****************************/ +void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup); +void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority); +void HAL_NVIC_EnableIRQ(IRQn_Type IRQn); +void HAL_NVIC_DisableIRQ(IRQn_Type IRQn); +void HAL_NVIC_SystemReset(void); +uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb); +/** + * @} + */ + +/** @addtogroup CORTEX_Exported_Functions_Group2 + * @{ + */ +/* Peripheral Control functions ***********************************************/ +uint32_t HAL_NVIC_GetPriorityGrouping(void); +void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority); +uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn); +void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn); +void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn); +uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn); +void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource); +void HAL_SYSTICK_IRQHandler(void); +void HAL_SYSTICK_Callback(void); + +#if (__MPU_PRESENT == 1U) +void HAL_MPU_Enable(uint32_t MPU_Control); +void HAL_MPU_Disable(void); +void HAL_MPU_EnableRegion(uint32_t RegionNumber); +void HAL_MPU_DisableRegion(uint32_t RegionNumber); +void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_Init); +#endif /* __MPU_PRESENT */ +void HAL_CORTEX_ClearEvent(void); +/** + * @} + */ + +/** + * @} + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/** @defgroup CORTEX_Private_Macros CORTEX Private Macros + * @{ + */ +#define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PRIORITYGROUP_0) || \ + ((GROUP) == NVIC_PRIORITYGROUP_1) || \ + ((GROUP) == NVIC_PRIORITYGROUP_2) || \ + ((GROUP) == NVIC_PRIORITYGROUP_3) || \ + ((GROUP) == NVIC_PRIORITYGROUP_4)) + +#define IS_NVIC_PREEMPTION_PRIORITY(PRIORITY) ((PRIORITY) < 0x10U) + +#define IS_NVIC_SUB_PRIORITY(PRIORITY) ((PRIORITY) < 0x10U) + +#define IS_NVIC_DEVICE_IRQ(IRQ) ((IRQ) >= (IRQn_Type)0x00U) + +#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SYSTICK_CLKSOURCE_HCLK) || \ + ((SOURCE) == SYSTICK_CLKSOURCE_HCLK_DIV8)) + +#if (__MPU_PRESENT == 1U) +#define IS_MPU_REGION_ENABLE(STATE) (((STATE) == MPU_REGION_ENABLE) || \ + ((STATE) == MPU_REGION_DISABLE)) + +#define IS_MPU_INSTRUCTION_ACCESS(STATE) (((STATE) == MPU_INSTRUCTION_ACCESS_ENABLE) || \ + ((STATE) == MPU_INSTRUCTION_ACCESS_DISABLE)) + +#define IS_MPU_ACCESS_SHAREABLE(STATE) (((STATE) == MPU_ACCESS_SHAREABLE) || \ + ((STATE) == MPU_ACCESS_NOT_SHAREABLE)) + +#define IS_MPU_ACCESS_CACHEABLE(STATE) (((STATE) == MPU_ACCESS_CACHEABLE) || \ + ((STATE) == MPU_ACCESS_NOT_CACHEABLE)) + +#define IS_MPU_ACCESS_BUFFERABLE(STATE) (((STATE) == MPU_ACCESS_BUFFERABLE) || \ + ((STATE) == MPU_ACCESS_NOT_BUFFERABLE)) + +#define IS_MPU_TEX_LEVEL(TYPE) (((TYPE) == MPU_TEX_LEVEL0) || \ + ((TYPE) == MPU_TEX_LEVEL1) || \ + ((TYPE) == MPU_TEX_LEVEL2)) + +#define IS_MPU_REGION_PERMISSION_ATTRIBUTE(TYPE) (((TYPE) == MPU_REGION_NO_ACCESS) || \ + ((TYPE) == MPU_REGION_PRIV_RW) || \ + ((TYPE) == MPU_REGION_PRIV_RW_URO) || \ + ((TYPE) == MPU_REGION_FULL_ACCESS) || \ + ((TYPE) == MPU_REGION_PRIV_RO) || \ + ((TYPE) == MPU_REGION_PRIV_RO_URO)) + +#define IS_MPU_REGION_NUMBER(NUMBER) (((NUMBER) == MPU_REGION_NUMBER0) || \ + ((NUMBER) == MPU_REGION_NUMBER1) || \ + ((NUMBER) == MPU_REGION_NUMBER2) || \ + ((NUMBER) == MPU_REGION_NUMBER3) || \ + ((NUMBER) == MPU_REGION_NUMBER4) || \ + ((NUMBER) == MPU_REGION_NUMBER5) || \ + ((NUMBER) == MPU_REGION_NUMBER6) || \ + ((NUMBER) == MPU_REGION_NUMBER7)) + +#define IS_MPU_REGION_SIZE(SIZE) (((SIZE) == MPU_REGION_SIZE_32B) || \ + ((SIZE) == MPU_REGION_SIZE_64B) || \ + ((SIZE) == MPU_REGION_SIZE_128B) || \ + ((SIZE) == MPU_REGION_SIZE_256B) || \ + ((SIZE) == MPU_REGION_SIZE_512B) || \ + ((SIZE) == MPU_REGION_SIZE_1KB) || \ + ((SIZE) == MPU_REGION_SIZE_2KB) || \ + ((SIZE) == MPU_REGION_SIZE_4KB) || \ + ((SIZE) == MPU_REGION_SIZE_8KB) || \ + ((SIZE) == MPU_REGION_SIZE_16KB) || \ + ((SIZE) == MPU_REGION_SIZE_32KB) || \ + ((SIZE) == MPU_REGION_SIZE_64KB) || \ + ((SIZE) == MPU_REGION_SIZE_128KB) || \ + ((SIZE) == MPU_REGION_SIZE_256KB) || \ + ((SIZE) == MPU_REGION_SIZE_512KB) || \ + ((SIZE) == MPU_REGION_SIZE_1MB) || \ + ((SIZE) == MPU_REGION_SIZE_2MB) || \ + ((SIZE) == MPU_REGION_SIZE_4MB) || \ + ((SIZE) == MPU_REGION_SIZE_8MB) || \ + ((SIZE) == MPU_REGION_SIZE_16MB) || \ + ((SIZE) == MPU_REGION_SIZE_32MB) || \ + ((SIZE) == MPU_REGION_SIZE_64MB) || \ + ((SIZE) == MPU_REGION_SIZE_128MB) || \ + ((SIZE) == MPU_REGION_SIZE_256MB) || \ + ((SIZE) == MPU_REGION_SIZE_512MB) || \ + ((SIZE) == MPU_REGION_SIZE_1GB) || \ + ((SIZE) == MPU_REGION_SIZE_2GB) || \ + ((SIZE) == MPU_REGION_SIZE_4GB)) + +#define IS_MPU_SUB_REGION_DISABLE(SUBREGION) ((SUBREGION) < (uint16_t)0x00FF) +#endif /* __MPU_PRESENT */ + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_CORTEX_H */ + + diff --git a/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h new file mode 100644 index 0000000..1df0d7d --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h @@ -0,0 +1,212 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_def.h + * @author MCD Application Team + * @brief This file contains HAL common defines, enumeration, macros and + * structures definitions. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_DEF +#define __STM32F4xx_HAL_DEF + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" +#include "Legacy/stm32_hal_legacy.h" +#include + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief HAL Status structures definition + */ +typedef enum +{ + HAL_OK = 0x00U, + HAL_ERROR = 0x01U, + HAL_BUSY = 0x02U, + HAL_TIMEOUT = 0x03U +} HAL_StatusTypeDef; + +/** + * @brief HAL Lock structures definition + */ +typedef enum +{ + HAL_UNLOCKED = 0x00U, + HAL_LOCKED = 0x01U +} HAL_LockTypeDef; + +/* Exported macro ------------------------------------------------------------*/ + +#if !defined(UNUSED) +#define UNUSED(X) (void)X /* To avoid gcc/g++ warnings */ +#endif /* UNUSED */ + +#define HAL_MAX_DELAY 0xFFFFFFFFU + +#define HAL_IS_BIT_SET(REG, BIT) (((REG) & (BIT)) == (BIT)) +#define HAL_IS_BIT_CLR(REG, BIT) (((REG) & (BIT)) == 0U) + +#define __HAL_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \ + do{ \ + (__HANDLE__)->__PPP_DMA_FIELD__ = &(__DMA_HANDLE__); \ + (__DMA_HANDLE__).Parent = (__HANDLE__); \ + } while(0U) + +/** @brief Reset the Handle's State field. + * @param __HANDLE__ specifies the Peripheral Handle. + * @note This macro can be used for the following purpose: + * - When the Handle is declared as local variable; before passing it as parameter + * to HAL_PPP_Init() for the first time, it is mandatory to use this macro + * to set to 0 the Handle's "State" field. + * Otherwise, "State" field may have any random value and the first time the function + * HAL_PPP_Init() is called, the low level hardware initialization will be missed + * (i.e. HAL_PPP_MspInit() will not be executed). + * - When there is a need to reconfigure the low level hardware: instead of calling + * HAL_PPP_DeInit() then HAL_PPP_Init(), user can make a call to this macro then HAL_PPP_Init(). + * In this later function, when the Handle's "State" field is set to 0, it will execute the function + * HAL_PPP_MspInit() which will reconfigure the low level hardware. + * @retval None + */ +#define __HAL_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = 0U) + +#if (USE_RTOS == 1U) + /* Reserved for future use */ + #error "USE_RTOS should be 0 in the current HAL release" +#else + #define __HAL_LOCK(__HANDLE__) \ + do{ \ + if((__HANDLE__)->Lock == HAL_LOCKED) \ + { \ + return HAL_BUSY; \ + } \ + else \ + { \ + (__HANDLE__)->Lock = HAL_LOCKED; \ + } \ + }while (0U) + + #define __HAL_UNLOCK(__HANDLE__) \ + do{ \ + (__HANDLE__)->Lock = HAL_UNLOCKED; \ + }while (0U) +#endif /* USE_RTOS */ + +#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) /* ARM Compiler V6 */ + #ifndef __weak + #define __weak __attribute__((weak)) + #endif + #ifndef __packed + #define __packed __attribute__((packed)) + #endif +#elif defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ + #ifndef __weak + #define __weak __attribute__((weak)) + #endif /* __weak */ + #ifndef __packed + #define __packed __attribute__((__packed__)) + #endif /* __packed */ +#endif /* __GNUC__ */ + + +/* Macro to get variable aligned on 4-bytes, for __ICCARM__ the directive "#pragma data_alignment=4" must be used instead */ +#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) /* ARM Compiler V6 */ + #ifndef __ALIGN_BEGIN + #define __ALIGN_BEGIN + #endif + #ifndef __ALIGN_END + #define __ALIGN_END __attribute__ ((aligned (4))) + #endif +#elif defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ + #ifndef __ALIGN_END +#define __ALIGN_END __attribute__ ((aligned (4))) + #endif /* __ALIGN_END */ + #ifndef __ALIGN_BEGIN + #define __ALIGN_BEGIN + #endif /* __ALIGN_BEGIN */ +#else + #ifndef __ALIGN_END + #define __ALIGN_END + #endif /* __ALIGN_END */ + #ifndef __ALIGN_BEGIN + #if defined (__CC_ARM) /* ARM Compiler V5*/ +#define __ALIGN_BEGIN __align(4) + #elif defined (__ICCARM__) /* IAR Compiler */ + #define __ALIGN_BEGIN + #endif /* __CC_ARM */ + #endif /* __ALIGN_BEGIN */ +#endif /* __GNUC__ */ + + +/** + * @brief __RAM_FUNC definition + */ +#if defined ( __CC_ARM ) || (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) +/* ARM Compiler V4/V5 and V6 + -------------------------- + RAM functions are defined using the toolchain options. + Functions that are executed in RAM should reside in a separate source module. + Using the 'Options for File' dialog you can simply change the 'Code / Const' + area of a module to a memory space in physical RAM. + Available memory areas are declared in the 'Target' tab of the 'Options for Target' + dialog. +*/ +#define __RAM_FUNC + +#elif defined ( __ICCARM__ ) +/* ICCARM Compiler + --------------- + RAM functions are defined using a specific toolchain keyword "__ramfunc". +*/ +#define __RAM_FUNC __ramfunc + +#elif defined ( __GNUC__ ) +/* GNU Compiler + ------------ + RAM functions are defined using a specific toolchain attribute + "__attribute__((section(".RamFunc")))". +*/ +#define __RAM_FUNC __attribute__((section(".RamFunc"))) + +#endif + +/** + * @brief __NOINLINE definition + */ +#if defined ( __CC_ARM ) || (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) || defined ( __GNUC__ ) +/* ARM V4/V5 and V6 & GNU Compiler + ------------------------------- +*/ +#define __NOINLINE __attribute__ ( (noinline) ) + +#elif defined ( __ICCARM__ ) +/* ICCARM Compiler + --------------- +*/ +#define __NOINLINE _Pragma("optimize = no_inline") + +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ___STM32F4xx_HAL_DEF */ + + diff --git a/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h new file mode 100644 index 0000000..7ff3836 --- /dev/null +++ b/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/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h new file mode 100644 index 0000000..9858c74 --- /dev/null +++ b/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/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h new file mode 100644 index 0000000..b18a228 --- /dev/null +++ b/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/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h new file mode 100644 index 0000000..41f77d2 --- /dev/null +++ b/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/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h new file mode 100644 index 0000000..5fa89db --- /dev/null +++ b/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/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h new file mode 100644 index 0000000..2112e74 --- /dev/null +++ b/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/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h new file mode 100644 index 0000000..5f3d749 --- /dev/null +++ b/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/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h new file mode 100644 index 0000000..5e0b7cc --- /dev/null +++ b/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/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h new file mode 100644 index 0000000..9a7a67e --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h @@ -0,0 +1,741 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_i2c.h + * @author MCD Application Team + * @brief Header file of I2C HAL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_I2C_H +#define __STM32F4xx_HAL_I2C_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup I2C + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup I2C_Exported_Types I2C Exported Types + * @{ + */ + +/** @defgroup I2C_Configuration_Structure_definition I2C Configuration Structure definition + * @brief I2C Configuration Structure definition + * @{ + */ +typedef struct +{ + uint32_t ClockSpeed; /*!< Specifies the clock frequency. + This parameter must be set to a value lower than 400kHz */ + + uint32_t DutyCycle; /*!< Specifies the I2C fast mode duty cycle. + This parameter can be a value of @ref I2C_duty_cycle_in_fast_mode */ + + uint32_t OwnAddress1; /*!< Specifies the first device own address. + This parameter can be a 7-bit or 10-bit address. */ + + uint32_t AddressingMode; /*!< Specifies if 7-bit or 10-bit addressing mode is selected. + This parameter can be a value of @ref I2C_addressing_mode */ + + uint32_t DualAddressMode; /*!< Specifies if dual addressing mode is selected. + This parameter can be a value of @ref I2C_dual_addressing_mode */ + + uint32_t OwnAddress2; /*!< Specifies the second device own address if dual addressing mode is selected + This parameter can be a 7-bit address. */ + + uint32_t GeneralCallMode; /*!< Specifies if general call mode is selected. + This parameter can be a value of @ref I2C_general_call_addressing_mode */ + + uint32_t NoStretchMode; /*!< Specifies if nostretch mode is selected. + This parameter can be a value of @ref I2C_nostretch_mode */ + +} I2C_InitTypeDef; + +/** + * @} + */ + +/** @defgroup HAL_state_structure_definition HAL state structure definition + * @brief HAL State structure definition + * @note HAL I2C State value coding follow below described bitmap : + * b7-b6 Error information + * 00 : No Error + * 01 : Abort (Abort user request on going) + * 10 : Timeout + * 11 : Error + * b5 Peripheral initialization status + * 0 : Reset (Peripheral not initialized) + * 1 : Init done (Peripheral initialized and ready to use. HAL I2C Init function called) + * b4 (not used) + * x : Should be set to 0 + * b3 + * 0 : Ready or Busy (No Listen mode ongoing) + * 1 : Listen (Peripheral in Address Listen Mode) + * b2 Intrinsic process state + * 0 : Ready + * 1 : Busy (Peripheral busy with some configuration or internal operations) + * b1 Rx state + * 0 : Ready (no Rx operation ongoing) + * 1 : Busy (Rx operation ongoing) + * b0 Tx state + * 0 : Ready (no Tx operation ongoing) + * 1 : Busy (Tx operation ongoing) + * @{ + */ +typedef enum +{ + HAL_I2C_STATE_RESET = 0x00U, /*!< Peripheral is not yet Initialized */ + HAL_I2C_STATE_READY = 0x20U, /*!< Peripheral Initialized and ready for use */ + HAL_I2C_STATE_BUSY = 0x24U, /*!< An internal process is ongoing */ + HAL_I2C_STATE_BUSY_TX = 0x21U, /*!< Data Transmission process is ongoing */ + HAL_I2C_STATE_BUSY_RX = 0x22U, /*!< Data Reception process is ongoing */ + HAL_I2C_STATE_LISTEN = 0x28U, /*!< Address Listen Mode is ongoing */ + HAL_I2C_STATE_BUSY_TX_LISTEN = 0x29U, /*!< Address Listen Mode and Data Transmission + process is ongoing */ + HAL_I2C_STATE_BUSY_RX_LISTEN = 0x2AU, /*!< Address Listen Mode and Data Reception + process is ongoing */ + HAL_I2C_STATE_ABORT = 0x60U, /*!< Abort user request ongoing */ + HAL_I2C_STATE_TIMEOUT = 0xA0U, /*!< Timeout state */ + HAL_I2C_STATE_ERROR = 0xE0U /*!< Error */ + +} HAL_I2C_StateTypeDef; + +/** + * @} + */ + +/** @defgroup HAL_mode_structure_definition HAL mode structure definition + * @brief HAL Mode structure definition + * @note HAL I2C Mode value coding follow below described bitmap :\n + * b7 (not used)\n + * x : Should be set to 0\n + * b6\n + * 0 : None\n + * 1 : Memory (HAL I2C communication is in Memory Mode)\n + * b5\n + * 0 : None\n + * 1 : Slave (HAL I2C communication is in Slave Mode)\n + * b4\n + * 0 : None\n + * 1 : Master (HAL I2C communication is in Master Mode)\n + * b3-b2-b1-b0 (not used)\n + * xxxx : Should be set to 0000 + * @{ + */ +typedef enum +{ + HAL_I2C_MODE_NONE = 0x00U, /*!< No I2C communication on going */ + HAL_I2C_MODE_MASTER = 0x10U, /*!< I2C communication is in Master Mode */ + HAL_I2C_MODE_SLAVE = 0x20U, /*!< I2C communication is in Slave Mode */ + HAL_I2C_MODE_MEM = 0x40U /*!< I2C communication is in Memory Mode */ + +} HAL_I2C_ModeTypeDef; + +/** + * @} + */ + +/** @defgroup I2C_Error_Code_definition I2C Error Code definition + * @brief I2C Error Code definition + * @{ + */ +#define HAL_I2C_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_I2C_ERROR_BERR 0x00000001U /*!< BERR error */ +#define HAL_I2C_ERROR_ARLO 0x00000002U /*!< ARLO error */ +#define HAL_I2C_ERROR_AF 0x00000004U /*!< AF error */ +#define HAL_I2C_ERROR_OVR 0x00000008U /*!< OVR error */ +#define HAL_I2C_ERROR_DMA 0x00000010U /*!< DMA transfer error */ +#define HAL_I2C_ERROR_TIMEOUT 0x00000020U /*!< Timeout Error */ +#define HAL_I2C_ERROR_SIZE 0x00000040U /*!< Size Management error */ +#define HAL_I2C_ERROR_DMA_PARAM 0x00000080U /*!< DMA Parameter Error */ +#define HAL_I2C_WRONG_START 0x00000200U /*!< Wrong start Error */ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +#define HAL_I2C_ERROR_INVALID_CALLBACK 0x00000100U /*!< Invalid Callback error */ +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +/** + * @} + */ + +/** @defgroup I2C_handle_Structure_definition I2C handle Structure definition + * @brief I2C handle Structure definition + * @{ + */ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +typedef struct __I2C_HandleTypeDef +#else +typedef struct +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +{ + I2C_TypeDef *Instance; /*!< I2C registers base address */ + + I2C_InitTypeDef Init; /*!< I2C communication parameters */ + + uint8_t *pBuffPtr; /*!< Pointer to I2C transfer buffer */ + + uint16_t XferSize; /*!< I2C transfer size */ + + __IO uint16_t XferCount; /*!< I2C transfer counter */ + + __IO uint32_t XferOptions; /*!< I2C transfer options */ + + __IO uint32_t PreviousState; /*!< I2C communication Previous state and mode + context for internal usage */ + + DMA_HandleTypeDef *hdmatx; /*!< I2C Tx DMA handle parameters */ + + DMA_HandleTypeDef *hdmarx; /*!< I2C Rx DMA handle parameters */ + + HAL_LockTypeDef Lock; /*!< I2C locking object */ + + __IO HAL_I2C_StateTypeDef State; /*!< I2C communication state */ + + __IO HAL_I2C_ModeTypeDef Mode; /*!< I2C communication mode */ + + __IO uint32_t ErrorCode; /*!< I2C Error code */ + + __IO uint32_t Devaddress; /*!< I2C Target device address */ + + __IO uint32_t Memaddress; /*!< I2C Target memory address */ + + __IO uint32_t MemaddSize; /*!< I2C Target memory address size */ + + __IO uint32_t EventCount; /*!< I2C Event counter */ + + +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + void (* MasterTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Master Tx Transfer completed callback */ + void (* MasterRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Master Rx Transfer completed callback */ + void (* SlaveTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Slave Tx Transfer completed callback */ + void (* SlaveRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Slave Rx Transfer completed callback */ + void (* ListenCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Listen Complete callback */ + void (* MemTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Memory Tx Transfer completed callback */ + void (* MemRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Memory Rx Transfer completed callback */ + void (* ErrorCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Error callback */ + void (* AbortCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Abort callback */ + + void (* AddrCallback)(struct __I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); /*!< I2C Slave Address Match callback */ + + void (* MspInitCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Msp Init callback */ + void (* MspDeInitCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Msp DeInit callback */ + +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +} I2C_HandleTypeDef; + +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +/** + * @brief HAL I2C Callback ID enumeration definition + */ +typedef enum +{ + HAL_I2C_MASTER_TX_COMPLETE_CB_ID = 0x00U, /*!< I2C Master Tx Transfer completed callback ID */ + HAL_I2C_MASTER_RX_COMPLETE_CB_ID = 0x01U, /*!< I2C Master Rx Transfer completed callback ID */ + HAL_I2C_SLAVE_TX_COMPLETE_CB_ID = 0x02U, /*!< I2C Slave Tx Transfer completed callback ID */ + HAL_I2C_SLAVE_RX_COMPLETE_CB_ID = 0x03U, /*!< I2C Slave Rx Transfer completed callback ID */ + HAL_I2C_LISTEN_COMPLETE_CB_ID = 0x04U, /*!< I2C Listen Complete callback ID */ + HAL_I2C_MEM_TX_COMPLETE_CB_ID = 0x05U, /*!< I2C Memory Tx Transfer callback ID */ + HAL_I2C_MEM_RX_COMPLETE_CB_ID = 0x06U, /*!< I2C Memory Rx Transfer completed callback ID */ + HAL_I2C_ERROR_CB_ID = 0x07U, /*!< I2C Error callback ID */ + HAL_I2C_ABORT_CB_ID = 0x08U, /*!< I2C Abort callback ID */ + + HAL_I2C_MSPINIT_CB_ID = 0x09U, /*!< I2C Msp Init callback ID */ + HAL_I2C_MSPDEINIT_CB_ID = 0x0AU /*!< I2C Msp DeInit callback ID */ + +} HAL_I2C_CallbackIDTypeDef; + +/** + * @brief HAL I2C Callback pointer definition + */ +typedef void (*pI2C_CallbackTypeDef)(I2C_HandleTypeDef *hi2c); /*!< pointer to an I2C callback function */ +typedef void (*pI2C_AddrCallbackTypeDef)(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); /*!< pointer to an I2C Address Match callback function */ + +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +/** + * @} + */ + +/** + * @} + */ +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup I2C_Exported_Constants I2C Exported Constants + * @{ + */ + +/** @defgroup I2C_duty_cycle_in_fast_mode I2C duty cycle in fast mode + * @{ + */ +#define I2C_DUTYCYCLE_2 0x00000000U +#define I2C_DUTYCYCLE_16_9 I2C_CCR_DUTY +/** + * @} + */ + +/** @defgroup I2C_addressing_mode I2C addressing mode + * @{ + */ +#define I2C_ADDRESSINGMODE_7BIT 0x00004000U +#define I2C_ADDRESSINGMODE_10BIT (I2C_OAR1_ADDMODE | 0x00004000U) +/** + * @} + */ + +/** @defgroup I2C_dual_addressing_mode I2C dual addressing mode + * @{ + */ +#define I2C_DUALADDRESS_DISABLE 0x00000000U +#define I2C_DUALADDRESS_ENABLE I2C_OAR2_ENDUAL +/** + * @} + */ + +/** @defgroup I2C_general_call_addressing_mode I2C general call addressing mode + * @{ + */ +#define I2C_GENERALCALL_DISABLE 0x00000000U +#define I2C_GENERALCALL_ENABLE I2C_CR1_ENGC +/** + * @} + */ + +/** @defgroup I2C_nostretch_mode I2C nostretch mode + * @{ + */ +#define I2C_NOSTRETCH_DISABLE 0x00000000U +#define I2C_NOSTRETCH_ENABLE I2C_CR1_NOSTRETCH +/** + * @} + */ + +/** @defgroup I2C_Memory_Address_Size I2C Memory Address Size + * @{ + */ +#define I2C_MEMADD_SIZE_8BIT 0x00000001U +#define I2C_MEMADD_SIZE_16BIT 0x00000010U +/** + * @} + */ + +/** @defgroup I2C_XferDirection_definition I2C XferDirection definition + * @{ + */ +#define I2C_DIRECTION_RECEIVE 0x00000000U +#define I2C_DIRECTION_TRANSMIT 0x00000001U +/** + * @} + */ + +/** @defgroup I2C_XferOptions_definition I2C XferOptions definition + * @{ + */ +#define I2C_FIRST_FRAME 0x00000001U +#define I2C_FIRST_AND_NEXT_FRAME 0x00000002U +#define I2C_NEXT_FRAME 0x00000004U +#define I2C_FIRST_AND_LAST_FRAME 0x00000008U +#define I2C_LAST_FRAME_NO_STOP 0x00000010U +#define I2C_LAST_FRAME 0x00000020U + +/* List of XferOptions in usage of : + * 1- Restart condition in all use cases (direction change or not) + */ +#define I2C_OTHER_FRAME (0x00AA0000U) +#define I2C_OTHER_AND_LAST_FRAME (0xAA000000U) +/** + * @} + */ + +/** @defgroup I2C_Interrupt_configuration_definition I2C Interrupt configuration definition + * @brief I2C Interrupt definition + * Elements values convention: 0xXXXXXXXX + * - XXXXXXXX : Interrupt control mask + * @{ + */ +#define I2C_IT_BUF I2C_CR2_ITBUFEN +#define I2C_IT_EVT I2C_CR2_ITEVTEN +#define I2C_IT_ERR I2C_CR2_ITERREN +/** + * @} + */ + +/** @defgroup I2C_Flag_definition I2C Flag definition + * @{ + */ + +#define I2C_FLAG_OVR 0x00010800U +#define I2C_FLAG_AF 0x00010400U +#define I2C_FLAG_ARLO 0x00010200U +#define I2C_FLAG_BERR 0x00010100U +#define I2C_FLAG_TXE 0x00010080U +#define I2C_FLAG_RXNE 0x00010040U +#define I2C_FLAG_STOPF 0x00010010U +#define I2C_FLAG_ADD10 0x00010008U +#define I2C_FLAG_BTF 0x00010004U +#define I2C_FLAG_ADDR 0x00010002U +#define I2C_FLAG_SB 0x00010001U +#define I2C_FLAG_DUALF 0x00100080U +#define I2C_FLAG_GENCALL 0x00100010U +#define I2C_FLAG_TRA 0x00100004U +#define I2C_FLAG_BUSY 0x00100002U +#define I2C_FLAG_MSL 0x00100001U +/** + * @} + */ + +/** + * @} + */ + +/* Exported macros -----------------------------------------------------------*/ + +/** @defgroup I2C_Exported_Macros I2C Exported Macros + * @{ + */ + +/** @brief Reset I2C handle state. + * @param __HANDLE__ specifies the I2C Handle. + * @retval None + */ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +#define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__) do{ \ + (__HANDLE__)->State = HAL_I2C_STATE_RESET; \ + (__HANDLE__)->MspInitCallback = NULL; \ + (__HANDLE__)->MspDeInitCallback = NULL; \ + } while(0) +#else +#define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_I2C_STATE_RESET) +#endif + +/** @brief Enable or disable the specified I2C interrupts. + * @param __HANDLE__ specifies the I2C Handle. + * @param __INTERRUPT__ specifies the interrupt source to enable or disable. + * This parameter can be one of the following values: + * @arg I2C_IT_BUF: Buffer interrupt enable + * @arg I2C_IT_EVT: Event interrupt enable + * @arg I2C_IT_ERR: Error interrupt enable + * @retval None + */ +#define __HAL_I2C_ENABLE_IT(__HANDLE__, __INTERRUPT__) SET_BIT((__HANDLE__)->Instance->CR2,(__INTERRUPT__)) +#define __HAL_I2C_DISABLE_IT(__HANDLE__, __INTERRUPT__) CLEAR_BIT((__HANDLE__)->Instance->CR2, (__INTERRUPT__)) + +/** @brief Checks if the specified I2C interrupt source is enabled or disabled. + * @param __HANDLE__ specifies the I2C Handle. + * @param __INTERRUPT__ specifies the I2C interrupt source to check. + * This parameter can be one of the following values: + * @arg I2C_IT_BUF: Buffer interrupt enable + * @arg I2C_IT_EVT: Event interrupt enable + * @arg I2C_IT_ERR: Error interrupt enable + * @retval The new state of __INTERRUPT__ (TRUE or FALSE). + */ +#define __HAL_I2C_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->CR2 & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) + +/** @brief Checks whether the specified I2C flag is set or not. + * @param __HANDLE__ specifies the I2C Handle. + * @param __FLAG__ specifies the flag to check. + * This parameter can be one of the following values: + * @arg I2C_FLAG_OVR: Overrun/Underrun flag + * @arg I2C_FLAG_AF: Acknowledge failure flag + * @arg I2C_FLAG_ARLO: Arbitration lost flag + * @arg I2C_FLAG_BERR: Bus error flag + * @arg I2C_FLAG_TXE: Data register empty flag + * @arg I2C_FLAG_RXNE: Data register not empty flag + * @arg I2C_FLAG_STOPF: Stop detection flag + * @arg I2C_FLAG_ADD10: 10-bit header sent flag + * @arg I2C_FLAG_BTF: Byte transfer finished flag + * @arg I2C_FLAG_ADDR: Address sent flag + * Address matched flag + * @arg I2C_FLAG_SB: Start bit flag + * @arg I2C_FLAG_DUALF: Dual flag + * @arg I2C_FLAG_GENCALL: General call header flag + * @arg I2C_FLAG_TRA: Transmitter/Receiver flag + * @arg I2C_FLAG_BUSY: Bus busy flag + * @arg I2C_FLAG_MSL: Master/Slave flag + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_I2C_GET_FLAG(__HANDLE__, __FLAG__) ((((uint8_t)((__FLAG__) >> 16U)) == 0x01U) ? \ + (((((__HANDLE__)->Instance->SR1) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET) : \ + (((((__HANDLE__)->Instance->SR2) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET)) + +/** @brief Clears the I2C pending flags which are cleared by writing 0 in a specific bit. + * @param __HANDLE__ specifies the I2C Handle. + * @param __FLAG__ specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode) + * @arg I2C_FLAG_AF: Acknowledge failure flag + * @arg I2C_FLAG_ARLO: Arbitration lost flag (Master mode) + * @arg I2C_FLAG_BERR: Bus error flag + * @retval None + */ +#define __HAL_I2C_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR1 = ~((__FLAG__) & I2C_FLAG_MASK)) + +/** @brief Clears the I2C ADDR pending flag. + * @param __HANDLE__ specifies the I2C Handle. + * This parameter can be I2C where x: 1, 2, or 3 to select the I2C peripheral. + * @retval None + */ +#define __HAL_I2C_CLEAR_ADDRFLAG(__HANDLE__) \ + do{ \ + __IO uint32_t tmpreg = 0x00U; \ + tmpreg = (__HANDLE__)->Instance->SR1; \ + tmpreg = (__HANDLE__)->Instance->SR2; \ + UNUSED(tmpreg); \ + } while(0) + +/** @brief Clears the I2C STOPF pending flag. + * @param __HANDLE__ specifies the I2C Handle. + * @retval None + */ +#define __HAL_I2C_CLEAR_STOPFLAG(__HANDLE__) \ + do{ \ + __IO uint32_t tmpreg = 0x00U; \ + tmpreg = (__HANDLE__)->Instance->SR1; \ + SET_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE); \ + UNUSED(tmpreg); \ + } while(0) + +/** @brief Enable the specified I2C peripheral. + * @param __HANDLE__ specifies the I2C Handle. + * @retval None + */ +#define __HAL_I2C_ENABLE(__HANDLE__) SET_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE) + +/** @brief Disable the specified I2C peripheral. + * @param __HANDLE__ specifies the I2C Handle. + * @retval None + */ +#define __HAL_I2C_DISABLE(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE) + +/** + * @} + */ + +/* Include I2C HAL Extension module */ +#include "stm32f4xx_hal_i2c_ex.h" + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup I2C_Exported_Functions + * @{ + */ + +/** @addtogroup I2C_Exported_Functions_Group1 Initialization and de-initialization functions + * @{ + */ +/* Initialization and de-initialization functions******************************/ +HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c); +HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c); +void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c); +void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c); + +/* Callbacks Register/UnRegister functions ***********************************/ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +HAL_StatusTypeDef HAL_I2C_RegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID, pI2C_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID); + +HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_AddrCallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +/** + * @} + */ + +/** @addtogroup I2C_Exported_Functions_Group2 Input and Output operation functions + * @{ + */ +/* IO operation functions ****************************************************/ +/******* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout); +HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout); +HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout); +HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout); +HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout); +HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout); +HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout); + +/******* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size); + +HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions); +HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions); +HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions); +HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions); +HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c); +HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c); +HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress); + +/******* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size); + +HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions); +HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions); +HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions); +HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions); +/** + * @} + */ + +/** @addtogroup I2C_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks + * @{ + */ +/******* I2C IRQHandler and Callbacks used in non blocking modes (Interrupt and DMA) */ +void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c); +void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c); +void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c); +void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c); +void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c); +void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c); +void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); +void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c); +void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c); +void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c); +void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c); +void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c); +/** + * @} + */ + +/** @addtogroup I2C_Exported_Functions_Group3 Peripheral State, Mode and Error functions + * @{ + */ +/* Peripheral State, Mode and Error functions *********************************/ +HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c); +HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c); +uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c); + +/** + * @} + */ + +/** + * @} + */ +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup I2C_Private_Constants I2C Private Constants + * @{ + */ +#define I2C_FLAG_MASK 0x0000FFFFU +#define I2C_MIN_PCLK_FREQ_STANDARD 2000000U /*!< 2 MHz */ +#define I2C_MIN_PCLK_FREQ_FAST 4000000U /*!< 4 MHz */ +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup I2C_Private_Macros I2C Private Macros + * @{ + */ + +#define I2C_MIN_PCLK_FREQ(__PCLK__, __SPEED__) (((__SPEED__) <= 100000U) ? ((__PCLK__) < I2C_MIN_PCLK_FREQ_STANDARD) : ((__PCLK__) < I2C_MIN_PCLK_FREQ_FAST)) +#define I2C_CCR_CALCULATION(__PCLK__, __SPEED__, __COEFF__) (((((__PCLK__) - 1U)/((__SPEED__) * (__COEFF__))) + 1U) & I2C_CCR_CCR) +#define I2C_FREQRANGE(__PCLK__) ((__PCLK__)/1000000U) +#define I2C_RISE_TIME(__FREQRANGE__, __SPEED__) (((__SPEED__) <= 100000U) ? ((__FREQRANGE__) + 1U) : ((((__FREQRANGE__) * 300U) / 1000U) + 1U)) +#define I2C_SPEED_STANDARD(__PCLK__, __SPEED__) ((I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 2U) < 4U)? 4U:I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 2U)) +#define I2C_SPEED_FAST(__PCLK__, __SPEED__, __DUTYCYCLE__) (((__DUTYCYCLE__) == I2C_DUTYCYCLE_2)? I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 3U) : (I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 25U) | I2C_DUTYCYCLE_16_9)) +#define I2C_SPEED(__PCLK__, __SPEED__, __DUTYCYCLE__) (((__SPEED__) <= 100000U)? (I2C_SPEED_STANDARD((__PCLK__), (__SPEED__))) : \ + ((I2C_SPEED_FAST((__PCLK__), (__SPEED__), (__DUTYCYCLE__)) & I2C_CCR_CCR) == 0U)? 1U : \ + ((I2C_SPEED_FAST((__PCLK__), (__SPEED__), (__DUTYCYCLE__))) | I2C_CCR_FS)) + +#define I2C_7BIT_ADD_WRITE(__ADDRESS__) ((uint8_t)((__ADDRESS__) & (uint8_t)(~I2C_OAR1_ADD0))) +#define I2C_7BIT_ADD_READ(__ADDRESS__) ((uint8_t)((__ADDRESS__) | I2C_OAR1_ADD0)) + +#define I2C_10BIT_ADDRESS(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)0x00FF))) +#define I2C_10BIT_HEADER_WRITE(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0x0300)) >> 7) | (uint16_t)0x00F0))) +#define I2C_10BIT_HEADER_READ(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0x0300)) >> 7) | (uint16_t)(0x00F1)))) + +#define I2C_MEM_ADD_MSB(__ADDRESS__) ((uint8_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0xFF00)) >> 8))) +#define I2C_MEM_ADD_LSB(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)0x00FF))) + +/** @defgroup I2C_IS_RTC_Definitions I2C Private macros to check input parameters + * @{ + */ +#define IS_I2C_DUTY_CYCLE(CYCLE) (((CYCLE) == I2C_DUTYCYCLE_2) || \ + ((CYCLE) == I2C_DUTYCYCLE_16_9)) +#define IS_I2C_ADDRESSING_MODE(ADDRESS) (((ADDRESS) == I2C_ADDRESSINGMODE_7BIT) || \ + ((ADDRESS) == I2C_ADDRESSINGMODE_10BIT)) +#define IS_I2C_DUAL_ADDRESS(ADDRESS) (((ADDRESS) == I2C_DUALADDRESS_DISABLE) || \ + ((ADDRESS) == I2C_DUALADDRESS_ENABLE)) +#define IS_I2C_GENERAL_CALL(CALL) (((CALL) == I2C_GENERALCALL_DISABLE) || \ + ((CALL) == I2C_GENERALCALL_ENABLE)) +#define IS_I2C_NO_STRETCH(STRETCH) (((STRETCH) == I2C_NOSTRETCH_DISABLE) || \ + ((STRETCH) == I2C_NOSTRETCH_ENABLE)) +#define IS_I2C_MEMADD_SIZE(SIZE) (((SIZE) == I2C_MEMADD_SIZE_8BIT) || \ + ((SIZE) == I2C_MEMADD_SIZE_16BIT)) +#define IS_I2C_CLOCK_SPEED(SPEED) (((SPEED) > 0U) && ((SPEED) <= 400000U)) +#define IS_I2C_OWN_ADDRESS1(ADDRESS1) (((ADDRESS1) & 0xFFFFFC00U) == 0U) +#define IS_I2C_OWN_ADDRESS2(ADDRESS2) (((ADDRESS2) & 0xFFFFFF01U) == 0U) +#define IS_I2C_TRANSFER_OPTIONS_REQUEST(REQUEST) (((REQUEST) == I2C_FIRST_FRAME) || \ + ((REQUEST) == I2C_FIRST_AND_NEXT_FRAME) || \ + ((REQUEST) == I2C_NEXT_FRAME) || \ + ((REQUEST) == I2C_FIRST_AND_LAST_FRAME) || \ + ((REQUEST) == I2C_LAST_FRAME) || \ + ((REQUEST) == I2C_LAST_FRAME_NO_STOP) || \ + IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST)) + +#define IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST) (((REQUEST) == I2C_OTHER_FRAME) || \ + ((REQUEST) == I2C_OTHER_AND_LAST_FRAME)) + +#define I2C_CHECK_FLAG(__ISR__, __FLAG__) ((((__ISR__) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET) +#define I2C_CHECK_IT_SOURCE(__CR1__, __IT__) ((((__CR1__) & (__IT__)) == (__IT__)) ? SET : RESET) +/** + * @} + */ + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup I2C_Private_Functions I2C Private Functions + * @{ + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /* __STM32F4xx_HAL_I2C_H */ + diff --git a/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c_ex.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c_ex.h new file mode 100644 index 0000000..31ad99c --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c_ex.h @@ -0,0 +1,115 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_i2c_ex.h + * @author MCD Application Team + * @brief Header file of I2C HAL Extension module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_I2C_EX_H +#define __STM32F4xx_HAL_I2C_EX_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF) +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup I2CEx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup I2CEx_Exported_Constants I2C Exported Constants + * @{ + */ + +/** @defgroup I2CEx_Analog_Filter I2C Analog Filter + * @{ + */ +#define I2C_ANALOGFILTER_ENABLE 0x00000000U +#define I2C_ANALOGFILTER_DISABLE I2C_FLTR_ANOFF +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup I2CEx_Exported_Functions + * @{ + */ + +/** @addtogroup I2CEx_Exported_Functions_Group1 + * @{ + */ +/* Peripheral Control functions ************************************************/ +HAL_StatusTypeDef HAL_I2CEx_ConfigAnalogFilter(I2C_HandleTypeDef *hi2c, uint32_t AnalogFilter); +HAL_StatusTypeDef HAL_I2CEx_ConfigDigitalFilter(I2C_HandleTypeDef *hi2c, uint32_t DigitalFilter); +/** + * @} + */ + +/** + * @} + */ +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup I2CEx_Private_Constants I2C Private Constants + * @{ + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup I2CEx_Private_Macros I2C Private Macros + * @{ + */ +#define IS_I2C_ANALOG_FILTER(FILTER) (((FILTER) == I2C_ANALOGFILTER_ENABLE) || \ + ((FILTER) == I2C_ANALOGFILTER_DISABLE)) +#define IS_I2C_DIGITAL_FILTER(FILTER) ((FILTER) <= 0x0000000FU) +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_I2C_EX_H */ + + diff --git a/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h new file mode 100644 index 0000000..a7273d5 --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h @@ -0,0 +1,436 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_pwr.h + * @author MCD Application Team + * @brief Header file of PWR HAL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_PWR_H +#define __STM32F4xx_HAL_PWR_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup PWR + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @defgroup PWR_Exported_Types PWR Exported Types + * @{ + */ + +/** + * @brief PWR PVD configuration structure definition + */ +typedef struct +{ + uint32_t PVDLevel; /*!< PVDLevel: Specifies the PVD detection level. + This parameter can be a value of @ref PWR_PVD_detection_level */ + + uint32_t Mode; /*!< Mode: Specifies the operating mode for the selected pins. + This parameter can be a value of @ref PWR_PVD_Mode */ +}PWR_PVDTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup PWR_Exported_Constants PWR Exported Constants + * @{ + */ + +/** @defgroup PWR_WakeUp_Pins PWR WakeUp Pins + * @{ + */ +#define PWR_WAKEUP_PIN1 0x00000100U +/** + * @} + */ + +/** @defgroup PWR_PVD_detection_level PWR PVD detection level + * @{ + */ +#define PWR_PVDLEVEL_0 PWR_CR_PLS_LEV0 +#define PWR_PVDLEVEL_1 PWR_CR_PLS_LEV1 +#define PWR_PVDLEVEL_2 PWR_CR_PLS_LEV2 +#define PWR_PVDLEVEL_3 PWR_CR_PLS_LEV3 +#define PWR_PVDLEVEL_4 PWR_CR_PLS_LEV4 +#define PWR_PVDLEVEL_5 PWR_CR_PLS_LEV5 +#define PWR_PVDLEVEL_6 PWR_CR_PLS_LEV6 +#define PWR_PVDLEVEL_7 PWR_CR_PLS_LEV7/* External input analog voltage + (Compare internally to VREFINT) */ +/** + * @} + */ + +/** @defgroup PWR_PVD_Mode PWR PVD Mode + * @{ + */ +#define PWR_PVD_MODE_NORMAL 0x00000000U /*!< basic mode is used */ +#define PWR_PVD_MODE_IT_RISING 0x00010001U /*!< External Interrupt Mode with Rising edge trigger detection */ +#define PWR_PVD_MODE_IT_FALLING 0x00010002U /*!< External Interrupt Mode with Falling edge trigger detection */ +#define PWR_PVD_MODE_IT_RISING_FALLING 0x00010003U /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ +#define PWR_PVD_MODE_EVENT_RISING 0x00020001U /*!< Event Mode with Rising edge trigger detection */ +#define PWR_PVD_MODE_EVENT_FALLING 0x00020002U /*!< Event Mode with Falling edge trigger detection */ +#define PWR_PVD_MODE_EVENT_RISING_FALLING 0x00020003U /*!< Event Mode with Rising/Falling edge trigger detection */ +/** + * @} + */ + + +/** @defgroup PWR_Regulator_state_in_STOP_mode PWR Regulator state in SLEEP/STOP mode + * @{ + */ +#define PWR_MAINREGULATOR_ON 0x00000000U +#define PWR_LOWPOWERREGULATOR_ON PWR_CR_LPDS +/** + * @} + */ + +/** @defgroup PWR_SLEEP_mode_entry PWR SLEEP mode entry + * @{ + */ +#define PWR_SLEEPENTRY_WFI ((uint8_t)0x01) +#define PWR_SLEEPENTRY_WFE ((uint8_t)0x02) +#define PWR_SLEEPENTRY_WFE_NO_EVT_CLEAR ((uint8_t)0x03) + +/** + * @} + */ + +/** @defgroup PWR_STOP_mode_entry PWR STOP mode entry + * @{ + */ +#define PWR_STOPENTRY_WFI ((uint8_t)0x01) +#define PWR_STOPENTRY_WFE ((uint8_t)0x02) +#define PWR_STOPENTRY_WFE_NO_EVT_CLEAR ((uint8_t)0x03) +/** + * @} + */ + +/** @defgroup PWR_Flag PWR Flag + * @{ + */ +#define PWR_FLAG_WU PWR_CSR_WUF +#define PWR_FLAG_SB PWR_CSR_SBF +#define PWR_FLAG_PVDO PWR_CSR_PVDO +#define PWR_FLAG_BRR PWR_CSR_BRR +#define PWR_FLAG_VOSRDY PWR_CSR_VOSRDY +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup PWR_Exported_Macro PWR Exported Macro + * @{ + */ + +/** @brief Check PWR flag is set or not. + * @param __FLAG__ specifies the flag to check. + * This parameter can be one of the following values: + * @arg PWR_FLAG_WU: Wake Up flag. This flag indicates that a wakeup event + * was received from the WKUP pin or from the RTC alarm (Alarm A + * or Alarm B), RTC Tamper event, RTC TimeStamp event or RTC Wakeup. + * An additional wakeup event is detected if the WKUP pin is enabled + * (by setting the EWUP bit) when the WKUP pin level is already high. + * @arg PWR_FLAG_SB: StandBy flag. This flag indicates that the system was + * resumed from StandBy mode. + * @arg PWR_FLAG_PVDO: PVD Output. This flag is valid only if PVD is enabled + * by the HAL_PWR_EnablePVD() function. The PVD is stopped by Standby mode + * For this reason, this bit is equal to 0 after Standby or reset + * until the PVDE bit is set. + * @arg PWR_FLAG_BRR: Backup regulator ready flag. This bit is not reset + * when the device wakes up from Standby mode or by a system reset + * or power reset. + * @arg PWR_FLAG_VOSRDY: This flag indicates that the Regulator voltage + * scaling output selection is ready. + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_PWR_GET_FLAG(__FLAG__) ((PWR->CSR & (__FLAG__)) == (__FLAG__)) + +/** @brief Clear the PWR's pending flags. + * @param __FLAG__ specifies the flag to clear. + * This parameter can be one of the following values: + * @arg PWR_FLAG_WU: Wake Up flag + * @arg PWR_FLAG_SB: StandBy flag + */ +#define __HAL_PWR_CLEAR_FLAG(__FLAG__) (PWR->CR |= (__FLAG__) << 2U) + +/** + * @brief Enable the PVD Exti Line 16. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_ENABLE_IT() (EXTI->IMR |= (PWR_EXTI_LINE_PVD)) + +/** + * @brief Disable the PVD EXTI Line 16. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_DISABLE_IT() (EXTI->IMR &= ~(PWR_EXTI_LINE_PVD)) + +/** + * @brief Enable event on PVD Exti Line 16. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_ENABLE_EVENT() (EXTI->EMR |= (PWR_EXTI_LINE_PVD)) + +/** + * @brief Disable event on PVD Exti Line 16. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_DISABLE_EVENT() (EXTI->EMR &= ~(PWR_EXTI_LINE_PVD)) + +/** + * @brief Enable the PVD Extended Interrupt Rising Trigger. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE() SET_BIT(EXTI->RTSR, PWR_EXTI_LINE_PVD) + +/** + * @brief Disable the PVD Extended Interrupt Rising Trigger. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE() CLEAR_BIT(EXTI->RTSR, PWR_EXTI_LINE_PVD) + +/** + * @brief Enable the PVD Extended Interrupt Falling Trigger. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE() SET_BIT(EXTI->FTSR, PWR_EXTI_LINE_PVD) + + +/** + * @brief Disable the PVD Extended Interrupt Falling Trigger. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE() CLEAR_BIT(EXTI->FTSR, PWR_EXTI_LINE_PVD) + + +/** + * @brief PVD EXTI line configuration: set rising & falling edge trigger. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_ENABLE_RISING_FALLING_EDGE() do{__HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE();\ + __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE();\ + }while(0U) + +/** + * @brief Disable the PVD Extended Interrupt Rising & Falling Trigger. + * This parameter can be: + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_FALLING_EDGE() do{__HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE();\ + __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE();\ + }while(0U) + +/** + * @brief checks whether the specified PVD Exti interrupt flag is set or not. + * @retval EXTI PVD Line Status. + */ +#define __HAL_PWR_PVD_EXTI_GET_FLAG() (EXTI->PR & (PWR_EXTI_LINE_PVD)) + +/** + * @brief Clear the PVD Exti flag. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_CLEAR_FLAG() (EXTI->PR = (PWR_EXTI_LINE_PVD)) + +/** + * @brief Generates a Software interrupt on PVD EXTI line. + * @retval None + */ +#define __HAL_PWR_PVD_EXTI_GENERATE_SWIT() (EXTI->SWIER |= (PWR_EXTI_LINE_PVD)) + +/** + * @} + */ + +/* Include PWR HAL Extension module */ +#include "stm32f4xx_hal_pwr_ex.h" + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup PWR_Exported_Functions PWR Exported Functions + * @{ + */ + +/** @addtogroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions + * @{ + */ +/* Initialization and de-initialization functions *****************************/ +void HAL_PWR_DeInit(void); +void HAL_PWR_EnableBkUpAccess(void); +void HAL_PWR_DisableBkUpAccess(void); +/** + * @} + */ + +/** @addtogroup PWR_Exported_Functions_Group2 Peripheral Control functions + * @{ + */ +/* Peripheral Control functions **********************************************/ +/* PVD configuration */ +void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD); +void HAL_PWR_EnablePVD(void); +void HAL_PWR_DisablePVD(void); + +/* WakeUp pins configuration */ +void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx); +void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx); + +/* Low Power modes entry */ +void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry); +void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry); +void HAL_PWR_EnterSTANDBYMode(void); + +/* Power PVD IRQ Handler */ +void HAL_PWR_PVD_IRQHandler(void); +void HAL_PWR_PVDCallback(void); + +/* Cortex System Control functions *******************************************/ +void HAL_PWR_EnableSleepOnExit(void); +void HAL_PWR_DisableSleepOnExit(void); +void HAL_PWR_EnableSEVOnPend(void); +void HAL_PWR_DisableSEVOnPend(void); +/** + * @} + */ + +/** + * @} + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup PWR_Private_Constants PWR Private Constants + * @{ + */ + +/** @defgroup PWR_PVD_EXTI_Line PWR PVD EXTI Line + * @{ + */ +#define PWR_EXTI_LINE_PVD ((uint32_t)EXTI_IMR_MR16) /*!< External interrupt line 16 Connected to the PVD EXTI Line */ +/** + * @} + */ + +/** @defgroup PWR_register_alias_address PWR Register alias address + * @{ + */ +/* ------------- PWR registers bit address in the alias region ---------------*/ +#define PWR_OFFSET (PWR_BASE - PERIPH_BASE) +#define PWR_CR_OFFSET 0x00U +#define PWR_CSR_OFFSET 0x04U +#define PWR_CR_OFFSET_BB (PWR_OFFSET + PWR_CR_OFFSET) +#define PWR_CSR_OFFSET_BB (PWR_OFFSET + PWR_CSR_OFFSET) +/** + * @} + */ + +/** @defgroup PWR_CR_register_alias PWR CR Register alias address + * @{ + */ +/* --- CR Register ---*/ +/* Alias word address of DBP bit */ +#define DBP_BIT_NUMBER PWR_CR_DBP_Pos +#define CR_DBP_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (DBP_BIT_NUMBER * 4U)) + +/* Alias word address of PVDE bit */ +#define PVDE_BIT_NUMBER PWR_CR_PVDE_Pos +#define CR_PVDE_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (PVDE_BIT_NUMBER * 4U)) + +/* Alias word address of VOS bit */ +#define VOS_BIT_NUMBER PWR_CR_VOS_Pos +#define CR_VOS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (VOS_BIT_NUMBER * 4U)) +/** + * @} + */ + +/** @defgroup PWR_CSR_register_alias PWR CSR Register alias address + * @{ + */ +/* --- CSR Register ---*/ +/* Alias word address of EWUP bit */ +#define EWUP_BIT_NUMBER PWR_CSR_EWUP_Pos +#define CSR_EWUP_BB (PERIPH_BB_BASE + (PWR_CSR_OFFSET_BB * 32U) + (EWUP_BIT_NUMBER * 4U)) +/** + * @} + */ + +/** + * @} + */ +/* Private macros ------------------------------------------------------------*/ +/** @defgroup PWR_Private_Macros PWR Private Macros + * @{ + */ + +/** @defgroup PWR_IS_PWR_Definitions PWR Private macros to check input parameters + * @{ + */ +#define IS_PWR_PVD_LEVEL(LEVEL) (((LEVEL) == PWR_PVDLEVEL_0) || ((LEVEL) == PWR_PVDLEVEL_1)|| \ + ((LEVEL) == PWR_PVDLEVEL_2) || ((LEVEL) == PWR_PVDLEVEL_3)|| \ + ((LEVEL) == PWR_PVDLEVEL_4) || ((LEVEL) == PWR_PVDLEVEL_5)|| \ + ((LEVEL) == PWR_PVDLEVEL_6) || ((LEVEL) == PWR_PVDLEVEL_7)) +#define IS_PWR_PVD_MODE(MODE) (((MODE) == PWR_PVD_MODE_IT_RISING)|| ((MODE) == PWR_PVD_MODE_IT_FALLING) || \ + ((MODE) == PWR_PVD_MODE_IT_RISING_FALLING) || ((MODE) == PWR_PVD_MODE_EVENT_RISING) || \ + ((MODE) == PWR_PVD_MODE_EVENT_FALLING) || ((MODE) == PWR_PVD_MODE_EVENT_RISING_FALLING) || \ + ((MODE) == PWR_PVD_MODE_NORMAL)) +#define IS_PWR_REGULATOR(REGULATOR) (((REGULATOR) == PWR_MAINREGULATOR_ON) || \ + ((REGULATOR) == PWR_LOWPOWERREGULATOR_ON)) + +#define IS_PWR_SLEEP_ENTRY(ENTRY) (((ENTRY) == PWR_SLEEPENTRY_WFI) || \ + ((ENTRY) == PWR_SLEEPENTRY_WFE) || \ + ((ENTRY) == PWR_SLEEPENTRY_WFE_NO_EVT_CLEAR)) + +#define IS_PWR_STOP_ENTRY(ENTRY) (((ENTRY) == PWR_STOPENTRY_WFI) || \ + ((ENTRY) == PWR_STOPENTRY_WFE) || \ + ((ENTRY) == PWR_STOPENTRY_WFE_NO_EVT_CLEAR)) +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /* __STM32F4xx_HAL_PWR_H */ diff --git a/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h new file mode 100644 index 0000000..57fd4d9 --- /dev/null +++ b/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/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h new file mode 100644 index 0000000..2e3909a --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h @@ -0,0 +1,1458 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_rcc.h + * @author MCD Application Team + * @brief Header file of RCC HAL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_RCC_H +#define __STM32F4xx_HAL_RCC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/* Include RCC HAL Extended module */ +/* (include on top of file since RCC structures are defined in extended file) */ +#include "stm32f4xx_hal_rcc_ex.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup RCC + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup RCC_Exported_Types RCC Exported Types + * @{ + */ + +/** + * @brief RCC Internal/External Oscillator (HSE, HSI, LSE and LSI) configuration structure definition + */ +typedef struct +{ + uint32_t OscillatorType; /*!< The oscillators to be configured. + This parameter can be a value of @ref RCC_Oscillator_Type */ + + uint32_t HSEState; /*!< The new state of the HSE. + This parameter can be a value of @ref RCC_HSE_Config */ + + uint32_t LSEState; /*!< The new state of the LSE. + This parameter can be a value of @ref RCC_LSE_Config */ + + uint32_t HSIState; /*!< The new state of the HSI. + This parameter can be a value of @ref RCC_HSI_Config */ + + uint32_t HSICalibrationValue; /*!< The HSI calibration trimming value (default is RCC_HSICALIBRATION_DEFAULT). + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F */ + + uint32_t LSIState; /*!< The new state of the LSI. + This parameter can be a value of @ref RCC_LSI_Config */ + + RCC_PLLInitTypeDef PLL; /*!< PLL structure parameters */ +} RCC_OscInitTypeDef; + +/** + * @brief RCC System, AHB and APB busses clock configuration structure definition + */ +typedef struct +{ + uint32_t ClockType; /*!< The clock to be configured. + This parameter can be a value of @ref RCC_System_Clock_Type */ + + uint32_t SYSCLKSource; /*!< The clock source (SYSCLKS) used as system clock. + This parameter can be a value of @ref RCC_System_Clock_Source */ + + uint32_t AHBCLKDivider; /*!< The AHB clock (HCLK) divider. This clock is derived from the system clock (SYSCLK). + This parameter can be a value of @ref RCC_AHB_Clock_Source */ + + uint32_t APB1CLKDivider; /*!< The APB1 clock (PCLK1) divider. This clock is derived from the AHB clock (HCLK). + This parameter can be a value of @ref RCC_APB1_APB2_Clock_Source */ + + uint32_t APB2CLKDivider; /*!< The APB2 clock (PCLK2) divider. This clock is derived from the AHB clock (HCLK). + This parameter can be a value of @ref RCC_APB1_APB2_Clock_Source */ + +} RCC_ClkInitTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup RCC_Exported_Constants RCC Exported Constants + * @{ + */ + +/** @defgroup RCC_Oscillator_Type Oscillator Type + * @{ + */ +#define RCC_OSCILLATORTYPE_NONE 0x00000000U +#define RCC_OSCILLATORTYPE_HSE 0x00000001U +#define RCC_OSCILLATORTYPE_HSI 0x00000002U +#define RCC_OSCILLATORTYPE_LSE 0x00000004U +#define RCC_OSCILLATORTYPE_LSI 0x00000008U +/** + * @} + */ + +/** @defgroup RCC_HSE_Config HSE Config + * @{ + */ +#define RCC_HSE_OFF 0x00000000U +#define RCC_HSE_ON RCC_CR_HSEON +#define RCC_HSE_BYPASS ((uint32_t)(RCC_CR_HSEBYP | RCC_CR_HSEON)) +/** + * @} + */ + +/** @defgroup RCC_LSE_Config LSE Config + * @{ + */ +#define RCC_LSE_OFF 0x00000000U +#define RCC_LSE_ON RCC_BDCR_LSEON +#define RCC_LSE_BYPASS ((uint32_t)(RCC_BDCR_LSEBYP | RCC_BDCR_LSEON)) +/** + * @} + */ + +/** @defgroup RCC_HSI_Config HSI Config + * @{ + */ +#define RCC_HSI_OFF ((uint8_t)0x00) +#define RCC_HSI_ON ((uint8_t)0x01) + +#define RCC_HSICALIBRATION_DEFAULT 0x10U /* Default HSI calibration trimming value */ +/** + * @} + */ + +/** @defgroup RCC_LSI_Config LSI Config + * @{ + */ +#define RCC_LSI_OFF ((uint8_t)0x00) +#define RCC_LSI_ON ((uint8_t)0x01) +/** + * @} + */ + +/** @defgroup RCC_PLL_Config PLL Config + * @{ + */ +#define RCC_PLL_NONE ((uint8_t)0x00) +#define RCC_PLL_OFF ((uint8_t)0x01) +#define RCC_PLL_ON ((uint8_t)0x02) +/** + * @} + */ + +/** @defgroup RCC_PLLP_Clock_Divider PLLP Clock Divider + * @{ + */ +#define RCC_PLLP_DIV2 0x00000002U +#define RCC_PLLP_DIV4 0x00000004U +#define RCC_PLLP_DIV6 0x00000006U +#define RCC_PLLP_DIV8 0x00000008U +/** + * @} + */ + +/** @defgroup RCC_PLL_Clock_Source PLL Clock Source + * @{ + */ +#define RCC_PLLSOURCE_HSI RCC_PLLCFGR_PLLSRC_HSI +#define RCC_PLLSOURCE_HSE RCC_PLLCFGR_PLLSRC_HSE +/** + * @} + */ + +/** @defgroup RCC_System_Clock_Type System Clock Type + * @{ + */ +#define RCC_CLOCKTYPE_SYSCLK 0x00000001U +#define RCC_CLOCKTYPE_HCLK 0x00000002U +#define RCC_CLOCKTYPE_PCLK1 0x00000004U +#define RCC_CLOCKTYPE_PCLK2 0x00000008U +/** + * @} + */ + +/** @defgroup RCC_System_Clock_Source System Clock Source + * @note The RCC_SYSCLKSOURCE_PLLRCLK parameter is available only for + * STM32F446xx devices. + * @{ + */ +#define RCC_SYSCLKSOURCE_HSI RCC_CFGR_SW_HSI +#define RCC_SYSCLKSOURCE_HSE RCC_CFGR_SW_HSE +#define RCC_SYSCLKSOURCE_PLLCLK RCC_CFGR_SW_PLL +#define RCC_SYSCLKSOURCE_PLLRCLK ((uint32_t)(RCC_CFGR_SW_0 | RCC_CFGR_SW_1)) +/** + * @} + */ + +/** @defgroup RCC_System_Clock_Source_Status System Clock Source Status + * @note The RCC_SYSCLKSOURCE_STATUS_PLLRCLK parameter is available only for + * STM32F446xx devices. + * @{ + */ +#define RCC_SYSCLKSOURCE_STATUS_HSI RCC_CFGR_SWS_HSI /*!< HSI used as system clock */ +#define RCC_SYSCLKSOURCE_STATUS_HSE RCC_CFGR_SWS_HSE /*!< HSE used as system clock */ +#define RCC_SYSCLKSOURCE_STATUS_PLLCLK RCC_CFGR_SWS_PLL /*!< PLL used as system clock */ +#define RCC_SYSCLKSOURCE_STATUS_PLLRCLK ((uint32_t)(RCC_CFGR_SWS_0 | RCC_CFGR_SWS_1)) /*!< PLLR used as system clock */ +/** + * @} + */ + +/** @defgroup RCC_AHB_Clock_Source AHB Clock Source + * @{ + */ +#define RCC_SYSCLK_DIV1 RCC_CFGR_HPRE_DIV1 +#define RCC_SYSCLK_DIV2 RCC_CFGR_HPRE_DIV2 +#define RCC_SYSCLK_DIV4 RCC_CFGR_HPRE_DIV4 +#define RCC_SYSCLK_DIV8 RCC_CFGR_HPRE_DIV8 +#define RCC_SYSCLK_DIV16 RCC_CFGR_HPRE_DIV16 +#define RCC_SYSCLK_DIV64 RCC_CFGR_HPRE_DIV64 +#define RCC_SYSCLK_DIV128 RCC_CFGR_HPRE_DIV128 +#define RCC_SYSCLK_DIV256 RCC_CFGR_HPRE_DIV256 +#define RCC_SYSCLK_DIV512 RCC_CFGR_HPRE_DIV512 +/** + * @} + */ + +/** @defgroup RCC_APB1_APB2_Clock_Source APB1/APB2 Clock Source + * @{ + */ +#define RCC_HCLK_DIV1 RCC_CFGR_PPRE1_DIV1 +#define RCC_HCLK_DIV2 RCC_CFGR_PPRE1_DIV2 +#define RCC_HCLK_DIV4 RCC_CFGR_PPRE1_DIV4 +#define RCC_HCLK_DIV8 RCC_CFGR_PPRE1_DIV8 +#define RCC_HCLK_DIV16 RCC_CFGR_PPRE1_DIV16 +/** + * @} + */ + +/** @defgroup RCC_RTC_Clock_Source RTC Clock Source + * @{ + */ +#define RCC_RTCCLKSOURCE_NO_CLK 0x00000000U +#define RCC_RTCCLKSOURCE_LSE 0x00000100U +#define RCC_RTCCLKSOURCE_LSI 0x00000200U +#define RCC_RTCCLKSOURCE_HSE_DIVX 0x00000300U +#define RCC_RTCCLKSOURCE_HSE_DIV2 0x00020300U +#define RCC_RTCCLKSOURCE_HSE_DIV3 0x00030300U +#define RCC_RTCCLKSOURCE_HSE_DIV4 0x00040300U +#define RCC_RTCCLKSOURCE_HSE_DIV5 0x00050300U +#define RCC_RTCCLKSOURCE_HSE_DIV6 0x00060300U +#define RCC_RTCCLKSOURCE_HSE_DIV7 0x00070300U +#define RCC_RTCCLKSOURCE_HSE_DIV8 0x00080300U +#define RCC_RTCCLKSOURCE_HSE_DIV9 0x00090300U +#define RCC_RTCCLKSOURCE_HSE_DIV10 0x000A0300U +#define RCC_RTCCLKSOURCE_HSE_DIV11 0x000B0300U +#define RCC_RTCCLKSOURCE_HSE_DIV12 0x000C0300U +#define RCC_RTCCLKSOURCE_HSE_DIV13 0x000D0300U +#define RCC_RTCCLKSOURCE_HSE_DIV14 0x000E0300U +#define RCC_RTCCLKSOURCE_HSE_DIV15 0x000F0300U +#define RCC_RTCCLKSOURCE_HSE_DIV16 0x00100300U +#define RCC_RTCCLKSOURCE_HSE_DIV17 0x00110300U +#define RCC_RTCCLKSOURCE_HSE_DIV18 0x00120300U +#define RCC_RTCCLKSOURCE_HSE_DIV19 0x00130300U +#define RCC_RTCCLKSOURCE_HSE_DIV20 0x00140300U +#define RCC_RTCCLKSOURCE_HSE_DIV21 0x00150300U +#define RCC_RTCCLKSOURCE_HSE_DIV22 0x00160300U +#define RCC_RTCCLKSOURCE_HSE_DIV23 0x00170300U +#define RCC_RTCCLKSOURCE_HSE_DIV24 0x00180300U +#define RCC_RTCCLKSOURCE_HSE_DIV25 0x00190300U +#define RCC_RTCCLKSOURCE_HSE_DIV26 0x001A0300U +#define RCC_RTCCLKSOURCE_HSE_DIV27 0x001B0300U +#define RCC_RTCCLKSOURCE_HSE_DIV28 0x001C0300U +#define RCC_RTCCLKSOURCE_HSE_DIV29 0x001D0300U +#define RCC_RTCCLKSOURCE_HSE_DIV30 0x001E0300U +#define RCC_RTCCLKSOURCE_HSE_DIV31 0x001F0300U +/** + * @} + */ + +/** @defgroup RCC_MCO_Index MCO Index + * @{ + */ +#define RCC_MCO1 0x00000000U +#define RCC_MCO2 0x00000001U +/** + * @} + */ + +/** @defgroup RCC_MCO1_Clock_Source MCO1 Clock Source + * @{ + */ +#define RCC_MCO1SOURCE_HSI 0x00000000U +#define RCC_MCO1SOURCE_LSE RCC_CFGR_MCO1_0 +#define RCC_MCO1SOURCE_HSE RCC_CFGR_MCO1_1 +#define RCC_MCO1SOURCE_PLLCLK RCC_CFGR_MCO1 +/** + * @} + */ + +/** @defgroup RCC_MCOx_Clock_Prescaler MCOx Clock Prescaler + * @{ + */ +#define RCC_MCODIV_1 0x00000000U +#define RCC_MCODIV_2 RCC_CFGR_MCO1PRE_2 +#define RCC_MCODIV_3 ((uint32_t)RCC_CFGR_MCO1PRE_0 | RCC_CFGR_MCO1PRE_2) +#define RCC_MCODIV_4 ((uint32_t)RCC_CFGR_MCO1PRE_1 | RCC_CFGR_MCO1PRE_2) +#define RCC_MCODIV_5 RCC_CFGR_MCO1PRE +/** + * @} + */ + +/** @defgroup RCC_Interrupt Interrupts + * @{ + */ +#define RCC_IT_LSIRDY ((uint8_t)0x01) +#define RCC_IT_LSERDY ((uint8_t)0x02) +#define RCC_IT_HSIRDY ((uint8_t)0x04) +#define RCC_IT_HSERDY ((uint8_t)0x08) +#define RCC_IT_PLLRDY ((uint8_t)0x10) +#define RCC_IT_PLLI2SRDY ((uint8_t)0x20) +#define RCC_IT_CSS ((uint8_t)0x80) +/** + * @} + */ + +/** @defgroup RCC_Flag Flags + * Elements values convention: 0XXYYYYYb + * - YYYYY : Flag position in the register + * - 0XX : Register index + * - 01: CR register + * - 10: BDCR register + * - 11: CSR register + * @{ + */ +/* Flags in the CR register */ +#define RCC_FLAG_HSIRDY ((uint8_t)0x21) +#define RCC_FLAG_HSERDY ((uint8_t)0x31) +#define RCC_FLAG_PLLRDY ((uint8_t)0x39) +#define RCC_FLAG_PLLI2SRDY ((uint8_t)0x3B) + +/* Flags in the BDCR register */ +#define RCC_FLAG_LSERDY ((uint8_t)0x41) + +/* Flags in the CSR register */ +#define RCC_FLAG_LSIRDY ((uint8_t)0x61) +#define RCC_FLAG_BORRST ((uint8_t)0x79) +#define RCC_FLAG_PINRST ((uint8_t)0x7A) +#define RCC_FLAG_PORRST ((uint8_t)0x7B) +#define RCC_FLAG_SFTRST ((uint8_t)0x7C) +#define RCC_FLAG_IWDGRST ((uint8_t)0x7D) +#define RCC_FLAG_WWDGRST ((uint8_t)0x7E) +#define RCC_FLAG_LPWRRST ((uint8_t)0x7F) +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup RCC_Exported_Macros RCC Exported Macros + * @{ + */ + +/** @defgroup RCC_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOA_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOB_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOBEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOBEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOH_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOHEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOHEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DMA1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DMA2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_GPIOA_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOAEN)) +#define __HAL_RCC_GPIOB_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOBEN)) +#define __HAL_RCC_GPIOC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOCEN)) +#define __HAL_RCC_GPIOH_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOHEN)) +#define __HAL_RCC_DMA1_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA1EN)) +#define __HAL_RCC_DMA2_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA2EN)) +/** + * @} + */ + +/** @defgroup RCC_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOA_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOAEN)) != RESET) +#define __HAL_RCC_GPIOB_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOBEN)) != RESET) +#define __HAL_RCC_GPIOC_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOCEN)) != RESET) +#define __HAL_RCC_GPIOH_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOHEN)) != RESET) +#define __HAL_RCC_DMA1_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA1EN)) != RESET) +#define __HAL_RCC_DMA2_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA2EN)) != RESET) + +#define __HAL_RCC_GPIOA_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOAEN)) == RESET) +#define __HAL_RCC_GPIOB_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOBEN)) == RESET) +#define __HAL_RCC_GPIOC_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOCEN)) == RESET) +#define __HAL_RCC_GPIOH_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOHEN)) == RESET) +#define __HAL_RCC_DMA1_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA1EN)) == RESET) +#define __HAL_RCC_DMA2_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA2EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCC_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_WWDG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_PWR_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_TIM5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM5EN)) +#define __HAL_RCC_WWDG_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_WWDGEN)) +#define __HAL_RCC_SPI2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI2EN)) +#define __HAL_RCC_USART2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART2EN)) +#define __HAL_RCC_I2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C1EN)) +#define __HAL_RCC_I2C2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C2EN)) +#define __HAL_RCC_PWR_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_PWREN)) +/** + * @} + */ + +/** @defgroup RCC_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) != RESET) +#define __HAL_RCC_WWDG_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_WWDGEN)) != RESET) +#define __HAL_RCC_SPI2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) != RESET) +#define __HAL_RCC_USART2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART2EN)) != RESET) +#define __HAL_RCC_I2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C1EN)) != RESET) +#define __HAL_RCC_I2C2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) != RESET) +#define __HAL_RCC_PWR_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_PWREN)) != RESET) + +#define __HAL_RCC_TIM5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) == RESET) +#define __HAL_RCC_WWDG_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_WWDGEN)) == RESET) +#define __HAL_RCC_SPI2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) == RESET) +#define __HAL_RCC_USART2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART2EN)) == RESET) +#define __HAL_RCC_I2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C1EN)) == RESET) +#define __HAL_RCC_I2C2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) == RESET) +#define __HAL_RCC_PWR_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_PWREN)) == RESET) +/** + * @} + */ + +/** @defgroup RCC_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SYSCFG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM9_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM9EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM9EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM11_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM11EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM11EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_TIM1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM1EN)) +#define __HAL_RCC_USART1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_USART1EN)) +#define __HAL_RCC_USART6_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_USART6EN)) +#define __HAL_RCC_ADC1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC1EN)) +#define __HAL_RCC_SPI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI1EN)) +#define __HAL_RCC_SYSCFG_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SYSCFGEN)) +#define __HAL_RCC_TIM9_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM9EN)) +#define __HAL_RCC_TIM11_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM11EN)) +/** + * @} + */ + +/** @defgroup RCC_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM1EN)) != RESET) +#define __HAL_RCC_USART1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART1EN)) != RESET) +#define __HAL_RCC_USART6_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART6EN)) != RESET) +#define __HAL_RCC_ADC1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC1EN)) != RESET) +#define __HAL_RCC_SPI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) != RESET) +#define __HAL_RCC_SYSCFG_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SYSCFGEN)) != RESET) +#define __HAL_RCC_TIM9_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM9EN)) != RESET) +#define __HAL_RCC_TIM11_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM11EN)) != RESET) + +#define __HAL_RCC_TIM1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM1EN)) == RESET) +#define __HAL_RCC_USART1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART1EN)) == RESET) +#define __HAL_RCC_USART6_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART6EN)) == RESET) +#define __HAL_RCC_ADC1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC1EN)) == RESET) +#define __HAL_RCC_SPI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) == RESET) +#define __HAL_RCC_SYSCFG_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SYSCFGEN)) == RESET) +#define __HAL_RCC_TIM9_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM9EN)) == RESET) +#define __HAL_RCC_TIM11_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM11EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCC_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_GPIOA_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOARST)) +#define __HAL_RCC_GPIOB_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOBRST)) +#define __HAL_RCC_GPIOC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOCRST)) +#define __HAL_RCC_GPIOH_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOHRST)) +#define __HAL_RCC_DMA1_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA1RST)) +#define __HAL_RCC_DMA2_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA2RST)) + +#define __HAL_RCC_AHB1_RELEASE_RESET() (RCC->AHB1RSTR = 0x00U) +#define __HAL_RCC_GPIOA_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOARST)) +#define __HAL_RCC_GPIOB_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOBRST)) +#define __HAL_RCC_GPIOC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOCRST)) +#define __HAL_RCC_GPIOH_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOHRST)) +#define __HAL_RCC_DMA1_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA1RST)) +#define __HAL_RCC_DMA2_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA2RST)) +/** + * @} + */ + +/** @defgroup RCC_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM5RST)) +#define __HAL_RCC_WWDG_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_WWDGRST)) +#define __HAL_RCC_SPI2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI2RST)) +#define __HAL_RCC_USART2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART2RST)) +#define __HAL_RCC_I2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C1RST)) +#define __HAL_RCC_I2C2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C2RST)) +#define __HAL_RCC_PWR_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_PWRRST)) + +#define __HAL_RCC_APB1_RELEASE_RESET() (RCC->APB1RSTR = 0x00U) +#define __HAL_RCC_TIM5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM5RST)) +#define __HAL_RCC_WWDG_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_WWDGRST)) +#define __HAL_RCC_SPI2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI2RST)) +#define __HAL_RCC_USART2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART2RST)) +#define __HAL_RCC_I2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C1RST)) +#define __HAL_RCC_I2C2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C2RST)) +#define __HAL_RCC_PWR_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_PWRRST)) +/** + * @} + */ + +/** @defgroup RCC_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM1RST)) +#define __HAL_RCC_USART1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_USART1RST)) +#define __HAL_RCC_USART6_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_USART6RST)) +#define __HAL_RCC_ADC_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_ADCRST)) +#define __HAL_RCC_SPI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI1RST)) +#define __HAL_RCC_SYSCFG_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SYSCFGRST)) +#define __HAL_RCC_TIM9_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM9RST)) +#define __HAL_RCC_TIM11_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM11RST)) + +#define __HAL_RCC_APB2_RELEASE_RESET() (RCC->APB2RSTR = 0x00U) +#define __HAL_RCC_TIM1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM1RST)) +#define __HAL_RCC_USART1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_USART1RST)) +#define __HAL_RCC_USART6_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_USART6RST)) +#define __HAL_RCC_ADC_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_ADCRST)) +#define __HAL_RCC_SPI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI1RST)) +#define __HAL_RCC_SYSCFG_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SYSCFGRST)) +#define __HAL_RCC_TIM9_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM9RST)) +#define __HAL_RCC_TIM11_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM11RST)) +/** + * @} + */ + +/** @defgroup RCC_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_GPIOA_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOALPEN)) +#define __HAL_RCC_GPIOB_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOBLPEN)) +#define __HAL_RCC_GPIOC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOCLPEN)) +#define __HAL_RCC_GPIOH_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOHLPEN)) +#define __HAL_RCC_DMA1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA1LPEN)) +#define __HAL_RCC_DMA2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA2LPEN)) + +#define __HAL_RCC_GPIOA_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOALPEN)) +#define __HAL_RCC_GPIOB_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOBLPEN)) +#define __HAL_RCC_GPIOC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOCLPEN)) +#define __HAL_RCC_GPIOH_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOHLPEN)) +#define __HAL_RCC_DMA1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA1LPEN)) +#define __HAL_RCC_DMA2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA2LPEN)) +/** + * @} + */ + +/** @defgroup RCC_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM5LPEN)) +#define __HAL_RCC_WWDG_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_WWDGLPEN)) +#define __HAL_RCC_SPI2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI2LPEN)) +#define __HAL_RCC_USART2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART2LPEN)) +#define __HAL_RCC_I2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C1LPEN)) +#define __HAL_RCC_I2C2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C2LPEN)) +#define __HAL_RCC_PWR_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_PWRLPEN)) + +#define __HAL_RCC_TIM5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM5LPEN)) +#define __HAL_RCC_WWDG_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_WWDGLPEN)) +#define __HAL_RCC_SPI2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI2LPEN)) +#define __HAL_RCC_USART2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART2LPEN)) +#define __HAL_RCC_I2C1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C1LPEN)) +#define __HAL_RCC_I2C2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C2LPEN)) +#define __HAL_RCC_PWR_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_PWRLPEN)) +/** + * @} + */ + +/** @defgroup RCC_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM1LPEN)) +#define __HAL_RCC_USART1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_USART1LPEN)) +#define __HAL_RCC_USART6_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_USART6LPEN)) +#define __HAL_RCC_ADC1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC1LPEN)) +#define __HAL_RCC_SPI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI1LPEN)) +#define __HAL_RCC_SYSCFG_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SYSCFGLPEN)) +#define __HAL_RCC_TIM9_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM9LPEN)) +#define __HAL_RCC_TIM11_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM11LPEN)) + +#define __HAL_RCC_TIM1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM1LPEN)) +#define __HAL_RCC_USART1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_USART1LPEN)) +#define __HAL_RCC_USART6_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_USART6LPEN)) +#define __HAL_RCC_ADC1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC1LPEN)) +#define __HAL_RCC_SPI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI1LPEN)) +#define __HAL_RCC_SYSCFG_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SYSCFGLPEN)) +#define __HAL_RCC_TIM9_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM9LPEN)) +#define __HAL_RCC_TIM11_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM11LPEN)) +/** + * @} + */ + +/** @defgroup RCC_HSI_Configuration HSI Configuration + * @{ + */ + +/** @brief Macros to enable or disable the Internal High Speed oscillator (HSI). + * @note The HSI is stopped by hardware when entering STOP and STANDBY modes. + * It is used (enabled by hardware) as system clock source after startup + * from Reset, wake-up from STOP and STANDBY mode, or in case of failure + * of the HSE used directly or indirectly as system clock (if the Clock + * Security System CSS is enabled). + * @note HSI can not be stopped if it is used as system clock source. In this case, + * you have to select another source of the system clock then stop the HSI. + * @note After enabling the HSI, the application software should wait on HSIRDY + * flag to be set indicating that HSI clock is stable and can be used as + * system clock source. + * This parameter can be: ENABLE or DISABLE. + * @note When the HSI is stopped, HSIRDY flag goes low after 6 HSI oscillator + * clock cycles. + */ +#define __HAL_RCC_HSI_ENABLE() (*(__IO uint32_t *) RCC_CR_HSION_BB = ENABLE) +#define __HAL_RCC_HSI_DISABLE() (*(__IO uint32_t *) RCC_CR_HSION_BB = DISABLE) + +/** @brief Macro to adjust the Internal High Speed oscillator (HSI) calibration value. + * @note The calibration is used to compensate for the variations in voltage + * and temperature that influence the frequency of the internal HSI RC. + * @param __HSICalibrationValue__ specifies the calibration trimming value. + * (default is RCC_HSICALIBRATION_DEFAULT). + * This parameter must be a number between 0 and 0x1F. + */ +#define __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(__HSICalibrationValue__) (MODIFY_REG(RCC->CR,\ + RCC_CR_HSITRIM, (uint32_t)(__HSICalibrationValue__) << RCC_CR_HSITRIM_Pos)) +/** + * @} + */ + +/** @defgroup RCC_LSI_Configuration LSI Configuration + * @{ + */ + +/** @brief Macros to enable or disable the Internal Low Speed oscillator (LSI). + * @note After enabling the LSI, the application software should wait on + * LSIRDY flag to be set indicating that LSI clock is stable and can + * be used to clock the IWDG and/or the RTC. + * @note LSI can not be disabled if the IWDG is running. + * @note When the LSI is stopped, LSIRDY flag goes low after 6 LSI oscillator + * clock cycles. + */ +#define __HAL_RCC_LSI_ENABLE() (*(__IO uint32_t *) RCC_CSR_LSION_BB = ENABLE) +#define __HAL_RCC_LSI_DISABLE() (*(__IO uint32_t *) RCC_CSR_LSION_BB = DISABLE) +/** + * @} + */ + +/** @defgroup RCC_HSE_Configuration HSE Configuration + * @{ + */ + +/** + * @brief Macro to configure the External High Speed oscillator (HSE). + * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not supported by this macro. + * User should request a transition to HSE Off first and then HSE On or HSE Bypass. + * @note After enabling the HSE (RCC_HSE_ON or RCC_HSE_Bypass), the application + * software should wait on HSERDY flag to be set indicating that HSE clock + * is stable and can be used to clock the PLL and/or system clock. + * @note HSE state can not be changed if it is used directly or through the + * PLL as system clock. In this case, you have to select another source + * of the system clock then change the HSE state (ex. disable it). + * @note The HSE is stopped by hardware when entering STOP and STANDBY modes. + * @note This function reset the CSSON bit, so if the clock security system(CSS) + * was previously enabled you have to enable it again after calling this + * function. + * @param __STATE__ specifies the new state of the HSE. + * This parameter can be one of the following values: + * @arg RCC_HSE_OFF: turn OFF the HSE oscillator, HSERDY flag goes low after + * 6 HSE oscillator clock cycles. + * @arg RCC_HSE_ON: turn ON the HSE oscillator. + * @arg RCC_HSE_BYPASS: HSE oscillator bypassed with external clock. + */ +#define __HAL_RCC_HSE_CONFIG(__STATE__) \ + do { \ + if ((__STATE__) == RCC_HSE_ON) \ + { \ + SET_BIT(RCC->CR, RCC_CR_HSEON); \ + } \ + else if ((__STATE__) == RCC_HSE_BYPASS) \ + { \ + SET_BIT(RCC->CR, RCC_CR_HSEBYP); \ + SET_BIT(RCC->CR, RCC_CR_HSEON); \ + } \ + else \ + { \ + CLEAR_BIT(RCC->CR, RCC_CR_HSEON); \ + CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); \ + } \ + } while(0U) +/** + * @} + */ + +/** @defgroup RCC_LSE_Configuration LSE Configuration + * @{ + */ + +/** + * @brief Macro to configure the External Low Speed oscillator (LSE). + * @note Transition LSE Bypass to LSE On and LSE On to LSE Bypass are not supported by this macro. + * User should request a transition to LSE Off first and then LSE On or LSE Bypass. + * @note As the LSE is in the Backup domain and write access is denied to + * this domain after reset, you have to enable write access using + * HAL_PWR_EnableBkUpAccess() function before to configure the LSE + * (to be done once after reset). + * @note After enabling the LSE (RCC_LSE_ON or RCC_LSE_BYPASS), the application + * software should wait on LSERDY flag to be set indicating that LSE clock + * is stable and can be used to clock the RTC. + * @param __STATE__ specifies the new state of the LSE. + * This parameter can be one of the following values: + * @arg RCC_LSE_OFF: turn OFF the LSE oscillator, LSERDY flag goes low after + * 6 LSE oscillator clock cycles. + * @arg RCC_LSE_ON: turn ON the LSE oscillator. + * @arg RCC_LSE_BYPASS: LSE oscillator bypassed with external clock. + */ +#define __HAL_RCC_LSE_CONFIG(__STATE__) \ + do { \ + if((__STATE__) == RCC_LSE_ON) \ + { \ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ + } \ + else if((__STATE__) == RCC_LSE_BYPASS) \ + { \ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); \ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ + } \ + else \ + { \ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); \ + } \ + } while(0U) +/** + * @} + */ + +/** @defgroup RCC_Internal_RTC_Clock_Configuration RTC Clock Configuration + * @{ + */ + +/** @brief Macros to enable or disable the RTC clock. + * @note These macros must be used only after the RTC clock source was selected. + */ +#define __HAL_RCC_RTC_ENABLE() (*(__IO uint32_t *) RCC_BDCR_RTCEN_BB = ENABLE) +#define __HAL_RCC_RTC_DISABLE() (*(__IO uint32_t *) RCC_BDCR_RTCEN_BB = DISABLE) + +/** @brief Macros to configure the RTC clock (RTCCLK). + * @note As the RTC clock configuration bits are in the Backup domain and write + * access is denied to this domain after reset, you have to enable write + * access using the Power Backup Access macro before to configure + * the RTC clock source (to be done once after reset). + * @note Once the RTC clock is configured it can't be changed unless the + * Backup domain is reset using __HAL_RCC_BackupReset_RELEASE() macro, or by + * a Power On Reset (POR). + * @param __RTCCLKSource__ specifies the RTC clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_RTCCLKSOURCE_NO_CLK : No clock selected as RTC clock. + * @arg @ref RCC_RTCCLKSOURCE_LSE : LSE selected as RTC clock. + * @arg @ref RCC_RTCCLKSOURCE_LSI : LSI selected as RTC clock. + * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX HSE divided by X selected as RTC clock (X can be retrieved thanks to @ref __HAL_RCC_GET_RTC_HSE_PRESCALER() + * @note If the LSE or LSI is used as RTC clock source, the RTC continues to + * work in STOP and STANDBY modes, and can be used as wake-up source. + * However, when the HSE clock is used as RTC clock source, the RTC + * cannot be used in STOP and STANDBY modes. + * @note The maximum input clock frequency for RTC is 1MHz (when using HSE as + * RTC clock source). + */ +#define __HAL_RCC_RTC_CLKPRESCALER(__RTCCLKSource__) (((__RTCCLKSource__) & RCC_BDCR_RTCSEL) == RCC_BDCR_RTCSEL) ? \ + MODIFY_REG(RCC->CFGR, RCC_CFGR_RTCPRE, ((__RTCCLKSource__) & 0xFFFFCFFU)) : CLEAR_BIT(RCC->CFGR, RCC_CFGR_RTCPRE) + +#define __HAL_RCC_RTC_CONFIG(__RTCCLKSource__) do { __HAL_RCC_RTC_CLKPRESCALER(__RTCCLKSource__); \ + RCC->BDCR |= ((__RTCCLKSource__) & 0x00000FFFU); \ + } while(0U) + +/** @brief Macro to get the RTC clock source. + * @retval The clock source can be one of the following values: + * @arg @ref RCC_RTCCLKSOURCE_NO_CLK No clock selected as RTC clock + * @arg @ref RCC_RTCCLKSOURCE_LSE LSE selected as RTC clock + * @arg @ref RCC_RTCCLKSOURCE_LSI LSI selected as RTC clock + * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX HSE divided by X selected as RTC clock (X can be retrieved thanks to @ref __HAL_RCC_GET_RTC_HSE_PRESCALER() + */ +#define __HAL_RCC_GET_RTC_SOURCE() (READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL)) + +/** + * @brief Get the RTC and HSE clock divider (RTCPRE). + * @retval Returned value can be one of the following values: + * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX HSE divided by X selected as RTC clock (X can be retrieved thanks to @ref __HAL_RCC_GET_RTC_HSE_PRESCALER() + */ +#define __HAL_RCC_GET_RTC_HSE_PRESCALER() (READ_BIT(RCC->CFGR, RCC_CFGR_RTCPRE) | RCC_BDCR_RTCSEL) + +/** @brief Macros to force or release the Backup domain reset. + * @note This function resets the RTC peripheral (including the backup registers) + * and the RTC clock source selection in RCC_CSR register. + * @note The BKPSRAM is not affected by this reset. + */ +#define __HAL_RCC_BACKUPRESET_FORCE() (*(__IO uint32_t *) RCC_BDCR_BDRST_BB = ENABLE) +#define __HAL_RCC_BACKUPRESET_RELEASE() (*(__IO uint32_t *) RCC_BDCR_BDRST_BB = DISABLE) +/** + * @} + */ + +/** @defgroup RCC_PLL_Configuration PLL Configuration + * @{ + */ + +/** @brief Macros to enable or disable the main PLL. + * @note After enabling the main PLL, the application software should wait on + * PLLRDY flag to be set indicating that PLL clock is stable and can + * be used as system clock source. + * @note The main PLL can not be disabled if it is used as system clock source + * @note The main PLL is disabled by hardware when entering STOP and STANDBY modes. + */ +#define __HAL_RCC_PLL_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLON_BB = ENABLE) +#define __HAL_RCC_PLL_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLON_BB = DISABLE) + +/** @brief Macro to configure the PLL clock source. + * @note This function must be used only when the main PLL is disabled. + * @param __PLLSOURCE__ specifies the PLL entry clock source. + * This parameter can be one of the following values: + * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry + * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry + * + */ +#define __HAL_RCC_PLL_PLLSOURCE_CONFIG(__PLLSOURCE__) MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, (__PLLSOURCE__)) + +/** @brief Macro to configure the PLL multiplication factor. + * @note This function must be used only when the main PLL is disabled. + * @param __PLLM__ specifies the division factor for PLL VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 2 MHz to limit PLL jitter. + * + */ +#define __HAL_RCC_PLL_PLLM_CONFIG(__PLLM__) MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, (__PLLM__)) +/** + * @} + */ + +/** @defgroup RCC_Get_Clock_source Get Clock source + * @{ + */ +/** + * @brief Macro to configure the system clock source. + * @param __RCC_SYSCLKSOURCE__ specifies the system clock source. + * This parameter can be one of the following values: + * - RCC_SYSCLKSOURCE_HSI: HSI oscillator is used as system clock source. + * - RCC_SYSCLKSOURCE_HSE: HSE oscillator is used as system clock source. + * - RCC_SYSCLKSOURCE_PLLCLK: PLL output is used as system clock source. + * - RCC_SYSCLKSOURCE_PLLRCLK: PLLR output is used as system clock source. This + * parameter is available only for STM32F446xx devices. + */ +#define __HAL_RCC_SYSCLK_CONFIG(__RCC_SYSCLKSOURCE__) MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, (__RCC_SYSCLKSOURCE__)) + +/** @brief Macro to get the clock source used as system clock. + * @retval The clock source used as system clock. The returned value can be one + * of the following: + * - RCC_SYSCLKSOURCE_STATUS_HSI: HSI used as system clock. + * - RCC_SYSCLKSOURCE_STATUS_HSE: HSE used as system clock. + * - RCC_SYSCLKSOURCE_STATUS_PLLCLK: PLL used as system clock. + * - RCC_SYSCLKSOURCE_STATUS_PLLRCLK: PLLR used as system clock. This parameter + * is available only for STM32F446xx devices. + */ +#define __HAL_RCC_GET_SYSCLK_SOURCE() (RCC->CFGR & RCC_CFGR_SWS) + +/** @brief Macro to get the oscillator used as PLL clock source. + * @retval The oscillator used as PLL clock source. The returned value can be one + * of the following: + * - RCC_PLLSOURCE_HSI: HSI oscillator is used as PLL clock source. + * - RCC_PLLSOURCE_HSE: HSE oscillator is used as PLL clock source. + */ +#define __HAL_RCC_GET_PLL_OSCSOURCE() ((uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC)) +/** + * @} + */ + +/** @defgroup RCCEx_MCOx_Clock_Config RCC Extended MCOx Clock Config + * @{ + */ + +/** @brief Macro to configure the MCO1 clock. + * @param __MCOCLKSOURCE__ specifies the MCO clock source. + * This parameter can be one of the following values: + * @arg RCC_MCO1SOURCE_HSI: HSI clock selected as MCO1 source + * @arg RCC_MCO1SOURCE_LSE: LSE clock selected as MCO1 source + * @arg RCC_MCO1SOURCE_HSE: HSE clock selected as MCO1 source + * @arg RCC_MCO1SOURCE_PLLCLK: main PLL clock selected as MCO1 source + * @param __MCODIV__ specifies the MCO clock prescaler. + * This parameter can be one of the following values: + * @arg RCC_MCODIV_1: no division applied to MCOx clock + * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock + * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock + * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock + * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock + */ +#define __HAL_RCC_MCO1_CONFIG(__MCOCLKSOURCE__, __MCODIV__) \ + MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO1 | RCC_CFGR_MCO1PRE), ((__MCOCLKSOURCE__) | (__MCODIV__))) + +/** @brief Macro to configure the MCO2 clock. + * @param __MCOCLKSOURCE__ specifies the MCO clock source. + * This parameter can be one of the following values: + * @arg RCC_MCO2SOURCE_SYSCLK: System clock (SYSCLK) selected as MCO2 source + * @arg RCC_MCO2SOURCE_PLLI2SCLK: PLLI2S clock selected as MCO2 source, available for all STM32F4 devices except STM32F410xx + * @arg RCC_MCO2SOURCE_I2SCLK: I2SCLK clock selected as MCO2 source, available only for STM32F410Rx devices + * @arg RCC_MCO2SOURCE_HSE: HSE clock selected as MCO2 source + * @arg RCC_MCO2SOURCE_PLLCLK: main PLL clock selected as MCO2 source + * @param __MCODIV__ specifies the MCO clock prescaler. + * This parameter can be one of the following values: + * @arg RCC_MCODIV_1: no division applied to MCOx clock + * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock + * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock + * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock + * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock + * @note For STM32F410Rx devices, to output I2SCLK clock on MCO2, you should have + * at least one of the SPI clocks enabled (SPI1, SPI2 or SPI5). + */ +#define __HAL_RCC_MCO2_CONFIG(__MCOCLKSOURCE__, __MCODIV__) \ + MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO2 | RCC_CFGR_MCO2PRE), ((__MCOCLKSOURCE__) | ((__MCODIV__) << 3U))); +/** + * @} + */ + +/** @defgroup RCC_Flags_Interrupts_Management Flags Interrupts Management + * @brief macros to manage the specified RCC Flags and interrupts. + * @{ + */ + +/** @brief Enable RCC interrupt (Perform Byte access to RCC_CIR[14:8] bits to enable + * the selected interrupts). + * @param __INTERRUPT__ specifies the RCC interrupt sources to be enabled. + * This parameter can be any combination of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt. + * @arg RCC_IT_LSERDY: LSE ready interrupt. + * @arg RCC_IT_HSIRDY: HSI ready interrupt. + * @arg RCC_IT_HSERDY: HSE ready interrupt. + * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. + * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. + */ +#define __HAL_RCC_ENABLE_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE1_ADDRESS |= (__INTERRUPT__)) + +/** @brief Disable RCC interrupt (Perform Byte access to RCC_CIR[14:8] bits to disable + * the selected interrupts). + * @param __INTERRUPT__ specifies the RCC interrupt sources to be disabled. + * This parameter can be any combination of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt. + * @arg RCC_IT_LSERDY: LSE ready interrupt. + * @arg RCC_IT_HSIRDY: HSI ready interrupt. + * @arg RCC_IT_HSERDY: HSE ready interrupt. + * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. + * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. + */ +#define __HAL_RCC_DISABLE_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE1_ADDRESS &= (uint8_t)(~(__INTERRUPT__))) + +/** @brief Clear the RCC's interrupt pending bits (Perform Byte access to RCC_CIR[23:16] + * bits to clear the selected interrupt pending bits. + * @param __INTERRUPT__ specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt. + * @arg RCC_IT_LSERDY: LSE ready interrupt. + * @arg RCC_IT_HSIRDY: HSI ready interrupt. + * @arg RCC_IT_HSERDY: HSE ready interrupt. + * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. + * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. + * @arg RCC_IT_CSS: Clock Security System interrupt + */ +#define __HAL_RCC_CLEAR_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE2_ADDRESS = (__INTERRUPT__)) + +/** @brief Check the RCC's interrupt has occurred or not. + * @param __INTERRUPT__ specifies the RCC interrupt source to check. + * This parameter can be one of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt. + * @arg RCC_IT_LSERDY: LSE ready interrupt. + * @arg RCC_IT_HSIRDY: HSI ready interrupt. + * @arg RCC_IT_HSERDY: HSE ready interrupt. + * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. + * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. + * @arg RCC_IT_CSS: Clock Security System interrupt + * @retval The new state of __INTERRUPT__ (TRUE or FALSE). + */ +#define __HAL_RCC_GET_IT(__INTERRUPT__) ((RCC->CIR & (__INTERRUPT__)) == (__INTERRUPT__)) + +/** @brief Set RMVF bit to clear the reset flags: RCC_FLAG_PINRST, RCC_FLAG_PORRST, + * RCC_FLAG_SFTRST, RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST and RCC_FLAG_LPWRRST. + */ +#define __HAL_RCC_CLEAR_RESET_FLAGS() (RCC->CSR |= RCC_CSR_RMVF) + +/** @brief Check RCC flag is set or not. + * @param __FLAG__ specifies the flag to check. + * This parameter can be one of the following values: + * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready. + * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready. + * @arg RCC_FLAG_PLLRDY: Main PLL clock ready. + * @arg RCC_FLAG_PLLI2SRDY: PLLI2S clock ready. + * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready. + * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready. + * @arg RCC_FLAG_BORRST: POR/PDR or BOR reset. + * @arg RCC_FLAG_PINRST: Pin reset. + * @arg RCC_FLAG_PORRST: POR/PDR reset. + * @arg RCC_FLAG_SFTRST: Software reset. + * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset. + * @arg RCC_FLAG_WWDGRST: Window Watchdog reset. + * @arg RCC_FLAG_LPWRRST: Low Power reset. + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define RCC_FLAG_MASK ((uint8_t)0x1FU) +#define __HAL_RCC_GET_FLAG(__FLAG__) (((((((__FLAG__) >> 5U)\ + == 1U)? RCC->CR :((((__FLAG__) >> 5U) == 2U) ? RCC->BDCR :((((__FLAG__) >> 5U) == 3U)? RCC->CSR :RCC->CIR))) &\ + (1U << ((__FLAG__) & RCC_FLAG_MASK)))!= 0U)? 1U : 0U) + +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup RCC_Exported_Functions + * @{ + */ + +/** @addtogroup RCC_Exported_Functions_Group1 + * @{ + */ +/* Initialization and de-initialization functions ******************************/ +HAL_StatusTypeDef HAL_RCC_DeInit(void); +HAL_StatusTypeDef HAL_RCC_OscConfig(const RCC_OscInitTypeDef *RCC_OscInitStruct); +HAL_StatusTypeDef HAL_RCC_ClockConfig(const RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency); +/** + * @} + */ + +/** @addtogroup RCC_Exported_Functions_Group2 + * @{ + */ +/* Peripheral Control functions ************************************************/ +void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv); +void HAL_RCC_EnableCSS(void); +void HAL_RCC_DisableCSS(void); +uint32_t HAL_RCC_GetSysClockFreq(void); +uint32_t HAL_RCC_GetHCLKFreq(void); +uint32_t HAL_RCC_GetPCLK1Freq(void); +uint32_t HAL_RCC_GetPCLK2Freq(void); +void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct); +void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency); + +/* CSS NMI IRQ handler */ +void HAL_RCC_NMI_IRQHandler(void); + +/* User Callbacks in non blocking mode (IT mode) */ +void HAL_RCC_CSSCallback(void); + +/** + * @} + */ + +/** + * @} + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup RCC_Private_Constants RCC Private Constants + * @{ + */ + +/** @defgroup RCC_BitAddress_AliasRegion RCC BitAddress AliasRegion + * @brief RCC registers bit address in the alias region + * @{ + */ +#define RCC_OFFSET (RCC_BASE - PERIPH_BASE) +/* --- CR Register --- */ +/* Alias word address of HSION bit */ +#define RCC_CR_OFFSET (RCC_OFFSET + 0x00U) +#define RCC_HSION_BIT_NUMBER 0x00U +#define RCC_CR_HSION_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_HSION_BIT_NUMBER * 4U)) +/* Alias word address of CSSON bit */ +#define RCC_CSSON_BIT_NUMBER 0x13U +#define RCC_CR_CSSON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_CSSON_BIT_NUMBER * 4U)) +/* Alias word address of PLLON bit */ +#define RCC_PLLON_BIT_NUMBER 0x18U +#define RCC_CR_PLLON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLON_BIT_NUMBER * 4U)) + +/* --- BDCR Register --- */ +/* Alias word address of RTCEN bit */ +#define RCC_BDCR_OFFSET (RCC_OFFSET + 0x70U) +#define RCC_RTCEN_BIT_NUMBER 0x0FU +#define RCC_BDCR_RTCEN_BB (PERIPH_BB_BASE + (RCC_BDCR_OFFSET * 32U) + (RCC_RTCEN_BIT_NUMBER * 4U)) +/* Alias word address of BDRST bit */ +#define RCC_BDRST_BIT_NUMBER 0x10U +#define RCC_BDCR_BDRST_BB (PERIPH_BB_BASE + (RCC_BDCR_OFFSET * 32U) + (RCC_BDRST_BIT_NUMBER * 4U)) + +/* --- CSR Register --- */ +/* Alias word address of LSION bit */ +#define RCC_CSR_OFFSET (RCC_OFFSET + 0x74U) +#define RCC_LSION_BIT_NUMBER 0x00U +#define RCC_CSR_LSION_BB (PERIPH_BB_BASE + (RCC_CSR_OFFSET * 32U) + (RCC_LSION_BIT_NUMBER * 4U)) + +/* CR register byte 3 (Bits[23:16]) base address */ +#define RCC_CR_BYTE2_ADDRESS 0x40023802U + +/* CIR register byte 2 (Bits[15:8]) base address */ +#define RCC_CIR_BYTE1_ADDRESS ((uint32_t)(RCC_BASE + 0x0CU + 0x01U)) + +/* CIR register byte 3 (Bits[23:16]) base address */ +#define RCC_CIR_BYTE2_ADDRESS ((uint32_t)(RCC_BASE + 0x0CU + 0x02U)) + +/* BDCR register base address */ +#define RCC_BDCR_BYTE0_ADDRESS (PERIPH_BASE + RCC_BDCR_OFFSET) + +#define RCC_DBP_TIMEOUT_VALUE 2U +#define RCC_LSE_TIMEOUT_VALUE LSE_STARTUP_TIMEOUT + +#define HSE_TIMEOUT_VALUE HSE_STARTUP_TIMEOUT +#define HSI_TIMEOUT_VALUE 2U /* 2 ms */ +#define LSI_TIMEOUT_VALUE 2U /* 2 ms */ +#define CLOCKSWITCH_TIMEOUT_VALUE 5000U /* 5 s */ + +/** + * @} + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup RCC_Private_Macros RCC Private Macros + * @{ + */ + +/** @defgroup RCC_IS_RCC_Definitions RCC Private macros to check input parameters + * @{ + */ +#define IS_RCC_OSCILLATORTYPE(OSCILLATOR) ((OSCILLATOR) <= 15U) + +#define IS_RCC_HSE(HSE) (((HSE) == RCC_HSE_OFF) || ((HSE) == RCC_HSE_ON) || \ + ((HSE) == RCC_HSE_BYPASS)) + +#define IS_RCC_LSE(LSE) (((LSE) == RCC_LSE_OFF) || ((LSE) == RCC_LSE_ON) || \ + ((LSE) == RCC_LSE_BYPASS)) + +#define IS_RCC_HSI(HSI) (((HSI) == RCC_HSI_OFF) || ((HSI) == RCC_HSI_ON)) + +#define IS_RCC_LSI(LSI) (((LSI) == RCC_LSI_OFF) || ((LSI) == RCC_LSI_ON)) + +#define IS_RCC_PLL(PLL) (((PLL) == RCC_PLL_NONE) ||((PLL) == RCC_PLL_OFF) || ((PLL) == RCC_PLL_ON)) + +#define IS_RCC_PLLSOURCE(SOURCE) (((SOURCE) == RCC_PLLSOURCE_HSI) || \ + ((SOURCE) == RCC_PLLSOURCE_HSE)) + +#define IS_RCC_SYSCLKSOURCE(SOURCE) (((SOURCE) == RCC_SYSCLKSOURCE_HSI) || \ + ((SOURCE) == RCC_SYSCLKSOURCE_HSE) || \ + ((SOURCE) == RCC_SYSCLKSOURCE_PLLCLK) || \ + ((SOURCE) == RCC_SYSCLKSOURCE_PLLRCLK)) + +#define IS_RCC_RTCCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_RTCCLKSOURCE_LSE) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_LSI) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV2) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV3) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV4) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV5) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV6) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV7) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV8) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV9) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV10) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV11) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV12) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV13) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV14) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV15) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV16) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV17) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV18) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV19) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV20) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV21) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV22) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV23) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV24) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV25) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV26) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV27) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV28) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV29) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV30) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV31)) + +#define IS_RCC_PLLM_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 63U)) + +#define IS_RCC_PLLP_VALUE(VALUE) (((VALUE) == 2U) || ((VALUE) == 4U) || ((VALUE) == 6U) || ((VALUE) == 8U)) + +#define IS_RCC_PLLQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) + +#define IS_RCC_HCLK(HCLK) (((HCLK) == RCC_SYSCLK_DIV1) || ((HCLK) == RCC_SYSCLK_DIV2) || \ + ((HCLK) == RCC_SYSCLK_DIV4) || ((HCLK) == RCC_SYSCLK_DIV8) || \ + ((HCLK) == RCC_SYSCLK_DIV16) || ((HCLK) == RCC_SYSCLK_DIV64) || \ + ((HCLK) == RCC_SYSCLK_DIV128) || ((HCLK) == RCC_SYSCLK_DIV256) || \ + ((HCLK) == RCC_SYSCLK_DIV512)) + +#define IS_RCC_CLOCKTYPE(CLK) ((1U <= (CLK)) && ((CLK) <= 15U)) + +#define IS_RCC_PCLK(PCLK) (((PCLK) == RCC_HCLK_DIV1) || ((PCLK) == RCC_HCLK_DIV2) || \ + ((PCLK) == RCC_HCLK_DIV4) || ((PCLK) == RCC_HCLK_DIV8) || \ + ((PCLK) == RCC_HCLK_DIV16)) + +#define IS_RCC_MCO(MCOx) (((MCOx) == RCC_MCO1) || ((MCOx) == RCC_MCO2)) + +#define IS_RCC_MCO1SOURCE(SOURCE) (((SOURCE) == RCC_MCO1SOURCE_HSI) || ((SOURCE) == RCC_MCO1SOURCE_LSE) || \ + ((SOURCE) == RCC_MCO1SOURCE_HSE) || ((SOURCE) == RCC_MCO1SOURCE_PLLCLK)) + +#define IS_RCC_MCODIV(DIV) (((DIV) == RCC_MCODIV_1) || ((DIV) == RCC_MCODIV_2) || \ + ((DIV) == RCC_MCODIV_3) || ((DIV) == RCC_MCODIV_4) || \ + ((DIV) == RCC_MCODIV_5)) +#define IS_RCC_CALIBRATION_VALUE(VALUE) ((VALUE) <= 0x1FU) + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_RCC_H */ + diff --git a/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h new file mode 100644 index 0000000..3b62134 --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h @@ -0,0 +1,7190 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_rcc_ex.h + * @author MCD Application Team + * @brief Header file of RCC HAL Extension module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_RCC_EX_H +#define __STM32F4xx_HAL_RCC_EX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup RCCEx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup RCCEx_Exported_Types RCCEx Exported Types + * @{ + */ + +/** + * @brief RCC PLL configuration structure definition + */ +typedef struct +{ + uint32_t PLLState; /*!< The new state of the PLL. + This parameter can be a value of @ref RCC_PLL_Config */ + + uint32_t PLLSource; /*!< RCC_PLLSource: PLL entry clock source. + This parameter must be a value of @ref RCC_PLL_Clock_Source */ + + uint32_t PLLM; /*!< PLLM: Division factor for PLL VCO input clock. + This parameter must be a number between Min_Data = 0 and Max_Data = 63 */ + + uint32_t PLLN; /*!< PLLN: Multiplication factor for PLL VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432 + except for STM32F411xE devices where the Min_Data = 192 */ + + uint32_t PLLP; /*!< PLLP: Division factor for main system clock (SYSCLK). + This parameter must be a value of @ref RCC_PLLP_Clock_Divider */ + + uint32_t PLLQ; /*!< PLLQ: Division factor for OTG FS, SDIO and RNG clocks. + This parameter must be a number between Min_Data = 2 and Max_Data = 15 */ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) + uint32_t PLLR; /*!< PLLR: PLL division factor for I2S, SAI, SYSTEM, SPDIFRX clocks. + This parameter is only available in STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx + and STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/STM32F413xx/STM32F423xx devices. + This parameter must be a number between Min_Data = 2 and Max_Data = 7 */ +#endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ +} RCC_PLLInitTypeDef; + +#if defined(STM32F446xx) +/** + * @brief PLLI2S Clock structure definition + */ +typedef struct +{ + uint32_t PLLI2SM; /*!< Specifies division factor for PLL VCO input clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ + + uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ + + uint32_t PLLI2SP; /*!< Specifies division factor for SPDIFRX Clock. + This parameter must be a value of @ref RCCEx_PLLI2SP_Clock_Divider */ + + uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 15. + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ + + uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 7. + This parameter will be used only when PLLI2S is selected as Clock Source I2S */ +} RCC_PLLI2SInitTypeDef; + +/** + * @brief PLLSAI Clock structure definition + */ +typedef struct +{ + uint32_t PLLSAIM; /*!< Specifies division factor for PLL VCO input clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ + + uint32_t PLLSAIN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ + + uint32_t PLLSAIP; /*!< Specifies division factor for OTG FS, SDIO and RNG clocks. + This parameter must be a value of @ref RCCEx_PLLSAIP_Clock_Divider */ + + uint32_t PLLSAIQ; /*!< Specifies the division factor for SAI clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 15. + This parameter will be used only when PLLSAI is selected as Clock Source SAI */ +} RCC_PLLSAIInitTypeDef; + +/** + * @brief RCC extended clocks structure definition + */ +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + RCC_PLLSAIInitTypeDef PLLSAI; /*!< PLL SAI structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source SAI or LTDC */ + + uint32_t PLLI2SDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ + + uint32_t PLLSAIDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLLSAI is selected as Clock Source SAI */ + + uint32_t Sai1ClockSelection; /*!< Specifies SAI1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_SAI1_Clock_Source */ + + uint32_t Sai2ClockSelection; /*!< Specifies SAI2 Clock Source Selection. + This parameter can be a value of @ref RCCEx_SAI2_Clock_Source */ + + uint32_t I2sApb1ClockSelection; /*!< Specifies I2S APB1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_I2SAPB1_Clock_Source */ + + uint32_t I2sApb2ClockSelection; /*!< Specifies I2S APB2 Clock Source Selection. + This parameter can be a value of @ref RCCEx_I2SAPB2_Clock_Source */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. + This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ + + uint32_t CecClockSelection; /*!< Specifies CEC Clock Source Selection. + This parameter can be a value of @ref RCCEx_CEC_Clock_Source */ + + uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ + + uint32_t SpdifClockSelection; /*!< Specifies SPDIFRX Clock Source Selection. + This parameter can be a value of @ref RCCEx_SPDIFRX_Clock_Source */ + + uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. + This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ + + uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. + This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ +} RCC_PeriphCLKInitTypeDef; +#endif /* STM32F446xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** + * @brief RCC extended clocks structure definition + */ +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + uint32_t I2SClockSelection; /*!< Specifies RTC Clock Source Selection. + This parameter can be a value of @ref RCCEx_I2S_APB_Clock_Source */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t Lptim1ClockSelection; /*!< Specifies LPTIM1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_LPTIM1_Clock_Source */ + + uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ + + uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. + This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ +} RCC_PeriphCLKInitTypeDef; +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief PLLI2S Clock structure definition + */ +typedef struct +{ + uint32_t PLLI2SM; /*!< Specifies division factor for PLL VCO input clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ + + uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ + + uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 15. + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ + + uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 7. + This parameter will be used only when PLLI2S is selected as Clock Source I2S */ +} RCC_PLLI2SInitTypeDef; + +/** + * @brief RCC extended clocks structure definition + */ +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source I2S */ + +#if defined(STM32F413xx) || defined(STM32F423xx) + uint32_t PLLDivR; /*!< Specifies the PLL division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLL is selected as Clock Source SAI */ + + uint32_t PLLI2SDivR; /*!< Specifies the PLLI2S division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ +#endif /* STM32F413xx || STM32F423xx */ + + uint32_t I2sApb1ClockSelection; /*!< Specifies I2S APB1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_I2SAPB1_Clock_Source */ + + uint32_t I2sApb2ClockSelection; /*!< Specifies I2S APB2 Clock Source Selection. + This parameter can be a value of @ref RCCEx_I2SAPB2_Clock_Source */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. + This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ + + uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ + + uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. + This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ + + uint32_t Dfsdm1ClockSelection; /*!< Specifies DFSDM1 Clock Selection. + This parameter can be a value of @ref RCCEx_DFSDM1_Kernel_Clock_Source */ + + uint32_t Dfsdm1AudioClockSelection;/*!< Specifies DFSDM1 Audio Clock Selection. + This parameter can be a value of @ref RCCEx_DFSDM1_Audio_Clock_Source */ + +#if defined(STM32F413xx) || defined(STM32F423xx) + uint32_t Dfsdm2ClockSelection; /*!< Specifies DFSDM2 Clock Selection. + This parameter can be a value of @ref RCCEx_DFSDM2_Kernel_Clock_Source */ + + uint32_t Dfsdm2AudioClockSelection;/*!< Specifies DFSDM2 Audio Clock Selection. + This parameter can be a value of @ref RCCEx_DFSDM2_Audio_Clock_Source */ + + uint32_t Lptim1ClockSelection; /*!< Specifies LPTIM1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_LPTIM1_Clock_Source */ + + uint32_t SaiAClockSelection; /*!< Specifies SAI1_A Clock Prescalers Selection + This parameter can be a value of @ref RCCEx_SAI1_BlockA_Clock_Source */ + + uint32_t SaiBClockSelection; /*!< Specifies SAI1_B Clock Prescalers Selection + This parameter can be a value of @ref RCCEx_SAI1_BlockB_Clock_Source */ +#endif /* STM32F413xx || STM32F423xx */ + + uint32_t PLLI2SSelection; /*!< Specifies PLL I2S Clock Source Selection. + This parameter can be a value of @ref RCCEx_PLL_I2S_Clock_Source */ + + uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. + This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ +} RCC_PeriphCLKInitTypeDef; +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) + +/** + * @brief PLLI2S Clock structure definition + */ +typedef struct +{ + uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 7. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI1 clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 15. + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ +} RCC_PLLI2SInitTypeDef; + +/** + * @brief PLLSAI Clock structure definition + */ +typedef struct +{ + uint32_t PLLSAIN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432. + This parameter will be used only when PLLSAI is selected as Clock Source SAI or LTDC */ +#if defined(STM32F469xx) || defined(STM32F479xx) + uint32_t PLLSAIP; /*!< Specifies division factor for OTG FS and SDIO clocks. + This parameter is only available in STM32F469xx/STM32F479xx devices. + This parameter must be a value of @ref RCCEx_PLLSAIP_Clock_Divider */ +#endif /* STM32F469xx || STM32F479xx */ + + uint32_t PLLSAIQ; /*!< Specifies the division factor for SAI1 clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 15. + This parameter will be used only when PLLSAI is selected as Clock Source SAI or LTDC */ + + uint32_t PLLSAIR; /*!< specifies the division factor for LTDC clock + This parameter must be a number between Min_Data = 2 and Max_Data = 7. + This parameter will be used only when PLLSAI is selected as Clock Source LTDC */ + +} RCC_PLLSAIInitTypeDef; + +/** + * @brief RCC extended clocks structure definition + */ +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + RCC_PLLSAIInitTypeDef PLLSAI; /*!< PLL SAI structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source SAI or LTDC */ + + uint32_t PLLI2SDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ + + uint32_t PLLSAIDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLLSAI is selected as Clock Source SAI */ + + uint32_t PLLSAIDivR; /*!< Specifies the PLLSAI division factor for LTDC clock. + This parameter must be one value of @ref RCCEx_PLLSAI_DIVR */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection. + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint8_t TIMPresSelection; /*!< Specifies TIM Clock Prescalers Selection. + This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ +#if defined(STM32F469xx) || defined(STM32F479xx) + uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. + This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ + + uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. + This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ +#endif /* STM32F469xx || STM32F479xx */ +} RCC_PeriphCLKInitTypeDef; + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) +/** + * @brief PLLI2S Clock structure definition + */ +typedef struct +{ +#if defined(STM32F411xE) + uint32_t PLLI2SM; /*!< PLLM: Division factor for PLLI2S VCO input clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 62 */ +#endif /* STM32F411xE */ + + uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432 + Except for STM32F411xE devices where the Min_Data = 192. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 7. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + +} RCC_PLLI2SInitTypeDef; + +/** + * @brief RCC extended clocks structure definition + */ +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection. + This parameter can be a value of @ref RCC_RTC_Clock_Source */ +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) + uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. + This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ +#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ +} RCC_PeriphCLKInitTypeDef; +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup RCCEx_Exported_Constants RCCEx Exported Constants + * @{ + */ + +/** @defgroup RCCEx_Periph_Clock_Selection RCC Periph Clock Selection + * @{ + */ +/* Peripheral Clock source for STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx */ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) +#define RCC_PERIPHCLK_I2S_APB1 0x00000001U +#define RCC_PERIPHCLK_I2S_APB2 0x00000002U +#define RCC_PERIPHCLK_TIM 0x00000004U +#define RCC_PERIPHCLK_RTC 0x00000008U +#define RCC_PERIPHCLK_FMPI2C1 0x00000010U +#define RCC_PERIPHCLK_CLK48 0x00000020U +#define RCC_PERIPHCLK_SDIO 0x00000040U +#define RCC_PERIPHCLK_PLLI2S 0x00000080U +#define RCC_PERIPHCLK_DFSDM1 0x00000100U +#define RCC_PERIPHCLK_DFSDM1_AUDIO 0x00000200U +#endif /* STM32F412Zx || STM32F412Vx) || STM32F412Rx || STM32F412Cx */ +#if defined(STM32F413xx) || defined(STM32F423xx) +#define RCC_PERIPHCLK_DFSDM2 0x00000400U +#define RCC_PERIPHCLK_DFSDM2_AUDIO 0x00000800U +#define RCC_PERIPHCLK_LPTIM1 0x00001000U +#define RCC_PERIPHCLK_SAIA 0x00002000U +#define RCC_PERIPHCLK_SAIB 0x00004000U +#endif /* STM32F413xx || STM32F423xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------- Peripheral Clock source for STM32F410xx ----------------*/ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define RCC_PERIPHCLK_I2S 0x00000001U +#define RCC_PERIPHCLK_TIM 0x00000002U +#define RCC_PERIPHCLK_RTC 0x00000004U +#define RCC_PERIPHCLK_FMPI2C1 0x00000008U +#define RCC_PERIPHCLK_LPTIM1 0x00000010U +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ +/*----------------------------------------------------------------------------*/ + +/*------------------- Peripheral Clock source for STM32F446xx ----------------*/ +#if defined(STM32F446xx) +#define RCC_PERIPHCLK_I2S_APB1 0x00000001U +#define RCC_PERIPHCLK_I2S_APB2 0x00000002U +#define RCC_PERIPHCLK_SAI1 0x00000004U +#define RCC_PERIPHCLK_SAI2 0x00000008U +#define RCC_PERIPHCLK_TIM 0x00000010U +#define RCC_PERIPHCLK_RTC 0x00000020U +#define RCC_PERIPHCLK_CEC 0x00000040U +#define RCC_PERIPHCLK_FMPI2C1 0x00000080U +#define RCC_PERIPHCLK_CLK48 0x00000100U +#define RCC_PERIPHCLK_SDIO 0x00000200U +#define RCC_PERIPHCLK_SPDIFRX 0x00000400U +#define RCC_PERIPHCLK_PLLI2S 0x00000800U +#endif /* STM32F446xx */ +/*-----------------------------------------------------------------------------*/ + +/*----------- Peripheral Clock source for STM32F469xx/STM32F479xx -------------*/ +#if defined(STM32F469xx) || defined(STM32F479xx) +#define RCC_PERIPHCLK_I2S 0x00000001U +#define RCC_PERIPHCLK_SAI_PLLI2S 0x00000002U +#define RCC_PERIPHCLK_SAI_PLLSAI 0x00000004U +#define RCC_PERIPHCLK_LTDC 0x00000008U +#define RCC_PERIPHCLK_TIM 0x00000010U +#define RCC_PERIPHCLK_RTC 0x00000020U +#define RCC_PERIPHCLK_PLLI2S 0x00000040U +#define RCC_PERIPHCLK_CLK48 0x00000080U +#define RCC_PERIPHCLK_SDIO 0x00000100U +#endif /* STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ + +/*-------- Peripheral Clock source for STM32F42xxx/STM32F43xxx ---------------*/ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) +#define RCC_PERIPHCLK_I2S 0x00000001U +#define RCC_PERIPHCLK_SAI_PLLI2S 0x00000002U +#define RCC_PERIPHCLK_SAI_PLLSAI 0x00000004U +#define RCC_PERIPHCLK_LTDC 0x00000008U +#define RCC_PERIPHCLK_TIM 0x00000010U +#define RCC_PERIPHCLK_RTC 0x00000020U +#define RCC_PERIPHCLK_PLLI2S 0x00000040U +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +/*----------------------------------------------------------------------------*/ + +/*-------- Peripheral Clock source for STM32F40xxx/STM32F41xxx ---------------*/ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) +#define RCC_PERIPHCLK_I2S 0x00000001U +#define RCC_PERIPHCLK_RTC 0x00000002U +#define RCC_PERIPHCLK_PLLI2S 0x00000004U +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) +#define RCC_PERIPHCLK_TIM 0x00000008U +#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ +/*----------------------------------------------------------------------------*/ +/** + * @} + */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) || \ + defined(STM32F479xx) +/** @defgroup RCCEx_I2S_Clock_Source I2S Clock Source + * @{ + */ +#define RCC_I2SCLKSOURCE_PLLI2S 0x00000000U +#define RCC_I2SCLKSOURCE_EXT RCC_CFGR_I2SSRC +/** + * @} + */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F469xx || STM32F479xx */ + +/** @defgroup RCCEx_PLLSAI_DIVR RCC PLLSAI DIVR + * @{ + */ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +#define RCC_PLLSAIDIVR_2 0x00000000U +#define RCC_PLLSAIDIVR_4 0x00010000U +#define RCC_PLLSAIDIVR_8 0x00020000U +#define RCC_PLLSAIDIVR_16 0x00030000U +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_PLLI2SP_Clock_Divider RCC PLLI2SP Clock Divider + * @{ + */ +#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) +#define RCC_PLLI2SP_DIV2 0x00000002U +#define RCC_PLLI2SP_DIV4 0x00000004U +#define RCC_PLLI2SP_DIV6 0x00000006U +#define RCC_PLLI2SP_DIV8 0x00000008U +#endif /* STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ +/** + * @} + */ + +/** @defgroup RCCEx_PLLSAIP_Clock_Divider RCC PLLSAIP Clock Divider + * @{ + */ +#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define RCC_PLLSAIP_DIV2 0x00000002U +#define RCC_PLLSAIP_DIV4 0x00000004U +#define RCC_PLLSAIP_DIV6 0x00000006U +#define RCC_PLLSAIP_DIV8 0x00000008U +#endif /* STM32F446xx || STM32F469xx || STM32F479xx */ +/** + * @} + */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @defgroup RCCEx_SAI_BlockA_Clock_Source RCC SAI BlockA Clock Source + * @{ + */ +#define RCC_SAIACLKSOURCE_PLLSAI 0x00000000U +#define RCC_SAIACLKSOURCE_PLLI2S 0x00100000U +#define RCC_SAIACLKSOURCE_EXT 0x00200000U +/** + * @} + */ + +/** @defgroup RCCEx_SAI_BlockB_Clock_Source RCC SAI BlockB Clock Source + * @{ + */ +#define RCC_SAIBCLKSOURCE_PLLSAI 0x00000000U +#define RCC_SAIBCLKSOURCE_PLLI2S 0x00400000U +#define RCC_SAIBCLKSOURCE_EXT 0x00800000U +/** + * @} + */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source + * @{ + */ +#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U +#define RCC_CLK48CLKSOURCE_PLLSAIP ((uint32_t)RCC_DCKCFGR_CK48MSEL) +/** + * @} + */ + +/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source + * @{ + */ +#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U +#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_SDIOSEL) +/** + * @} + */ + +/** @defgroup RCCEx_DSI_Clock_Source RCC DSI Clock Source + * @{ + */ +#define RCC_DSICLKSOURCE_DSIPHY 0x00000000U +#define RCC_DSICLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_DSISEL) +/** + * @} + */ +#endif /* STM32F469xx || STM32F479xx */ + +#if defined(STM32F446xx) +/** @defgroup RCCEx_SAI1_Clock_Source RCC SAI1 Clock Source + * @{ + */ +#define RCC_SAI1CLKSOURCE_PLLSAI 0x00000000U +#define RCC_SAI1CLKSOURCE_PLLI2S ((uint32_t)RCC_DCKCFGR_SAI1SRC_0) +#define RCC_SAI1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1SRC_1) +#define RCC_SAI1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1SRC) +/** + * @} + */ + +/** @defgroup RCCEx_SAI2_Clock_Source RCC SAI2 Clock Source + * @{ + */ +#define RCC_SAI2CLKSOURCE_PLLSAI 0x00000000U +#define RCC_SAI2CLKSOURCE_PLLI2S ((uint32_t)RCC_DCKCFGR_SAI2SRC_0) +#define RCC_SAI2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI2SRC_1) +#define RCC_SAI2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI2SRC) +/** + * @} + */ + +/** @defgroup RCCEx_I2SAPB1_Clock_Source RCC I2S APB1 Clock Source + * @{ + */ +#define RCC_I2SAPB1CLKSOURCE_PLLI2S 0x00000000U +#define RCC_I2SAPB1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S1SRC_0) +#define RCC_I2SAPB1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S1SRC_1) +#define RCC_I2SAPB1CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S1SRC) +/** + * @} + */ + +/** @defgroup RCCEx_I2SAPB2_Clock_Source RCC I2S APB2 Clock Source + * @{ + */ +#define RCC_I2SAPB2CLKSOURCE_PLLI2S 0x00000000U +#define RCC_I2SAPB2CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S2SRC_0) +#define RCC_I2SAPB2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S2SRC_1) +#define RCC_I2SAPB2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S2SRC) +/** + * @} + */ + +/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source + * @{ + */ +#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U +#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) +#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) +/** + * @} + */ + +/** @defgroup RCCEx_CEC_Clock_Source RCC CEC Clock Source + * @{ + */ +#define RCC_CECCLKSOURCE_HSI 0x00000000U +#define RCC_CECCLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_CECSEL) +/** + * @} + */ + +/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source + * @{ + */ +#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U +#define RCC_CLK48CLKSOURCE_PLLSAIP ((uint32_t)RCC_DCKCFGR2_CK48MSEL) +/** + * @} + */ + +/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source + * @{ + */ +#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U +#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_SDIOSEL) +/** + * @} + */ + +/** @defgroup RCCEx_SPDIFRX_Clock_Source RCC SPDIFRX Clock Source + * @{ + */ +#define RCC_SPDIFRXCLKSOURCE_PLLR 0x00000000U +#define RCC_SPDIFRXCLKSOURCE_PLLI2SP ((uint32_t)RCC_DCKCFGR2_SPDIFRXSEL) +/** + * @} + */ + +#endif /* STM32F446xx */ + +#if defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup RCCEx_SAI1_BlockA_Clock_Source RCC SAI BlockA Clock Source + * @{ + */ +#define RCC_SAIACLKSOURCE_PLLI2SR 0x00000000U +#define RCC_SAIACLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1ASRC_0) +#define RCC_SAIACLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1ASRC_1) +#define RCC_SAIACLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI1ASRC_0 | RCC_DCKCFGR_SAI1ASRC_1) +/** + * @} + */ + +/** @defgroup RCCEx_SAI1_BlockB_Clock_Source RCC SAI BlockB Clock Source + * @{ + */ +#define RCC_SAIBCLKSOURCE_PLLI2SR 0x00000000U +#define RCC_SAIBCLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1BSRC_0) +#define RCC_SAIBCLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1BSRC_1) +#define RCC_SAIBCLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI1BSRC_0 | RCC_DCKCFGR_SAI1BSRC_1) +/** + * @} + */ + +/** @defgroup RCCEx_LPTIM1_Clock_Source RCC LPTIM1 Clock Source + * @{ + */ +#define RCC_LPTIM1CLKSOURCE_PCLK1 0x00000000U +#define RCC_LPTIM1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0) +#define RCC_LPTIM1CLKSOURCE_LSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_1) +#define RCC_LPTIM1CLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0 | RCC_DCKCFGR2_LPTIM1SEL_1) +/** + * @} + */ + + +/** @defgroup RCCEx_DFSDM2_Audio_Clock_Source RCC DFSDM2 Audio Clock Source + * @{ + */ +#define RCC_DFSDM2AUDIOCLKSOURCE_I2S1 0x00000000U +#define RCC_DFSDM2AUDIOCLKSOURCE_I2S2 ((uint32_t)RCC_DCKCFGR_CKDFSDM2ASEL) +/** + * @} + */ + +/** @defgroup RCCEx_DFSDM2_Kernel_Clock_Source RCC DFSDM2 Kernel Clock Source + * @{ + */ +#define RCC_DFSDM2CLKSOURCE_PCLK2 0x00000000U +#define RCC_DFSDM2CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_CKDFSDM1SEL) +/** + * @} + */ + +#endif /* STM32F413xx || STM32F423xx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup RCCEx_PLL_I2S_Clock_Source PLL I2S Clock Source + * @{ + */ +#define RCC_PLLI2SCLKSOURCE_PLLSRC 0x00000000U +#define RCC_PLLI2SCLKSOURCE_EXT ((uint32_t)RCC_PLLI2SCFGR_PLLI2SSRC) +/** + * @} + */ + +/** @defgroup RCCEx_DFSDM1_Audio_Clock_Source RCC DFSDM1 Audio Clock Source + * @{ + */ +#define RCC_DFSDM1AUDIOCLKSOURCE_I2S1 0x00000000U +#define RCC_DFSDM1AUDIOCLKSOURCE_I2S2 ((uint32_t)RCC_DCKCFGR_CKDFSDM1ASEL) +/** + * @} + */ + +/** @defgroup RCCEx_DFSDM1_Kernel_Clock_Source RCC DFSDM1 Kernel Clock Source + * @{ + */ +#define RCC_DFSDM1CLKSOURCE_PCLK2 0x00000000U +#define RCC_DFSDM1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_CKDFSDM1SEL) +/** + * @} + */ + +/** @defgroup RCCEx_I2SAPB1_Clock_Source RCC I2S APB1 Clock Source + * @{ + */ +#define RCC_I2SAPB1CLKSOURCE_PLLI2S 0x00000000U +#define RCC_I2SAPB1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S1SRC_0) +#define RCC_I2SAPB1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S1SRC_1) +#define RCC_I2SAPB1CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S1SRC) +/** + * @} + */ + +/** @defgroup RCCEx_I2SAPB2_Clock_Source RCC I2S APB2 Clock Source + * @{ + */ +#define RCC_I2SAPB2CLKSOURCE_PLLI2S 0x00000000U +#define RCC_I2SAPB2CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S2SRC_0) +#define RCC_I2SAPB2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S2SRC_1) +#define RCC_I2SAPB2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S2SRC) +/** + * @} + */ + +/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source + * @{ + */ +#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U +#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) +#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) +/** + * @} + */ + +/** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source + * @{ + */ +#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U +#define RCC_CLK48CLKSOURCE_PLLI2SQ ((uint32_t)RCC_DCKCFGR2_CK48MSEL) +/** + * @} + */ + +/** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source + * @{ + */ +#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U +#define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_SDIOSEL) +/** + * @} + */ +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) + +/** @defgroup RCCEx_I2S_APB_Clock_Source RCC I2S APB Clock Source + * @{ + */ +#define RCC_I2SAPBCLKSOURCE_PLLR 0x00000000U +#define RCC_I2SAPBCLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2SSRC_0) +#define RCC_I2SAPBCLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2SSRC_1) +/** + * @} + */ + +/** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source + * @{ + */ +#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U +#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) +#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) +/** + * @} + */ + +/** @defgroup RCCEx_LPTIM1_Clock_Source RCC LPTIM1 Clock Source + * @{ + */ +#define RCC_LPTIM1CLKSOURCE_PCLK1 0x00000000U +#define RCC_LPTIM1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0) +#define RCC_LPTIM1CLKSOURCE_LSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_1) +#define RCC_LPTIM1CLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0 | RCC_DCKCFGR2_LPTIM1SEL_1) +/** + * @} + */ +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup RCCEx_TIM_PRescaler_Selection RCC TIM PRescaler Selection + * @{ + */ +#define RCC_TIMPRES_DESACTIVATED ((uint8_t)0x00) +#define RCC_TIMPRES_ACTIVATED ((uint8_t)0x01) +/** + * @} + */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ + STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ + STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ + defined(STM32F423xx) +/** @defgroup RCCEx_LSE_Dual_Mode_Selection RCC LSE Dual Mode Selection + * @{ + */ +#define RCC_LSE_LOWPOWER_MODE ((uint8_t)0x00) +#define RCC_LSE_HIGHDRIVE_MODE ((uint8_t)0x01) +/** + * @} + */ +#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx ||\ + STM32F412Rx || STM32F412Cx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup RCC_MCO2_Clock_Source MCO2 Clock Source + * @{ + */ +#define RCC_MCO2SOURCE_SYSCLK 0x00000000U +#define RCC_MCO2SOURCE_PLLI2SCLK RCC_CFGR_MCO2_0 +#define RCC_MCO2SOURCE_HSE RCC_CFGR_MCO2_1 +#define RCC_MCO2SOURCE_PLLCLK RCC_CFGR_MCO2 +/** + * @} + */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || + STM32F412Rx || STM32F413xx | STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** @defgroup RCC_MCO2_Clock_Source MCO2 Clock Source + * @{ + */ +#define RCC_MCO2SOURCE_SYSCLK 0x00000000U +#define RCC_MCO2SOURCE_I2SCLK RCC_CFGR_MCO2_0 +#define RCC_MCO2SOURCE_HSE RCC_CFGR_MCO2_1 +#define RCC_MCO2SOURCE_PLLCLK RCC_CFGR_MCO2 +/** + * @} + */ +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup RCCEx_Exported_Macros RCCEx Exported Macros + * @{ + */ +/*------------------- STM32F42xxx/STM32F43xxx/STM32F469xx/STM32F479xx --------*/ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOJ_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOJEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOJEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOK_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOKEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOKEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DMA2D_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETHMAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETHMACTX_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETHMACRX_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETHMACPTP_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) +#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) +#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) +#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) +#define __HAL_RCC_GPIOI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOIEN)) +#define __HAL_RCC_GPIOJ_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOJEN)) +#define __HAL_RCC_GPIOK_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOKEN)) +#define __HAL_RCC_DMA2D_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA2DEN)) +#define __HAL_RCC_ETHMAC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACEN)) +#define __HAL_RCC_ETHMACTX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACTXEN)) +#define __HAL_RCC_ETHMACRX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACRXEN)) +#define __HAL_RCC_ETHMACPTP_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACPTPEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) +#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) +#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) + +/** + * @brief Enable ETHERNET clock. + */ +#define __HAL_RCC_ETH_CLK_ENABLE() do { \ + __HAL_RCC_ETHMAC_CLK_ENABLE(); \ + __HAL_RCC_ETHMACTX_CLK_ENABLE(); \ + __HAL_RCC_ETHMACRX_CLK_ENABLE(); \ + } while(0U) +/** + * @brief Disable ETHERNET clock. + */ +#define __HAL_RCC_ETH_CLK_DISABLE() do { \ + __HAL_RCC_ETHMACTX_CLK_DISABLE(); \ + __HAL_RCC_ETHMACRX_CLK_DISABLE(); \ + __HAL_RCC_ETHMAC_CLK_DISABLE(); \ + } while(0U) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) +#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) +#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) +#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) +#define __HAL_RCC_GPIOI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) != RESET) +#define __HAL_RCC_GPIOJ_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOJEN)) != RESET) +#define __HAL_RCC_GPIOK_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOKEN)) != RESET) +#define __HAL_RCC_DMA2D_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_DMA2DEN)) != RESET) +#define __HAL_RCC_ETHMAC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) != RESET) +#define __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) != RESET) +#define __HAL_RCC_ETHMACRX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) != RESET) +#define __HAL_RCC_ETHMACPTP_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) != RESET) +#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) +#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) +#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) +#define __HAL_RCC_ETH_IS_CLK_ENABLED() (__HAL_RCC_ETHMAC_IS_CLK_ENABLED() && \ + __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() && \ + __HAL_RCC_ETHMACRX_IS_CLK_ENABLED()) + +#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) +#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) +#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) +#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) +#define __HAL_RCC_GPIOI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) == RESET) +#define __HAL_RCC_GPIOJ_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOJEN)) == RESET) +#define __HAL_RCC_GPIOK_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOKEN)) == RESET) +#define __HAL_RCC_DMA2D_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_DMA2DEN)) == RESET) +#define __HAL_RCC_ETHMAC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) == RESET) +#define __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) == RESET) +#define __HAL_RCC_ETHMACRX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) == RESET) +#define __HAL_RCC_ETHMACPTP_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) == RESET) +#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) +#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) == RESET) +#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) +#define __HAL_RCC_ETH_IS_CLK_DISABLED() (__HAL_RCC_ETHMAC_IS_CLK_DISABLED() && \ + __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() && \ + __HAL_RCC_ETHMACRX_IS_CLK_DISABLED()) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_DCMI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) + +#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) +#define __HAL_RCC_CRYP_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_HASH_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_CRYP_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_CRYPEN)) +#define __HAL_RCC_HASH_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_HASHEN)) +#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ + +#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ + __HAL_RCC_SYSCFG_CLK_ENABLE();\ + }while(0U) + +#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) + +#define __HAL_RCC_RNG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) +#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) + +#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) +#define __HAL_RCC_CRYP_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) != RESET) +#define __HAL_RCC_CRYP_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) == RESET) + +#define __HAL_RCC_HASH_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) != RESET) +#define __HAL_RCC_HASH_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) == RESET) +#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ + +#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) +#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) + +#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) +#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_FMC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_FMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FMCEN)) +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ + + +/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_FMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) != RESET) +#define __HAL_RCC_FMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) == RESET) +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) +#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART7_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART8_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) +#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) +#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) +#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) +#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) +#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) +#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) +#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) +#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) +#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) +#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) +#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) +#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) +#define __HAL_RCC_UART7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART7EN)) +#define __HAL_RCC_UART8_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART8EN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) +#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) +#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) +#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) +#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) +#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) +#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) +#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) +#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) +#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) +#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) +#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) +#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) +#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) +#define __HAL_RCC_UART7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) != RESET) +#define __HAL_RCC_UART8_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) != RESET) + +#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) +#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) +#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) +#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) +#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) +#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) +#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) +#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) +#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) +#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) +#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) +#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) +#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) +#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) +#define __HAL_RCC_UART7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) == RESET) +#define __HAL_RCC_UART8_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) +#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) +#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) +#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) +#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) +#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) +#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) +#define __HAL_RCC_SPI6_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI6EN)) +#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) + +#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_LTDC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_LTDCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_LTDCEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_LTDC_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_LTDCEN)) +#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_DSI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DSIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DSIEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_DSI_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DSIEN)) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) +#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) +#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) +#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) +#define __HAL_RCC_SPI6_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI6EN)) != RESET) +#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) +#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) +#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) +#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN))!= RESET) + +#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) +#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) +#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN))== RESET) +#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) +#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) +#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) +#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) +#define __HAL_RCC_SPI6_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI6EN)) == RESET) +#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) + +#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_LTDC_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_LTDCEN)) != RESET) +#define __HAL_RCC_LTDC_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_LTDCEN)) == RESET) +#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_DSI_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DSIEN)) != RESET) +#define __HAL_RCC_DSI_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DSIEN)) == RESET) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x22E017FFU) +#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) +#define __HAL_RCC_GPIOI_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOIRST)) +#define __HAL_RCC_ETHMAC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_ETHMACRST)) +#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) +#define __HAL_RCC_GPIOJ_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOJRST)) +#define __HAL_RCC_GPIOK_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOKRST)) +#define __HAL_RCC_DMA2D_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_DMA2DRST)) +#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) + +#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) +#define __HAL_RCC_GPIOI_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOIRST)) +#define __HAL_RCC_ETHMAC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_ETHMACRST)) +#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) +#define __HAL_RCC_GPIOJ_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOJRST)) +#define __HAL_RCC_GPIOK_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOKRST)) +#define __HAL_RCC_DMA2D_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_DMA2DRST)) +#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset + * @brief Force or release AHB2 peripheral reset. + * @{ + */ +#if defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F469xx) +#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000C1U) +#endif /* STM32F427xx || STM32F429xx || STM32F469xx */ +#if defined(STM32F437xx) || defined(STM32F439xx) || defined(STM32F479xx) +#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000F1U) +#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ +#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) +#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) +#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) + +#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) +#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) +#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) +#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) + +#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) +#define __HAL_RCC_CRYP_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_CRYPRST)) +#define __HAL_RCC_HASH_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_HASHRST)) + +#define __HAL_RCC_CRYP_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_CRYPRST)) +#define __HAL_RCC_HASH_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_HASHRST)) +#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset + * @brief Force or release AHB3 peripheral reset. + * @{ + */ +#if defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F437xx) || defined(STM32F439xx) +#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0x00000001U) +#endif /* STM32F427xx || STM32F429xx || STM32F437xx || STM32F439xx */ +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0x00000003U) +#endif /* STM32F469xx || STM32F479xx */ +#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) +#define __HAL_RCC_FMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FMCRST)) +#define __HAL_RCC_FMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FMCRST)) + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) +#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0xF6FEC9FFU) +#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) +#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) +#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) +#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) +#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) +#define __HAL_RCC_UART7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART7RST)) +#define __HAL_RCC_UART8_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART8RST)) +#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) + +#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) +#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) +#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) +#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) +#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) +#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) +#define __HAL_RCC_UART7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART7RST)) +#define __HAL_RCC_UART8_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART8RST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x0C777933U) +#endif /* STM32F469xx || STM32F479xx */ +#if defined(STM32F429xx) || defined(STM32F439xx) +#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x04777933U) +#endif /* STM32F429xx || STM32F439xx */ +#if defined(STM32F427xx) || defined(STM32F437xx) +#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00777933U) +#endif /* STM32F427xx || STM32F437xx */ +#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) +#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) +#define __HAL_RCC_SPI6_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI6RST)) +#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) +#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) + +#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_RELEASE_RESET()(RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) +#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) +#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) +#define __HAL_RCC_SPI6_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI6RST)) +#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) + +#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_LTDC_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_LTDCRST)) +#define __HAL_RCC_LTDC_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_LTDCRST)) +#endif /* STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_DSI_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DSIRST)) +#define __HAL_RCC_DSI_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DSIRST)) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_GPIOI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOILPEN)) +#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) +#define __HAL_RCC_ETHMAC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACLPEN)) +#define __HAL_RCC_ETHMACTX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACTXLPEN)) +#define __HAL_RCC_ETHMACRX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACRXLPEN)) +#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACPTPLPEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) +#define __HAL_RCC_GPIOJ_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOJLPEN)) +#define __HAL_RCC_GPIOK_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOKLPEN)) +#define __HAL_RCC_SRAM3_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM3LPEN)) +#define __HAL_RCC_DMA2D_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_DMA2DLPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) +#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) + +#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_GPIOI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOILPEN)) +#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) +#define __HAL_RCC_ETHMAC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACLPEN)) +#define __HAL_RCC_ETHMACTX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACTXLPEN)) +#define __HAL_RCC_ETHMACRX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACRXLPEN)) +#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACPTPLPEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) +#define __HAL_RCC_GPIOJ_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOJLPEN)) +#define __HAL_RCC_GPIOK_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOKLPEN)) +#define __HAL_RCC_DMA2D_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_DMA2DLPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) +#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) + +#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) +#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) + +#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) +#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) + +#if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) +#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_CRYPLPEN)) +#define __HAL_RCC_HASH_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_HASHLPEN)) + +#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_CRYPLPEN)) +#define __HAL_RCC_HASH_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_HASHLPEN)) +#endif /* STM32F437xx || STM32F439xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_FMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FMCLPEN)) +#define __HAL_RCC_FMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FMCLPEN)) + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) +#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) +#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) +#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) +#define __HAL_RCC_UART7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART7LPEN)) +#define __HAL_RCC_UART8_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART8LPEN)) +#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) + +#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) +#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) +#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) +#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) +#define __HAL_RCC_UART7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART7LPEN)) +#define __HAL_RCC_UART8_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART8LPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) +#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) +#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) +#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) +#define __HAL_RCC_SPI6_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI6LPEN)) +#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) +#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) + +#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) +#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) +#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) +#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) +#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) +#define __HAL_RCC_SPI6_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI6LPEN)) +#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) + +#if defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_LTDC_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_LTDCLPEN)) + +#define __HAL_RCC_LTDC_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_LTDCLPEN)) +#endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define __HAL_RCC_DSI_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DSILPEN)) +#define __HAL_RCC_DSI_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DSILPEN)) +#endif /* STM32F469xx || STM32F479xx */ +/** + * @} + */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------- STM32F40xxx/STM32F41xxx-----------------*/ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) +/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) +#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) +#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) +#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) +#define __HAL_RCC_GPIOI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOIEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) +#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) +#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) +#if defined(STM32F407xx)|| defined(STM32F417xx) +/** + * @brief Enable ETHERNET clock. + */ +#define __HAL_RCC_ETHMAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETHMACTX_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETHMACRX_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETHMACPTP_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ETH_CLK_ENABLE() do { \ + __HAL_RCC_ETHMAC_CLK_ENABLE(); \ + __HAL_RCC_ETHMACTX_CLK_ENABLE(); \ + __HAL_RCC_ETHMACRX_CLK_ENABLE(); \ + } while(0U) + +/** + * @brief Disable ETHERNET clock. + */ +#define __HAL_RCC_ETHMAC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACEN)) +#define __HAL_RCC_ETHMACTX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACTXEN)) +#define __HAL_RCC_ETHMACRX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACRXEN)) +#define __HAL_RCC_ETHMACPTP_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACPTPEN)) +#define __HAL_RCC_ETH_CLK_DISABLE() do { \ + __HAL_RCC_ETHMACTX_CLK_DISABLE(); \ + __HAL_RCC_ETHMACRX_CLK_DISABLE(); \ + __HAL_RCC_ETHMAC_CLK_DISABLE(); \ + } while(0U) +#endif /* STM32F407xx || STM32F417xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) +#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) +#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) +#define __HAL_RCC_GPIOI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) != RESET) +#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) +#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) +#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) +#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) + +#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) +#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) +#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) +#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) +#define __HAL_RCC_GPIOI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOIEN)) == RESET) +#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) +#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN))== RESET) +#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) +#if defined(STM32F407xx)|| defined(STM32F417xx) +/** + * @brief Enable ETHERNET clock. + */ +#define __HAL_RCC_ETHMAC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) != RESET) +#define __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) != RESET) +#define __HAL_RCC_ETHMACRX_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) != RESET) +#define __HAL_RCC_ETHMACPTP_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) != RESET) +#define __HAL_RCC_ETH_IS_CLK_ENABLED() (__HAL_RCC_ETHMAC_IS_CLK_ENABLED() && \ + __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() && \ + __HAL_RCC_ETHMACRX_IS_CLK_ENABLED()) +/** + * @brief Disable ETHERNET clock. + */ +#define __HAL_RCC_ETHMAC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACEN)) == RESET) +#define __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACTXEN)) == RESET) +#define __HAL_RCC_ETHMACRX_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACRXEN)) == RESET) +#define __HAL_RCC_ETHMACPTP_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_ETHMACPTPEN)) == RESET) +#define __HAL_RCC_ETH_IS_CLK_DISABLED() (__HAL_RCC_ETHMAC_IS_CLK_DISABLED() && \ + __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() && \ + __HAL_RCC_ETHMACRX_IS_CLK_DISABLED()) +#endif /* STM32F407xx || STM32F417xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ + __HAL_RCC_SYSCFG_CLK_ENABLE();\ + }while(0U) + +#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) + +#define __HAL_RCC_RNG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) + +#if defined(STM32F407xx)|| defined(STM32F417xx) +#define __HAL_RCC_DCMI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) +#endif /* STM32F407xx || STM32F417xx */ + +#if defined(STM32F415xx) || defined(STM32F417xx) +#define __HAL_RCC_CRYP_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_HASH_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CRYP_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_CRYPEN)) +#define __HAL_RCC_HASH_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_HASHEN)) +#endif /* STM32F415xx || STM32F417xx */ +/** + * @} + */ + + +/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) +#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) + +#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) +#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) + +#if defined(STM32F407xx)|| defined(STM32F417xx) +#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) +#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) +#endif /* STM32F407xx || STM32F417xx */ + +#if defined(STM32F415xx) || defined(STM32F417xx) +#define __HAL_RCC_CRYP_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) != RESET) +#define __HAL_RCC_HASH_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) != RESET) + +#define __HAL_RCC_CRYP_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_CRYPEN)) == RESET) +#define __HAL_RCC_HASH_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_HASHEN)) == RESET) +#endif /* STM32F415xx || STM32F417xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_FSMC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_FSMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FSMCEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_FSMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) != RESET) +#define __HAL_RCC_FSMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) +#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) +#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) +#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) +#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) +#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) +#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) +#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) +#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) +#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) +#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) +#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) +#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) +#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) +#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) +#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) +#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) +#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) +#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) +#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) +#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) +#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) +#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) +#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) +#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) +#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) + +#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) +#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) +#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) +#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) +#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) +#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) +#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) +#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) +#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) +#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) +#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) +#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) +#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) +#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) +#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) +#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) +#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) +#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) +#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) +#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) +#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) +#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) +#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) +#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) + +#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) +#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) +#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) +#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) +#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) +#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#if defined (STM32F405xx) || defined (STM32F415xx) +#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x206011FFU) +#endif /* STM32F405xx || STM32F415xx */ +#if defined (STM32F407xx) || defined (STM32F417xx) +#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x226011FFU) +#endif /* STM32F407xx || STM32F417xx */ +#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) +#define __HAL_RCC_GPIOI_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOIRST)) +#define __HAL_RCC_ETHMAC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_ETHMACRST)) +#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) +#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) + +#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) +#define __HAL_RCC_GPIOI_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOIRST)) +#define __HAL_RCC_ETHMAC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_ETHMACRST)) +#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) +#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset + * @brief Force or release AHB2 peripheral reset. + * @{ + */ +#if defined (STM32F415xx) || defined (STM32F417xx) +#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000F1U) +#endif /* STM32F415xx || STM32F417xx */ +#if defined (STM32F405xx) || defined (STM32F407xx) +#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000C1U) +#endif /* STM32F405xx || STM32F407xx */ +#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) + +#if defined(STM32F407xx)|| defined(STM32F417xx) +#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) +#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) +#endif /* STM32F407xx || STM32F417xx */ + +#if defined(STM32F415xx) || defined(STM32F417xx) +#define __HAL_RCC_CRYP_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_CRYPRST)) +#define __HAL_RCC_HASH_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_HASHRST)) + +#define __HAL_RCC_CRYP_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_CRYPRST)) +#define __HAL_RCC_HASH_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_HASHRST)) +#endif /* STM32F415xx || STM32F417xx */ + +#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) +#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) + +#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) +#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset + * @brief Force or release AHB3 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0x00000001U) +#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) + +#define __HAL_RCC_FSMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FSMCRST)) +#define __HAL_RCC_FSMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FSMCRST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0xF6FEC9FFU) +#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) +#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) +#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) +#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) +#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) +#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) + +#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) +#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) +#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) +#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) +#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) +#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x04777933U) +#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) +#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) + +#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_RELEASE_RESET()(RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) +#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_GPIOI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOILPEN)) +#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) +#define __HAL_RCC_ETHMAC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACLPEN)) +#define __HAL_RCC_ETHMACTX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACTXLPEN)) +#define __HAL_RCC_ETHMACRX_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACRXLPEN)) +#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_ETHMACPTPLPEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) +#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) + +#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_GPIOI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOILPEN)) +#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) +#define __HAL_RCC_ETHMAC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACLPEN)) +#define __HAL_RCC_ETHMACTX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACTXLPEN)) +#define __HAL_RCC_ETHMACRX_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACRXLPEN)) +#define __HAL_RCC_ETHMACPTP_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_ETHMACPTPLPEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) +#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) + +#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) +#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) + +#if defined(STM32F407xx)|| defined(STM32F417xx) +#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) +#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) +#endif /* STM32F407xx || STM32F417xx */ + +#if defined(STM32F415xx) || defined(STM32F417xx) +#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_CRYPLPEN)) +#define __HAL_RCC_HASH_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_HASHLPEN)) + +#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_CRYPLPEN)) +#define __HAL_RCC_HASH_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_HASHLPEN)) +#endif /* STM32F415xx || STM32F417xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_FSMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FSMCLPEN)) +#define __HAL_RCC_FSMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FSMCLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) +#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) +#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) +#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) + +#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) +#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) +#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) +#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) +#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) +#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) +#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) + +#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) +#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) +#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) +#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) +/** + * @} + */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------------- STM32F401xE/STM32F401xC --------------------------*/ +#if defined(STM32F401xC) || defined(STM32F401xE) +/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) +#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) +#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) +#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) + +#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) +#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ + __HAL_RCC_SYSCFG_CLK_ENABLE();\ + }while(0U) + +#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) +#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCC_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) +#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) +#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) +#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) + +#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) +#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) +#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) +#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) +#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) +#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) +#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) + +#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) +#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) +#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) +/** + * @} + */ +/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x0060109FU) +#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) + +#define __HAL_RCC_AHB1_RELEASE_RESET() (RCC->AHB1RSTR = 0x00U) +#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset + * @brief Force or release AHB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x00000080U) +#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) + +#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) +#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x10E2C80FU) +#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) + +#define __HAL_RCC_APB1_RELEASE_RESET() (RCC->APB1RSTR = 0x00U) +#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00077931U) +#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) + +#define __HAL_RCC_APB2_RELEASE_RESET() (RCC->APB2RSTR = 0x00U) +#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset + * @brief Force or release AHB3 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) + +#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) + +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) + +#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) + +#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) +/** + * @} + */ +#endif /* STM32F401xC || STM32F401xE*/ +/*----------------------------------------------------------------------------*/ + +/*-------------------------------- STM32F410xx -------------------------------*/ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_RNG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_RNGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_RNGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) +#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_RNGEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) +#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_RNGEN)) != RESET) + +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) +#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_RNGEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB1) peripheral clock. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_LPTIM1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_RTCAPB_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) +#define __HAL_RCC_RTCAPB_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_RTCAPBEN)) +#define __HAL_RCC_LPTIM1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_LPTIM1EN)) +#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) +#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) +#define __HAL_RCC_RTCAPB_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) != RESET) +#define __HAL_RCC_LPTIM1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) != RESET) +#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) +#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) + +#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) +#define __HAL_RCC_RTCAPB_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) == RESET) +#define __HAL_RCC_LPTIM1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) == RESET) +#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) +#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @{ + */ +#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_EXTIT_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) +#define __HAL_RCC_EXTIT_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_EXTITEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) +#define __HAL_RCC_EXTIT_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) != RESET) + +#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) +#define __HAL_RCC_EXTIT_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x80601087U) +#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) +#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_RNGRST)) +#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) +#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_RNGRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset + * @brief Force or release AHB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB2_FORCE_RESET() +#define __HAL_RCC_AHB2_RELEASE_RESET() +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset + * @brief Force or release AHB3 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB3_FORCE_RESET() +#define __HAL_RCC_AHB3_RELEASE_RESET() +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#if defined (STM32F410Rx) || defined (STM32F410Cx) +#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x31624A18U) +#endif /* STM32F410Rx || STM32F410Cx */ +#if defined (STM32F410Tx) +#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x31620A18U) +#endif /* STM32F410Tx */ +#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_LPTIM1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_LPTIM1RST)) +#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) +#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) + +#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_LPTIM1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_LPTIM1RST)) +#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) +#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#if defined (STM32F410Rx) || defined (STM32F410Cx) +#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00155131U) +#endif /* STM32F410Rx || STM32F410Cx */ +#if defined (STM32F410Tx) +#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00055111U) +#endif /* STM32F410Tx */ +#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) +#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_RNGLPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) + +#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_RNGLPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_LPTIM1LPEN)) +#define __HAL_RCC_RTCAPB_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_RTCAPBLPEN)) +#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) + +#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_LPTIM1LPEN)) +#define __HAL_RCC_RTCAPB_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_RTCAPBLPEN)) +#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @{ + */ +#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) +#define __HAL_RCC_EXTIT_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_EXTITLPEN)) +#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) +#define __HAL_RCC_EXTIT_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_EXTITLPEN)) +/** + * @} + */ + +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ +/*----------------------------------------------------------------------------*/ + +/*-------------------------------- STM32F411xx -------------------------------*/ +#if defined(STM32F411xE) +/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) +#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) +#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) +#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) + +#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) +#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEX_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ + __HAL_RCC_SYSCFG_CLK_ENABLE();\ + }while(0U) + +#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) +#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) +#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) +#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) +#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) + +#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) +#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) +#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @{ + */ +#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) +#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) +#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) +#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) +#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) +#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) +#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) + +#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) +#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) +#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) +#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x0060109FU) +#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) + +#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset + * @brief Force or release AHB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x00000080U) +#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) + +#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) +#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset + * @brief Force or release AHB3 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x10E2C80FU) +#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) + +#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00177931U) +#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) +#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) + +#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) +#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) + +#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @{ + */ +#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) + +#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @{ + */ +#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) +#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) + +#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) +#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) +/** + * @} + */ +#endif /* STM32F411xE */ +/*----------------------------------------------------------------------------*/ + +/*---------------------------------- STM32F446xx -----------------------------*/ +#if defined(STM32F446xx) +/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) +#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) +#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) +#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_OTGHSULPIEN)) +#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) +#define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) +#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) +#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) +#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) +#define __HAL_RCC_USB_OTG_HS_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) != RESET) +#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) != RESET) +#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN))!= RESET) +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) + +#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) +#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) +#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) +#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) +#define __HAL_RCC_USB_OTG_HS_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSEN)) == RESET) +#define __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_OTGHSULPIEN)) == RESET) +#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) +#define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_DCMI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) +#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ + __HAL_RCC_SYSCFG_CLK_ENABLE();\ + }while(0U) + +#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) + +#define __HAL_RCC_RNG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_DCMI_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) != RESET) +#define __HAL_RCC_DCMI_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_DCMIEN)) == RESET) + +#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) +#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) + +#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) +#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_FMC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_FMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FMCEN)) +#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_FMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) != RESET) +#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) + +#define __HAL_RCC_FMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FMCEN)) == RESET) +#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPDIFRX_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPDIFRXEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPDIFRXEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CEC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CECEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CECEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) +#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) +#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) +#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) +#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) +#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) +#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) +#define __HAL_RCC_SPDIFRX_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPDIFRXEN)) +#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) +#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) +#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) +#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) +#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) +#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) +#define __HAL_RCC_CEC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CECEN)) +#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) +#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) +#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) +#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) +#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) +#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) +#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) +#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) +#define __HAL_RCC_SPDIFRX_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPDIFRXEN)) != RESET) +#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) +#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) +#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) +#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) +#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) +#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) +#define __HAL_RCC_CEC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CECEN)) != RESET) +#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) + +#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) +#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) +#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) +#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) +#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) +#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) +#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) +#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) +#define __HAL_RCC_SPDIFRX_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPDIFRXEN)) == RESET) +#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) +#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) +#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) +#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) +#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) +#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) +#define __HAL_RCC_CEC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CECEN)) == RESET) +#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SAI2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) +#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) +#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) +#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) +#define __HAL_RCC_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) +#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) +#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) +#define __HAL_RCC_SAI2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI2EN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) +#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) +#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) +#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) +#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) +#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) +#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) +#define __HAL_RCC_SAI2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI2EN)) != RESET) + +#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) +#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) +#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) +#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) +#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) +#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) +#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) +#define __HAL_RCC_SAI2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI2EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x206010FFU) +#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) +#define __HAL_RCC_USB_OTG_HS_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_OTGHRST)) +#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) + +#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) +#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) +#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) +#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_OTGHRST)) +#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset + * @brief Force or release AHB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x00000081U) +#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) +#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) +#define __HAL_RCC_DCMI_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_DCMIRST)) + +#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) +#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) +#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) +#define __HAL_RCC_DCMI_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_DCMIRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset + * @brief Force or release AHB3 peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0x00000003U) +#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) + +#define __HAL_RCC_FMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FMCRST)) +#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) + +#define __HAL_RCC_FMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FMCRST)) +#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x3FFFC9FFU) +#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) +#define __HAL_RCC_SPDIFRX_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPDIFRXRST)) +#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) +#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) +#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) +#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) +#define __HAL_RCC_CEC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CECRST)) +#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) +#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) + +#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) +#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) +#define __HAL_RCC_SPDIFRX_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPDIFRXRST)) +#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) +#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) +#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) +#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) +#define __HAL_RCC_CEC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CECRST)) +#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x00C77933U) +#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) +#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) +#define __HAL_RCC_SAI2_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI2RST)) +#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) + +#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) +#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) +#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) +#define __HAL_RCC_SAI2_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI2RST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSLPEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_OTGHSULPILPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) +#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) + +#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) +#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSLPEN)) +#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_OTGHSULPILPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) +#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) + +#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) +#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) + +#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_DCMILPEN)) +#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_DCMILPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_FMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FMCLPEN)) +#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) + +#define __HAL_RCC_FMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FMCLPEN)) +#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) +#define __HAL_RCC_SPDIFRX_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPDIFRXLPEN)) +#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) +#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) +#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) +#define __HAL_RCC_CEC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CECLPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) +#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) + +#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) +#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) +#define __HAL_RCC_SPDIFRX_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPDIFRXLPEN)) +#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) +#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) +#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) +#define __HAL_RCC_CEC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CECLPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) +#define __HAL_RCC_ADC2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC2LPEN)) +#define __HAL_RCC_ADC3_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_ADC3LPEN)) +#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) +#define __HAL_RCC_SAI2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI2LPEN)) +#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE()(RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) + +#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE()(RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) +#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) +#define __HAL_RCC_ADC2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC2LPEN)) +#define __HAL_RCC_ADC3_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_ADC3LPEN)) +#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) +#define __HAL_RCC_SAI2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI2LPEN)) +/** + * @} + */ + +#endif /* STM32F446xx */ +/*----------------------------------------------------------------------------*/ + +/*-------STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx-------*/ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup RCCEx_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) +#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) +#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) +#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOGEN)) +#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) +#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) +#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) != RESET) +#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) != RESET) +#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) + +#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) +#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) +#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOFEN)) == RESET) +#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOGEN)) == RESET) +#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F423xx) +#define __HAL_RCC_AES_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_AESEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_AESEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_AES_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_AESEN)) +#endif /* STM32F423xx */ + +#define __HAL_RCC_RNG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) + +#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ + __HAL_RCC_SYSCFG_CLK_ENABLE();\ + }while(0U) + +#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Peripheral_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F423xx) +#define __HAL_RCC_AES_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_AESEN)) != RESET) +#define __HAL_RCC_AES_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_AESEN)) == RESET) +#endif /* STM32F423xx */ + +#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) +#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) + +#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) != RESET) +#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_RNGEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable + * @brief Enables or disables the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_FSMC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_QSPI_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_FSMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FSMCEN)) +#define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Peripheral_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB3 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_FSMC_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) != RESET) +#define __HAL_RCC_QSPI_IS_CLK_ENABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) != RESET) + +#define __HAL_RCC_FSMC_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_FSMCEN)) == RESET) +#define __HAL_RCC_QSPI_IS_CLK_DISABLED() ((RCC->AHB3ENR & (RCC_AHB3ENR_QSPIEN)) == RESET) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ + +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART7_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART8_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) +#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) +#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) +#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) +#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) +#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_LPTIM1EN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_RTCAPBEN)) +#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) +#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) +#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) +#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) +#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN3EN)) +#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) +#define __HAL_RCC_UART7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART7EN)) +#define __HAL_RCC_UART8_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART8EN)) +#endif /* STM32F413xx || STM32F423xx */ + +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) +#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) +#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) +#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) +#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) +#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) +#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) +#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) +#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) +#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) +#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN))!= RESET) +#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN3EN)) != RESET) +#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) +#define __HAL_RCC_UART7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) != RESET) +#define __HAL_RCC_UART8_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) +#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) +#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) +#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) +#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) +#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) +#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) +#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) +#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) +#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) +#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) +#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN3EN)) == RESET) +#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) +#define __HAL_RCC_UART7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) == RESET) +#define __HAL_RCC_UART8_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_UART9EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_UART9EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_UART10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_UART10EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_EXTIT_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_UART9EN)) +#define __HAL_RCC_UART10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_UART10EN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) +#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) +#define __HAL_RCC_EXTIT_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_EXTITEN)) +#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) +#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DFSDM1EN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DFSDM2EN)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART9EN)) != RESET) +#define __HAL_RCC_UART10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART10EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) +#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) +#define __HAL_RCC_EXTIT_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) != RESET) +#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) +#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM1EN)) != RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM2EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART9EN)) == RESET) +#define __HAL_RCC_UART10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART10EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) +#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) +#define __HAL_RCC_EXTIT_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) == RESET) +#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) +#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM1EN)) == RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM2EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#if defined (STM32F412Zx) || defined(STM32F413xx) || defined (STM32F423xx) +#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x006010FFU) +#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined (STM32F412Cx) +#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x00601087U) +#endif /* STM32F412Cx */ +#if defined (STM32F412Vx) +#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x0060109FU) +#endif /* STM32F412Vx */ +#if defined (STM32F412Rx) +#define __HAL_RCC_AHB1_FORCE_RESET() (RCC->AHB1RSTR = 0x0060108FU) +#endif /* STM32F412Rx */ +#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIODRST)) +#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOERST)) +#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_GPIOGRST)) +#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ +#define __HAL_RCC_CRC_FORCE_RESET() (RCC->AHB1RSTR |= (RCC_AHB1RSTR_CRCRST)) + +#if defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIODRST)) +#endif /* STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOERST)) +#endif /* STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOFRST)) +#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_GPIOGRST)) +#endif /* STM32F412Zx || STM32F413xx || STM32F423xx */ +#define __HAL_RCC_CRC_RELEASE_RESET() (RCC->AHB1RSTR &= ~(RCC_AHB1RSTR_CRCRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_Force_Release_Reset AHB2 Force Release Reset + * @brief Force or release AHB2 peripheral reset. + * @{ + */ +#if defined(STM32F423xx) +#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000D0U) +#define __HAL_RCC_AES_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_AESRST)) +#define __HAL_RCC_AES_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_AESRST)) +#else +#define __HAL_RCC_AHB2_FORCE_RESET() (RCC->AHB2RSTR = 0x000000C0U) +#endif /* STM32F423xx */ +#define __HAL_RCC_AHB2_RELEASE_RESET() (RCC->AHB2RSTR = 0x00U) + +#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_OTGFSRST)) +#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_OTGFSRST)) + +#define __HAL_RCC_RNG_FORCE_RESET() (RCC->AHB2RSTR |= (RCC_AHB2RSTR_RNGRST)) +#define __HAL_RCC_RNG_RELEASE_RESET() (RCC->AHB2RSTR &= ~(RCC_AHB2RSTR_RNGRST)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_Force_Release_Reset AHB3 Force Release Reset + * @brief Force or release AHB3 peripheral reset. + * @{ + */ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_AHB3_FORCE_RESET() (RCC->AHB3RSTR = 0x00000003U) +#define __HAL_RCC_AHB3_RELEASE_RESET() (RCC->AHB3RSTR = 0x00U) + +#define __HAL_RCC_FSMC_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_FSMCRST)) +#define __HAL_RCC_QSPI_FORCE_RESET() (RCC->AHB3RSTR |= (RCC_AHB3RSTR_QSPIRST)) + +#define __HAL_RCC_FSMC_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_FSMCRST)) +#define __HAL_RCC_QSPI_RELEASE_RESET() (RCC->AHB3RSTR &= ~(RCC_AHB3RSTR_QSPIRST)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Cx) +#define __HAL_RCC_AHB3_FORCE_RESET() +#define __HAL_RCC_AHB3_RELEASE_RESET() + +#define __HAL_RCC_FSMC_FORCE_RESET() +#define __HAL_RCC_QSPI_FORCE_RESET() + +#define __HAL_RCC_FSMC_RELEASE_RESET() +#define __HAL_RCC_QSPI_RELEASE_RESET() +#endif /* STM32F412Cx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0xFFFECBFFU) +#endif /* STM32F413xx || STM32F423xx */ +#if defined (STM32F412Zx) || defined (STM32F412Vx) || defined (STM32F412Rx) || defined (STM32F412Cx) +#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0x17E6C9FFU) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ +#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_LPTIM1RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) +#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) +#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN3RST)) +#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) +#define __HAL_RCC_UART7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART7RST)) +#define __HAL_RCC_UART8_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART8RST)) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_LPTIM1RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) +#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) +#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN3RST)) +#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) +#define __HAL_RCC_UART7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART7RST)) +#define __HAL_RCC_UART8_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART8RST)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#if defined(STM32F413xx)|| defined(STM32F423xx) +#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x035779F3U) +#endif /* STM32F413xx || STM32F423xx */ +#if defined (STM32F412Zx) || defined (STM32F412Vx) || defined (STM32F412Rx) || defined (STM32F412Cx) +#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0x01177933U) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ +#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_UART9RST)) +#define __HAL_RCC_UART10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_UART10RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) +#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DFSDM1RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DFSDM2RST)) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_UART9RST)) +#define __HAL_RCC_UART10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_UART10RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) +#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DFSDM1RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DFSDM2RST)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#if defined(STM32F423xx) +#define __HAL_RCC_AES_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_AESLPEN)) +#define __HAL_RCC_AES_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_AESLPEN)) +#endif /* STM32F423xx */ + +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) + +#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) +#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_FSMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FSMCLPEN)) +#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) + +#define __HAL_RCC_FSMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FSMCLPEN)) +#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ + +/** + * @} + */ + +/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_LPTIM1LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_RTCAPBLPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) +#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN3LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) +#define __HAL_RCC_UART7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART7LPEN)) +#define __HAL_RCC_UART8_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART8LPEN)) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_LPTIM1LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_RTCAPBLPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) +#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN3LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) +#define __HAL_RCC_UART7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART7LPEN)) +#define __HAL_RCC_UART8_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART8LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_UART9LPEN)) +#define __HAL_RCC_UART10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_UART10LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_EXTIT_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_EXTITLPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) +#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DFSDM1LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DFSDM2LPEN)) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_UART9LPEN)) +#define __HAL_RCC_UART10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_UART10LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_EXTIT_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_EXTITLPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) +#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DFSDM1LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DFSDM2LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------------------- PLL Configuration --------------------------*/ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @brief Macro to configure the main PLL clock source, multiplication and division factors. + * @note This function must be used only when the main PLL is disabled. + * @param __RCC_PLLSource__ specifies the PLL entry clock source. + * This parameter can be one of the following values: + * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry + * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry + * @note This clock source (RCC_PLLSource) is common for the main PLL and PLLI2S. + * @param __PLLM__ specifies the division factor for PLL VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 2 MHz to limit PLL jitter. + * @param __PLLN__ specifies the multiplication factor for PLL VCO output clock + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLN parameter correctly to ensure that the VCO + * output frequency is between 100 and 432 MHz. + * + * @param __PLLP__ specifies the division factor for main system clock (SYSCLK) + * This parameter must be a number in the range {2, 4, 6, or 8}. + * + * @param __PLLQ__ specifies the division factor for OTG FS, SDIO and RNG clocks + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * @note If the USB OTG FS is used in your application, you have to set the + * PLLQ parameter correctly to have 48 MHz clock for the USB. However, + * the SDIO and RNG need a frequency lower than or equal to 48 MHz to work + * correctly. + * + * @param __PLLR__ PLL division factor for I2S, SAI, SYSTEM, SPDIFRX clocks. + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note This parameter is only available in STM32F446xx/STM32F469xx/STM32F479xx/ + STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/STM32F413xx/STM32F423xx devices. + * + */ +#define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__,__PLLR__) \ + (RCC->PLLCFGR = ((__RCC_PLLSource__) | (__PLLM__) | \ + ((__PLLN__) << RCC_PLLCFGR_PLLN_Pos) | \ + ((((__PLLP__) >> 1U) -1U) << RCC_PLLCFGR_PLLP_Pos) | \ + ((__PLLQ__) << RCC_PLLCFGR_PLLQ_Pos) | \ + ((__PLLR__) << RCC_PLLCFGR_PLLR_Pos))) +#else +/** @brief Macro to configure the main PLL clock source, multiplication and division factors. + * @note This function must be used only when the main PLL is disabled. + * @param __RCC_PLLSource__ specifies the PLL entry clock source. + * This parameter can be one of the following values: + * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry + * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry + * @note This clock source (RCC_PLLSource) is common for the main PLL and PLLI2S. + * @param __PLLM__ specifies the division factor for PLL VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 2 MHz to limit PLL jitter. + * @param __PLLN__ specifies the multiplication factor for PLL VCO output clock + * This parameter must be a number between Min_Data = 50 and Max_Data = 432 + * Except for STM32F411xE devices where Min_Data = 192. + * @note You have to set the PLLN parameter correctly to ensure that the VCO + * output frequency is between 100 and 432 MHz, Except for STM32F411xE devices + * where frequency is between 192 and 432 MHz. + * @param __PLLP__ specifies the division factor for main system clock (SYSCLK) + * This parameter must be a number in the range {2, 4, 6, or 8}. + * + * @param __PLLQ__ specifies the division factor for OTG FS, SDIO and RNG clocks + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * @note If the USB OTG FS is used in your application, you have to set the + * PLLQ parameter correctly to have 48 MHz clock for the USB. However, + * the SDIO and RNG need a frequency lower than or equal to 48 MHz to work + * correctly. + * + */ +#define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__) \ + (RCC->PLLCFGR = (0x20000000U | (__RCC_PLLSource__) | (__PLLM__)| \ + ((__PLLN__) << RCC_PLLCFGR_PLLN_Pos) | \ + ((((__PLLP__) >> 1U) -1U) << RCC_PLLCFGR_PLLP_Pos) | \ + ((__PLLQ__) << RCC_PLLCFGR_PLLQ_Pos))) +#endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ +/*----------------------------------------------------------------------------*/ + +/*----------------------------PLLI2S Configuration ---------------------------*/ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + +/** @brief Macros to enable or disable the PLLI2S. + * @note The PLLI2S is disabled by hardware when entering STOP and STANDBY modes. + */ +#define __HAL_RCC_PLLI2S_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLI2SON_BB = ENABLE) +#define __HAL_RCC_PLLI2S_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLI2SON_BB = DISABLE) + +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || + STM32F412Rx || STM32F412Cx */ +#if defined(STM32F446xx) +/** @brief Macro to configure the PLLI2S clock multiplication and division factors . + * @note This macro must be used only when the PLLI2S is disabled. + * @note PLLI2S clock source is common with the main PLL (configured in + * HAL_RCC_ClockConfig() API). + * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 1 MHz to limit PLLI2S jitter. + * + * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLI2SP__ specifies division factor for SPDIFRX Clock. + * This parameter must be a number in the range {2, 4, 6, or 8}. + * @note the PLLI2SP parameter is only available with STM32F446xx Devices + * + * @param __PLLI2SR__ specifies the division factor for I2S clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz + * on the I2S clock frequency. + * + * @param __PLLI2SQ__ specifies the division factor for SAI clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + */ +#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SP__, __PLLI2SQ__, __PLLI2SR__) \ + (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ + ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ + ((((__PLLI2SP__) >> 1U) -1U) << RCC_PLLI2SCFGR_PLLI2SP_Pos) |\ + ((__PLLI2SQ__) << RCC_PLLI2SCFGR_PLLI2SQ_Pos) |\ + ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) +#elif defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) +/** @brief Macro to configure the PLLI2S clock multiplication and division factors . + * @note This macro must be used only when the PLLI2S is disabled. + * @note PLLI2S clock source is common with the main PLL (configured in + * HAL_RCC_ClockConfig() API). + * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 1 MHz to limit PLLI2S jitter. + * + * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLI2SR__ specifies the division factor for I2S clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz + * on the I2S clock frequency. + * + * @param __PLLI2SQ__ specifies the division factor for SAI clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + */ +#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SQ__, __PLLI2SR__) \ + (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ + ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ + ((__PLLI2SQ__) << RCC_PLLI2SCFGR_PLLI2SQ_Pos) |\ + ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) +#else +/** @brief Macro to configure the PLLI2S clock multiplication and division factors . + * @note This macro must be used only when the PLLI2S is disabled. + * @note PLLI2S clock source is common with the main PLL (configured in + * HAL_RCC_ClockConfig() API). + * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLI2SR__ specifies the division factor for I2S clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz + * on the I2S clock frequency. + * + */ +#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SN__, __PLLI2SR__) \ + (RCC->PLLI2SCFGR = (((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ + ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) +#endif /* STM32F446xx */ + +#if defined(STM32F411xE) +/** @brief Macro to configure the PLLI2S clock multiplication and division factors . + * @note This macro must be used only when the PLLI2S is disabled. + * @note This macro must be used only when the PLLI2S is disabled. + * @note PLLI2S clock source is common with the main PLL (configured in + * HAL_RCC_ClockConfig() API). + * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note The PLLI2SM parameter is only used with STM32F411xE/STM32F410xx Devices + * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 2 MHz to limit PLLI2S jitter. + * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock + * This parameter must be a number between Min_Data = 192 and Max_Data = 432. + * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 192 and Max_Data = 432 MHz. + * @param __PLLI2SR__ specifies the division factor for I2S clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz + * on the I2S clock frequency. + */ +#define __HAL_RCC_PLLI2S_I2SCLK_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SR__) (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ + ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ + ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) +#endif /* STM32F411xE */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macro used by the SAI HAL driver to configure the PLLI2S clock multiplication and division factors. + * @note This macro must be used only when the PLLI2S is disabled. + * @note PLLI2S clock source is common with the main PLL (configured in + * HAL_RCC_ClockConfig() API) + * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock. + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * @param __PLLI2SQ__ specifies the division factor for SAI1 clock. + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * @note the PLLI2SQ parameter is only available with STM32F427xx/437xx/429xx/439xx/469xx/479xx + * Devices and can be configured using the __HAL_RCC_PLLI2S_PLLSAICLK_CONFIG() macro + * @param __PLLI2SR__ specifies the division factor for I2S clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz + * on the I2S clock frequency. + */ +#define __HAL_RCC_PLLI2S_SAICLK_CONFIG(__PLLI2SN__, __PLLI2SQ__, __PLLI2SR__) (RCC->PLLI2SCFGR = ((__PLLI2SN__) << 6U) |\ + ((__PLLI2SQ__) << 24U) |\ + ((__PLLI2SR__) << 28U)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------------------ PLLSAI Configuration ------------------------*/ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macros to Enable or Disable the PLLISAI. + * @note The PLLSAI is only available with STM32F429x/439x Devices. + * @note The PLLSAI is disabled by hardware when entering STOP and STANDBY modes. + */ +#define __HAL_RCC_PLLSAI_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLSAION_BB = ENABLE) +#define __HAL_RCC_PLLSAI_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLSAION_BB = DISABLE) + +#if defined(STM32F446xx) +/** @brief Macro to configure the PLLSAI clock multiplication and division factors. + * + * @param __PLLSAIM__ specifies the division factor for PLLSAI VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLSAIM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 1 MHz to limit PLLI2S jitter. + * @note The PLLSAIM parameter is only used with STM32F446xx Devices + * + * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLSAIP__ specifies division factor for OTG FS, SDIO and RNG clocks. + * This parameter must be a number in the range {2, 4, 6, or 8}. + * @note the PLLSAIP parameter is only available with STM32F446xx Devices + * + * @param __PLLSAIQ__ specifies the division factor for SAI clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * + * @param __PLLSAIR__ specifies the division factor for LTDC clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note the PLLI2SR parameter is only available with STM32F427/437/429/439xx Devices + */ +#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIM__, __PLLSAIN__, __PLLSAIP__, __PLLSAIQ__, __PLLSAIR__) \ + (RCC->PLLSAICFGR = ((__PLLSAIM__) | \ + ((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) | \ + ((((__PLLSAIP__) >> 1U) -1U) << RCC_PLLSAICFGR_PLLSAIP_Pos) | \ + ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos))) +#endif /* STM32F446xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macro to configure the PLLSAI clock multiplication and division factors. + * + * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLSAIP__ specifies division factor for SDIO and CLK48 clocks. + * This parameter must be a number in the range {2, 4, 6, or 8}. + * + * @param __PLLSAIQ__ specifies the division factor for SAI clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * + * @param __PLLSAIR__ specifies the division factor for LTDC clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + */ +#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIN__, __PLLSAIP__, __PLLSAIQ__, __PLLSAIR__) \ + (RCC->PLLSAICFGR = (((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) |\ + ((((__PLLSAIP__) >> 1U) -1U) << RCC_PLLSAICFGR_PLLSAIP_Pos) |\ + ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos) |\ + ((__PLLSAIR__) << RCC_PLLSAICFGR_PLLSAIR_Pos))) +#endif /* STM32F469xx || STM32F479xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) +/** @brief Macro to configure the PLLSAI clock multiplication and division factors. + * + * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLSAIQ__ specifies the division factor for SAI clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * + * @param __PLLSAIR__ specifies the division factor for LTDC clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note the PLLI2SR parameter is only available with STM32F427/437/429/439xx Devices + */ +#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIN__, __PLLSAIQ__, __PLLSAIR__) \ + (RCC->PLLSAICFGR = (((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) | \ + ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos) | \ + ((__PLLSAIR__) << RCC_PLLSAICFGR_PLLSAIR_Pos))) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------- PLLSAI/PLLI2S Dividers Configuration -------------------*/ +#if defined(STM32F413xx) || defined(STM32F423xx) +/** @brief Macro to configure the SAI clock Divider coming from PLLI2S. + * @note This function must be called before enabling the PLLI2S. + * @param __PLLI2SDivR__ specifies the PLLI2S division factor for SAI1 clock. + * This parameter must be a number between 1 and 32. + * SAI1 clock frequency = f(PLLI2SR) / __PLLI2SDivR__ + */ +#define __HAL_RCC_PLLI2S_PLLSAICLKDIVR_CONFIG(__PLLI2SDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR, (__PLLI2SDivR__)-1U)) + +/** @brief Macro to configure the SAI clock Divider coming from PLL. + * @param __PLLDivR__ specifies the PLL division factor for SAI1 clock. + * This parameter must be a number between 1 and 32. + * SAI1 clock frequency = f(PLLR) / __PLLDivR__ + */ +#define __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(__PLLDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR, ((__PLLDivR__)-1U)<<8U)) +#endif /* STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macro to configure the SAI clock Divider coming from PLLI2S. + * @note This function must be called before enabling the PLLI2S. + * @param __PLLI2SDivQ__ specifies the PLLI2S division factor for SAI1 clock. + * This parameter must be a number between 1 and 32. + * SAI1 clock frequency = f(PLLI2SQ) / __PLLI2SDivQ__ + */ +#define __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(__PLLI2SDivQ__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ, (__PLLI2SDivQ__)-1U)) + +/** @brief Macro to configure the SAI clock Divider coming from PLLSAI. + * @note This function must be called before enabling the PLLSAI. + * @param __PLLSAIDivQ__ specifies the PLLSAI division factor for SAI1 clock . + * This parameter must be a number between Min_Data = 1 and Max_Data = 32. + * SAI1 clock frequency = f(PLLSAIQ) / __PLLSAIDivQ__ + */ +#define __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(__PLLSAIDivQ__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ, ((__PLLSAIDivQ__)-1U)<<8U)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macro to configure the LTDC clock Divider coming from PLLSAI. + * + * @note The LTDC peripheral is only available with STM32F427/437/429/439/469/479xx Devices. + * @note This function must be called before enabling the PLLSAI. + * @param __PLLSAIDivR__ specifies the PLLSAI division factor for LTDC clock . + * This parameter must be a number between Min_Data = 2 and Max_Data = 16. + * LTDC clock frequency = f(PLLSAIR) / __PLLSAIDivR__ + */ +#define __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(__PLLSAIDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVR, (__PLLSAIDivR__))) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------------- Peripheral Clock selection -----------------------*/ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) ||\ + defined(STM32F479xx) +/** @brief Macro to configure the I2S clock source (I2SCLK). + * @note This function must be called before enabling the I2S APB clock. + * @param __SOURCE__ specifies the I2S clock source. + * This parameter can be one of the following values: + * @arg RCC_I2SCLKSOURCE_PLLI2S: PLLI2S clock used as I2S clock source. + * @arg RCC_I2SCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin + * used as I2S clock source. + */ +#define __HAL_RCC_I2S_CONFIG(__SOURCE__) (MODIFY_REG(RCC->CFGR, RCC_CFGR_I2SSRC, (__SOURCE__))) + + +/** @brief Macro to get the I2S clock source (I2SCLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_I2SCLKSOURCE_PLLI2S: PLLI2S clock used as I2S clock source. + * @arg @ref RCC_I2SCLKSOURCE_EXT External clock mapped on the I2S_CKIN pin + * used as I2S clock source + */ +#define __HAL_RCC_GET_I2S_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_I2SSRC))) +#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) + +/** @brief Macro to configure SAI1BlockA clock source selection. + * @note The SAI peripheral is only available with STM32F427/437/429/439/469/479xx Devices. + * @note This function must be called before enabling PLLSAI, PLLI2S and + * the SAI clock. + * @param __SOURCE__ specifies the SAI Block A clock source. + * This parameter can be one of the following values: + * @arg RCC_SAIACLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used + * as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used + * as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_Ext: External clock mapped on the I2S_CKIN pin + * used as SAI1 Block A clock. + */ +#define __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC, (__SOURCE__))) + +/** @brief Macro to configure SAI1BlockB clock source selection. + * @note The SAI peripheral is only available with STM32F427/437/429/439/469/479xx Devices. + * @note This function must be called before enabling PLLSAI, PLLI2S and + * the SAI clock. + * @param __SOURCE__ specifies the SAI Block B clock source. + * This parameter can be one of the following values: + * @arg RCC_SAIBCLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used + * as SAI1 Block B clock. + * @arg RCC_SAIBCLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used + * as SAI1 Block B clock. + * @arg RCC_SAIBCLKSOURCE_Ext: External clock mapped on the I2S_CKIN pin + * used as SAI1 Block B clock. + */ +#define __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC, (__SOURCE__))) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F446xx) +/** @brief Macro to configure SAI1 clock source selection. + * @note This configuration is only available with STM32F446xx Devices. + * @note This function must be called before enabling PLL, PLLSAI, PLLI2S and + * the SAI clock. + * @param __SOURCE__ specifies the SAI1 clock source. + * This parameter can be one of the following values: + * @arg RCC_SAI1CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI1 clock. + * @arg RCC_SAI1CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI1 clock. + * @arg RCC_SAI1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI1 clock. + * @arg RCC_SAI1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 clock. + */ +#define __HAL_RCC_SAI1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1SRC, (__SOURCE__))) + +/** @brief Macro to Get SAI1 clock source selection. + * @note This configuration is only available with STM32F446xx Devices. + * @retval The clock source can be one of the following values: + * @arg RCC_SAI1CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI1 clock. + * @arg RCC_SAI1CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI1 clock. + * @arg RCC_SAI1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI1 clock. + * @arg RCC_SAI1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 clock. + */ +#define __HAL_RCC_GET_SAI1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1SRC)) + +/** @brief Macro to configure SAI2 clock source selection. + * @note This configuration is only available with STM32F446xx Devices. + * @note This function must be called before enabling PLL, PLLSAI, PLLI2S and + * the SAI clock. + * @param __SOURCE__ specifies the SAI2 clock source. + * This parameter can be one of the following values: + * @arg RCC_SAI2CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI2 clock. + * @arg RCC_SAI2CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI2 clock. + * @arg RCC_SAI2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI2 clock. + * @arg RCC_SAI2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL Source clock used as SAI2 clock. + */ +#define __HAL_RCC_SAI2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI2SRC, (__SOURCE__))) + +/** @brief Macro to Get SAI2 clock source selection. + * @note This configuration is only available with STM32F446xx Devices. + * @retval The clock source can be one of the following values: + * @arg RCC_SAI2CLKSOURCE_PLLI2S: PLLI2S_Q clock divided by PLLI2SDIVQ used as SAI2 clock. + * @arg RCC_SAI2CLKSOURCE_PLLSAI: PLLISAI_Q clock divided by PLLSAIDIVQ used as SAI2 clock. + * @arg RCC_SAI2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI2 clock. + * @arg RCC_SAI2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL Source clock used as SAI2 clock. + */ +#define __HAL_RCC_GET_SAI2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI2SRC)) + +/** @brief Macro to configure I2S APB1 clock source selection. + * @note This function must be called before enabling PLL, PLLI2S and the I2S clock. + * @param __SOURCE__ specifies the I2S APB1 clock source. + * This parameter can be one of the following values: + * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. + * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB1 clock. + * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB1 clock. + * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_I2S_APB1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC, (__SOURCE__))) + +/** @brief Macro to Get I2S APB1 clock source selection. + * @retval The clock source can be one of the following values: + * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. + * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB1 clock. + * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB1 clock. + * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_GET_I2S_APB1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC)) + +/** @brief Macro to configure I2S APB2 clock source selection. + * @note This function must be called before enabling PLL, PLLI2S and the I2S clock. + * @param __SOURCE__ specifies the SAI Block A clock source. + * This parameter can be one of the following values: + * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. + * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB2 clock. + * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB2 clock. + * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_I2S_APB2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC, (__SOURCE__))) + +/** @brief Macro to Get I2S APB2 clock source selection. + * @retval The clock source can be one of the following values: + * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. + * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB2 clock. + * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB2 clock. + * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_GET_I2S_APB2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC)) + +/** @brief Macro to configure the CEC clock. + * @param __SOURCE__ specifies the CEC clock source. + * This parameter can be one of the following values: + * @arg RCC_CECCLKSOURCE_HSI: HSI selected as CEC clock + * @arg RCC_CECCLKSOURCE_LSE: LSE selected as CEC clock + */ +#define __HAL_RCC_CEC_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CECSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the CEC clock. + * @retval The clock source can be one of the following values: + * @arg RCC_CECCLKSOURCE_HSI488: HSI selected as CEC clock + * @arg RCC_CECCLKSOURCE_LSE: LSE selected as CEC clock + */ +#define __HAL_RCC_GET_CEC_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CECSEL)) + +/** @brief Macro to configure the FMPI2C1 clock. + * @param __SOURCE__ specifies the FMPI2C1 clock source. + * This parameter can be one of the following values: + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock + */ +#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the FMPI2C1 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock + */ +#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) + +/** @brief Macro to configure the CLK48 clock. + * @param __SOURCE__ specifies the CLK48 clock source. + * This parameter can be one of the following values: + * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. + * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. + */ +#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the CLK48 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. + * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. + */ +#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL)) + +/** @brief Macro to configure the SDIO clock. + * @param __SOURCE__ specifies the SDIO clock source. + * This parameter can be one of the following values: + * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. + * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. + */ +#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the SDIO clock. + * @retval The clock source can be one of the following values: + * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. + * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. + */ +#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL)) + +/** @brief Macro to configure the SPDIFRX clock. + * @param __SOURCE__ specifies the SPDIFRX clock source. + * This parameter can be one of the following values: + * @arg RCC_SPDIFRXCLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SPDIFRX clock. + * @arg RCC_SPDIFRXCLKSOURCE_PLLI2SP: PLLI2S VCO Output divided by PLLI2SP used as SPDIFRX clock. + */ +#define __HAL_RCC_SPDIFRX_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SPDIFRXSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the SPDIFRX clock. + * @retval The clock source can be one of the following values: + * @arg RCC_SPDIFRXCLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SPDIFRX clock. + * @arg RCC_SPDIFRXCLKSOURCE_PLLI2SP: PLLI2S VCO Output divided by PLLI2SP used as SPDIFRX clock. + */ +#define __HAL_RCC_GET_SPDIFRX_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SPDIFRXSEL)) +#endif /* STM32F446xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) + +/** @brief Macro to configure the CLK48 clock. + * @param __SOURCE__ specifies the CLK48 clock source. + * This parameter can be one of the following values: + * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. + * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. + */ +#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the CLK48 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. + * @arg RCC_CLK48CLKSOURCE_PLLSAIP: PLLSAI VCO Output divided by PLLSAIP used as CLK48 clock. + */ +#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL)) + +/** @brief Macro to configure the SDIO clock. + * @param __SOURCE__ specifies the SDIO clock source. + * This parameter can be one of the following values: + * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. + * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. + */ +#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SDIOSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the SDIO clock. + * @retval The clock source can be one of the following values: + * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. + * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. + */ +#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SDIOSEL)) + +/** @brief Macro to configure the DSI clock. + * @param __SOURCE__ specifies the DSI clock source. + * This parameter can be one of the following values: + * @arg RCC_DSICLKSOURCE_PLLR: PLLR output used as DSI clock. + * @arg RCC_DSICLKSOURCE_DSIPHY: DSI-PHY output used as DSI clock. + */ +#define __HAL_RCC_DSI_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_DSISEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the DSI clock. + * @retval The clock source can be one of the following values: + * @arg RCC_DSICLKSOURCE_PLLR: PLLR output used as DSI clock. + * @arg RCC_DSICLKSOURCE_DSIPHY: DSI-PHY output used as DSI clock. + */ +#define __HAL_RCC_GET_DSI_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_DSISEL)) + +#endif /* STM32F469xx || STM32F479xx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) +/** @brief Macro to configure the DFSDM1 clock. + * @param __DFSDM1_CLKSOURCE__ specifies the DFSDM1 clock source. + * This parameter can be one of the following values: + * @arg RCC_DFSDM1CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. + * @arg RCC_DFSDM1CLKSOURCE_SYSCLK: System clock used as kernel clock. + * @retval None + */ +#define __HAL_RCC_DFSDM1_CONFIG(__DFSDM1_CLKSOURCE__) MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, (__DFSDM1_CLKSOURCE__)) + +/** @brief Macro to get the DFSDM1 clock source. + * @retval The clock source can be one of the following values: + * @arg RCC_DFSDM1CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. + * @arg RCC_DFSDM1CLKSOURCE_SYSCLK: System clock used as kernel clock. + */ +#define __HAL_RCC_GET_DFSDM1_SOURCE() ((uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL))) + +/** @brief Macro to configure DFSDM1 Audio clock source selection. + * @note This configuration is only available with STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/ + STM32F413xx/STM32F423xx Devices. + * @param __SOURCE__ specifies the DFSDM1 Audio clock source. + * This parameter can be one of the following values: + * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock + * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock + */ +#define __HAL_RCC_DFSDM1AUDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1ASEL, (__SOURCE__))) + +/** @brief Macro to Get DFSDM1 Audio clock source selection. + * @note This configuration is only available with STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/ + STM32F413xx/STM32F423xx Devices. + * @retval The clock source can be one of the following values: + * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock + * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock + */ +#define __HAL_RCC_GET_DFSDM1AUDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1ASEL)) + +#if defined(STM32F413xx) || defined(STM32F423xx) +/** @brief Macro to configure the DFSDM2 clock. + * @param __DFSDM2_CLKSOURCE__ specifies the DFSDM1 clock source. + * This parameter can be one of the following values: + * @arg RCC_DFSDM2CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. + * @arg RCC_DFSDM2CLKSOURCE_SYSCLK: System clock used as kernel clock. + * @retval None + */ +#define __HAL_RCC_DFSDM2_CONFIG(__DFSDM2_CLKSOURCE__) MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, (__DFSDM2_CLKSOURCE__)) + +/** @brief Macro to get the DFSDM2 clock source. + * @retval The clock source can be one of the following values: + * @arg RCC_DFSDM2CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. + * @arg RCC_DFSDM2CLKSOURCE_SYSCLK: System clock used as kernel clock. + */ +#define __HAL_RCC_GET_DFSDM2_SOURCE() ((uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL))) + +/** @brief Macro to configure DFSDM1 Audio clock source selection. + * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. + * @param __SOURCE__ specifies the DFSDM2 Audio clock source. + * This parameter can be one of the following values: + * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock + * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock + */ +#define __HAL_RCC_DFSDM2AUDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM2ASEL, (__SOURCE__))) + +/** @brief Macro to Get DFSDM2 Audio clock source selection. + * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. + * @retval The clock source can be one of the following values: + * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock + * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock + */ +#define __HAL_RCC_GET_DFSDM2AUDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM2ASEL)) + +/** @brief Macro to configure SAI1BlockA clock source selection. + * @note The SAI peripheral is only available with STM32F413xx/STM32F423xx Devices. + * @note This function must be called before enabling PLLSAI, PLLI2S and + * the SAI clock. + * @param __SOURCE__ specifies the SAI Block A clock source. + * This parameter can be one of the following values: + * @arg RCC_SAIACLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_EXT: External clock mapped on the I2S_CKIN pinused as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC, (__SOURCE__))) + +/** @brief Macro to Get SAI1 BlockA clock source selection. + * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. + * @retval The clock source can be one of the following values: + * @arg RCC_SAIACLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_EXT: External clock mapped on the I2S_CKIN pinused as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_GET_SAI_BLOCKA_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC)) + +/** @brief Macro to configure SAI1 BlockB clock source selection. + * @note The SAI peripheral is only available with STM32F413xx/STM32F423xx Devices. + * @note This function must be called before enabling PLLSAI, PLLI2S and + * the SAI clock. + * @param __SOURCE__ specifies the SAI Block B clock source. + * This parameter can be one of the following values: + * @arg RCC_SAIBCLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC, (__SOURCE__))) + +/** @brief Macro to Get SAI1 BlockB clock source selection. + * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. + * @retval The clock source can be one of the following values: + * @arg RCC_SAIBCLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_GET_SAI_BLOCKB_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC)) + +/** @brief Macro to configure the LPTIM1 clock. + * @param __SOURCE__ specifies the LPTIM1 clock source. + * This parameter can be one of the following values: + * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock + */ +#define __HAL_RCC_LPTIM1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the LPTIM1 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock + */ +#define __HAL_RCC_GET_LPTIM1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)) +#endif /* STM32F413xx || STM32F423xx */ + +/** @brief Macro to configure I2S APB1 clock source selection. + * @param __SOURCE__ specifies the I2S APB1 clock source. + * This parameter can be one of the following values: + * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. + * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. + * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_I2S_APB1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC, (__SOURCE__))) + +/** @brief Macro to Get I2S APB1 clock source selection. + * @retval The clock source can be one of the following values: + * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. + * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. + * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_GET_I2S_APB1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC)) + +/** @brief Macro to configure I2S APB2 clock source selection. + * @param __SOURCE__ specifies the I2S APB2 clock source. + * This parameter can be one of the following values: + * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. + * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. + * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_I2S_APB2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC, (__SOURCE__))) + +/** @brief Macro to Get I2S APB2 clock source selection. + * @retval The clock source can be one of the following values: + * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. + * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. + * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_GET_I2S_APB2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC)) + +/** @brief Macro to configure the PLL I2S clock source (PLLI2SCLK). + * @note This macro must be called before enabling the I2S APB clock. + * @param __SOURCE__ specifies the I2S clock source. + * This parameter can be one of the following values: + * @arg RCC_PLLI2SCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + * @arg RCC_PLLI2SCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin + * used as I2S clock source. + */ +#define __HAL_RCC_PLL_I2S_CONFIG(__SOURCE__) (*(__IO uint32_t *) RCC_PLLI2SCFGR_PLLI2SSRC_BB = (__SOURCE__)) + +/** @brief Macro to configure the FMPI2C1 clock. + * @param __SOURCE__ specifies the FMPI2C1 clock source. + * This parameter can be one of the following values: + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock + */ +#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the FMPI2C1 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock + */ +#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) + +/** @brief Macro to configure the CLK48 clock. + * @param __SOURCE__ specifies the CLK48 clock source. + * This parameter can be one of the following values: + * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. + * @arg RCC_CLK48CLKSOURCE_PLLI2SQ: PLLI2S VCO Output divided by PLLI2SQ used as CLK48 clock. + */ +#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the CLK48 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. + * @arg RCC_CLK48CLKSOURCE_PLLI2SQ: PLLI2S VCO Output divided by PLLI2SQ used as CLK48 clock + */ +#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL)) + +/** @brief Macro to configure the SDIO clock. + * @param __SOURCE__ specifies the SDIO clock source. + * This parameter can be one of the following values: + * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. + * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. + */ +#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the SDIO clock. + * @retval The clock source can be one of the following values: + * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. + * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. + */ +#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL)) + +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** @brief Macro to configure I2S clock source selection. + * @param __SOURCE__ specifies the I2S clock source. + * This parameter can be one of the following values: + * @arg RCC_I2SAPBCLKSOURCE_PLLR: PLL VCO output clock divided by PLLR. + * @arg RCC_I2SAPBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPBCLKSOURCE_PLLSRC: HSI/HSE depends on PLLSRC. + */ +#define __HAL_RCC_I2S_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2SSRC, (__SOURCE__))) + +/** @brief Macro to Get I2S clock source selection. + * @retval The clock source can be one of the following values: + * @arg RCC_I2SAPBCLKSOURCE_PLLR: PLL VCO output clock divided by PLLR. + * @arg RCC_I2SAPBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPBCLKSOURCE_PLLSRC: HSI/HSE depends on PLLSRC. + */ +#define __HAL_RCC_GET_I2S_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2SSRC)) + +/** @brief Macro to configure the FMPI2C1 clock. + * @param __SOURCE__ specifies the FMPI2C1 clock source. + * This parameter can be one of the following values: + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock + */ +#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the FMPI2C1 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock + */ +#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) + +/** @brief Macro to configure the LPTIM1 clock. + * @param __SOURCE__ specifies the LPTIM1 clock source. + * This parameter can be one of the following values: + * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK1 selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock + */ +#define __HAL_RCC_LPTIM1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the LPTIM1 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK1 selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock + */ +#define __HAL_RCC_GET_LPTIM1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @brief Macro to configure the Timers clocks prescalers + * @note This feature is only available with STM32F429x/439x Devices. + * @param __PRESC__ specifies the Timers clocks prescalers selection + * This parameter can be one of the following values: + * @arg RCC_TIMPRES_DESACTIVATED: The Timers kernels clocks prescaler is + * equal to HPRE if PPREx is corresponding to division by 1 or 2, + * else it is equal to [(HPRE * PPREx) / 2] if PPREx is corresponding to + * division by 4 or more. + * @arg RCC_TIMPRES_ACTIVATED: The Timers kernels clocks prescaler is + * equal to HPRE if PPREx is corresponding to division by 1, 2 or 4, + * else it is equal to [(HPRE * PPREx) / 4] if PPREx is corresponding + * to division by 8 or more. + */ +#define __HAL_RCC_TIMCLKPRESCALER(__PRESC__) (*(__IO uint32_t *) RCC_DCKCFGR_TIMPRE_BB = (__PRESC__)) + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx) || STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE ||\ + STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx ||\ + STM32F423xx */ + +/*----------------------------------------------------------------------------*/ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Enable PLLSAI_RDY interrupt. + */ +#define __HAL_RCC_PLLSAI_ENABLE_IT() (RCC->CIR |= (RCC_CIR_PLLSAIRDYIE)) + +/** @brief Disable PLLSAI_RDY interrupt. + */ +#define __HAL_RCC_PLLSAI_DISABLE_IT() (RCC->CIR &= ~(RCC_CIR_PLLSAIRDYIE)) + +/** @brief Clear the PLLSAI RDY interrupt pending bits. + */ +#define __HAL_RCC_PLLSAI_CLEAR_IT() (RCC->CIR |= (RCC_CIR_PLLSAIRDYF)) + +/** @brief Check the PLLSAI RDY interrupt has occurred or not. + * @retval The new state (TRUE or FALSE). + */ +#define __HAL_RCC_PLLSAI_GET_IT() ((RCC->CIR & (RCC_CIR_PLLSAIRDYIE)) == (RCC_CIR_PLLSAIRDYIE)) + +/** @brief Check PLLSAI RDY flag is set or not. + * @retval The new state (TRUE or FALSE). + */ +#define __HAL_RCC_PLLSAI_GET_FLAG() ((RCC->CR & (RCC_CR_PLLSAIRDY)) == (RCC_CR_PLLSAIRDY)) + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** @brief Macros to enable or disable the RCC MCO1 feature. + */ +#define __HAL_RCC_MCO1_ENABLE() (*(__IO uint32_t *) RCC_CFGR_MCO1EN_BB = ENABLE) +#define __HAL_RCC_MCO1_DISABLE() (*(__IO uint32_t *) RCC_CFGR_MCO1EN_BB = DISABLE) + +/** @brief Macros to enable or disable the RCC MCO2 feature. + */ +#define __HAL_RCC_MCO2_ENABLE() (*(__IO uint32_t *) RCC_CFGR_MCO2EN_BB = ENABLE) +#define __HAL_RCC_MCO2_DISABLE() (*(__IO uint32_t *) RCC_CFGR_MCO2EN_BB = DISABLE) + +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup RCCEx_Exported_Functions + * @{ + */ + +/** @addtogroup RCCEx_Exported_Functions_Group1 + * @{ + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit); +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit); + +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk); + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ + defined(STM32F423xx) +void HAL_RCCEx_SelectLSEMode(uint8_t Mode); +#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ +#if defined(RCC_PLLI2S_SUPPORT) +HAL_StatusTypeDef HAL_RCCEx_EnablePLLI2S(RCC_PLLI2SInitTypeDef *PLLI2SInit); +HAL_StatusTypeDef HAL_RCCEx_DisablePLLI2S(void); +#endif /* RCC_PLLI2S_SUPPORT */ +#if defined(RCC_PLLSAI_SUPPORT) +HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI(RCC_PLLSAIInitTypeDef *PLLSAIInit); +HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI(void); +#endif /* RCC_PLLSAI_SUPPORT */ +/** + * @} + */ + +/** + * @} + */ +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup RCCEx_Private_Constants RCCEx Private Constants + * @{ + */ + +/** @defgroup RCCEx_BitAddress_AliasRegion RCC BitAddress AliasRegion + * @brief RCC registers bit address in the alias region + * @{ + */ +/* --- CR Register ---*/ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/* Alias word address of PLLSAION bit */ +#define RCC_PLLSAION_BIT_NUMBER 0x1CU +#define RCC_CR_PLLSAION_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLSAION_BIT_NUMBER * 4U)) + +#define PLLSAI_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/* Alias word address of PLLI2SON bit */ +#define RCC_PLLI2SON_BIT_NUMBER 0x1AU +#define RCC_CR_PLLI2SON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLI2SON_BIT_NUMBER * 4U)) +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || + STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +/* --- DCKCFGR Register ---*/ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F401xC) ||\ + defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/* Alias word address of TIMPRE bit */ +#define RCC_DCKCFGR_OFFSET (RCC_OFFSET + 0x8CU) +#define RCC_TIMPRE_BIT_NUMBER 0x18U +#define RCC_DCKCFGR_TIMPRE_BB (PERIPH_BB_BASE + (RCC_DCKCFGR_OFFSET * 32U) + (RCC_TIMPRE_BIT_NUMBER * 4U)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F410xx || STM32F401xC ||\ + STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ + STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +/* --- CFGR Register ---*/ +#define RCC_CFGR_OFFSET (RCC_OFFSET + 0x08U) +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) +/* Alias word address of I2SSRC bit */ +#define RCC_I2SSRC_BIT_NUMBER 0x17U +#define RCC_CFGR_I2SSRC_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_I2SSRC_BIT_NUMBER * 4U)) + +#define PLLI2S_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) +/* --- PLLI2SCFGR Register ---*/ +#define RCC_PLLI2SCFGR_OFFSET (RCC_OFFSET + 0x84U) +/* Alias word address of PLLI2SSRC bit */ +#define RCC_PLLI2SSRC_BIT_NUMBER 0x16U +#define RCC_PLLI2SCFGR_PLLI2SSRC_BB (PERIPH_BB_BASE\ + + (RCC_PLLI2SCFGR_OFFSET * 32U) + (RCC_PLLI2SSRC_BIT_NUMBER * 4U)) + +#define PLLI2S_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx | STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/* Alias word address of MCO1EN bit */ +#define RCC_MCO1EN_BIT_NUMBER 0x8U +#define RCC_CFGR_MCO1EN_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_MCO1EN_BIT_NUMBER * 4U)) + +/* Alias word address of MCO2EN bit */ +#define RCC_MCO2EN_BIT_NUMBER 0x9U +#define RCC_CFGR_MCO2EN_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_MCO2EN_BIT_NUMBER * 4U)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#define PLL_TIMEOUT_VALUE 2U /* 2 ms */ +/** + * @} + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup RCCEx_Private_Macros RCCEx Private Macros + * @{ + */ +/** @defgroup RCCEx_IS_RCC_Definitions RCC Private macros to check input parameters + * @{ + */ +#define IS_RCC_PLLN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) +#define IS_RCC_PLLI2SN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000007FU)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00000007U)) +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000000FU)) +#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000001FU)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F446xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00000FFFU)) +#endif /* STM32F446xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x000001FFU)) +#endif /* STM32F469xx || STM32F479xx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x000003FFU)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ + +#if defined(STM32F413xx) || defined(STM32F423xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00007FFFU)) +#endif /* STM32F413xx || STM32F423xx */ + +#define IS_RCC_PLLI2SR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define IS_RCC_PLLI2SQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) + +#define IS_RCC_PLLSAIN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) + +#define IS_RCC_PLLSAIQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) + +#define IS_RCC_PLLSAIR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#define IS_RCC_PLLSAI_DIVQ_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) + +#define IS_RCC_PLLI2S_DIVQ_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) + +#define IS_RCC_PLLSAI_DIVR_VALUE(VALUE) (((VALUE) == RCC_PLLSAIDIVR_2) ||\ + ((VALUE) == RCC_PLLSAIDIVR_4) ||\ + ((VALUE) == RCC_PLLSAIDIVR_8) ||\ + ((VALUE) == RCC_PLLSAIDIVR_16)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +#define IS_RCC_PLLI2SM_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 63U)) + +#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ + ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) +#endif /* STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ + ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) + +#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) + +#define IS_RCC_LPTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_LPTIM1CLKSOURCE_PCLK1) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_HSI) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSI) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSE)) + +#define IS_RCC_I2SAPBCLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPBCLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_I2SAPBCLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_I2SAPBCLKSOURCE_PLLSRC)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F446xx) +#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#define IS_RCC_PLLI2SP_VALUE(VALUE) (((VALUE) == RCC_PLLI2SP_DIV2) ||\ + ((VALUE) == RCC_PLLI2SP_DIV4) ||\ + ((VALUE) == RCC_PLLI2SP_DIV6) ||\ + ((VALUE) == RCC_PLLI2SP_DIV8)) + +#define IS_RCC_PLLSAIM_VALUE(VALUE) ((VALUE) <= 63U) + +#define IS_RCC_PLLSAIP_VALUE(VALUE) (((VALUE) == RCC_PLLSAIP_DIV2) ||\ + ((VALUE) == RCC_PLLSAIP_DIV4) ||\ + ((VALUE) == RCC_PLLSAIP_DIV6) ||\ + ((VALUE) == RCC_PLLSAIP_DIV8)) + +#define IS_RCC_SAI1CLKSOURCE(SOURCE) (((SOURCE) == RCC_SAI1CLKSOURCE_PLLSAI) ||\ + ((SOURCE) == RCC_SAI1CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_SAI1CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_SAI1CLKSOURCE_EXT)) + +#define IS_RCC_SAI2CLKSOURCE(SOURCE) (((SOURCE) == RCC_SAI2CLKSOURCE_PLLSAI) ||\ + ((SOURCE) == RCC_SAI2CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_SAI2CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_SAI2CLKSOURCE_PLLSRC)) + +#define IS_RCC_I2SAPB1CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLSRC)) + +#define IS_RCC_I2SAPB2CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLSRC)) + +#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) + +#define IS_RCC_CECCLKSOURCE(SOURCE) (((SOURCE) == RCC_CECCLKSOURCE_HSI) ||\ + ((SOURCE) == RCC_CECCLKSOURCE_LSE)) + +#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ + ((SOURCE) == RCC_CLK48CLKSOURCE_PLLSAIP)) + +#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ + ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) + +#define IS_RCC_SPDIFRXCLKSOURCE(SOURCE) (((SOURCE) == RCC_SPDIFRXCLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_SPDIFRXCLKSOURCE_PLLI2SP)) +#endif /* STM32F446xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#define IS_RCC_PLLSAIP_VALUE(VALUE) (((VALUE) == RCC_PLLSAIP_DIV2) ||\ + ((VALUE) == RCC_PLLSAIP_DIV4) ||\ + ((VALUE) == RCC_PLLSAIP_DIV6) ||\ + ((VALUE) == RCC_PLLSAIP_DIV8)) + +#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ + ((SOURCE) == RCC_CLK48CLKSOURCE_PLLSAIP)) + +#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ + ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) + +#define IS_RCC_DSIBYTELANECLKSOURCE(SOURCE) (((SOURCE) == RCC_DSICLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_DSICLKSOURCE_DSIPHY)) + +#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ + ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) +#endif /* STM32F469xx || STM32F479xx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) +#define IS_RCC_PLLI2SQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) + +#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#define IS_RCC_PLLI2SCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_PLLI2SCLKSOURCE_PLLSRC) || \ + ((__SOURCE__) == RCC_PLLI2SCLKSOURCE_EXT)) + +#define IS_RCC_I2SAPB1CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLSRC)) + +#define IS_RCC_I2SAPB2CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLSRC)) + +#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) + +#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ + ((SOURCE) == RCC_CLK48CLKSOURCE_PLLI2SQ)) + +#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ + ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) + +#define IS_RCC_DFSDM1CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM1CLKSOURCE_PCLK2) || \ + ((__SOURCE__) == RCC_DFSDM1CLKSOURCE_SYSCLK)) + +#define IS_RCC_DFSDM1AUDIOCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_I2S1) || \ + ((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_I2S2)) + +#if defined(STM32F413xx) || defined(STM32F423xx) +#define IS_RCC_DFSDM2CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM2CLKSOURCE_PCLK2) || \ + ((__SOURCE__) == RCC_DFSDM2CLKSOURCE_SYSCLK)) + +#define IS_RCC_DFSDM2AUDIOCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM2AUDIOCLKSOURCE_I2S1) || \ + ((__SOURCE__) == RCC_DFSDM2AUDIOCLKSOURCE_I2S2)) + +#define IS_RCC_LPTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_LPTIM1CLKSOURCE_PCLK1) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_HSI) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSI) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSE)) + +#define IS_RCC_SAIACLKSOURCE(SOURCE) (((SOURCE) == RCC_SAIACLKSOURCE_PLLI2SR) ||\ + ((SOURCE) == RCC_SAIACLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_SAIACLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_SAIACLKSOURCE_PLLSRC)) + +#define IS_RCC_SAIBCLKSOURCE(SOURCE) (((SOURCE) == RCC_SAIBCLKSOURCE_PLLI2SR) ||\ + ((SOURCE) == RCC_SAIBCLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_SAIBCLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_SAIBCLKSOURCE_PLLSRC)) + +#define IS_RCC_PLL_DIVR_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) + +#define IS_RCC_PLLI2S_DIVR_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) + +#endif /* STM32F413xx || STM32F423xx */ +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + +#define IS_RCC_MCO2SOURCE(SOURCE) (((SOURCE) == RCC_MCO2SOURCE_SYSCLK) || ((SOURCE) == RCC_MCO2SOURCE_PLLI2SCLK)|| \ + ((SOURCE) == RCC_MCO2SOURCE_HSE) || ((SOURCE) == RCC_MCO2SOURCE_PLLCLK)) + +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || \ + STM32F412Rx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define IS_RCC_MCO2SOURCE(SOURCE) (((SOURCE) == RCC_MCO2SOURCE_SYSCLK) || ((SOURCE) == RCC_MCO2SOURCE_I2SCLK)|| \ + ((SOURCE) == RCC_MCO2SOURCE_HSE) || ((SOURCE) == RCC_MCO2SOURCE_PLLCLK)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_RCC_EX_H */ + diff --git a/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h new file mode 100644 index 0000000..84d1b51 --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h @@ -0,0 +1,733 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_spi.h + * @author MCD Application Team + * @brief Header file of SPI HAL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32F4xx_HAL_SPI_H +#define STM32F4xx_HAL_SPI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup SPI + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup SPI_Exported_Types SPI Exported Types + * @{ + */ + +/** + * @brief SPI Configuration Structure definition + */ +typedef struct +{ + uint32_t Mode; /*!< Specifies the SPI operating mode. + This parameter can be a value of @ref SPI_Mode */ + + uint32_t Direction; /*!< Specifies the SPI bidirectional mode state. + This parameter can be a value of @ref SPI_Direction */ + + uint32_t DataSize; /*!< Specifies the SPI data size. + This parameter can be a value of @ref SPI_Data_Size */ + + uint32_t CLKPolarity; /*!< Specifies the serial clock steady state. + This parameter can be a value of @ref SPI_Clock_Polarity */ + + uint32_t CLKPhase; /*!< Specifies the clock active edge for the bit capture. + This parameter can be a value of @ref SPI_Clock_Phase */ + + uint32_t NSS; /*!< Specifies whether the NSS signal is managed by + hardware (NSS pin) or by software using the SSI bit. + This parameter can be a value of @ref SPI_Slave_Select_management */ + + uint32_t BaudRatePrescaler; /*!< Specifies the Baud Rate prescaler value which will be + used to configure the transmit and receive SCK clock. + This parameter can be a value of @ref SPI_BaudRate_Prescaler + @note The communication clock is derived from the master + clock. The slave clock does not need to be set. */ + + uint32_t FirstBit; /*!< Specifies whether data transfers start from MSB or LSB bit. + This parameter can be a value of @ref SPI_MSB_LSB_transmission */ + + uint32_t TIMode; /*!< Specifies if the TI mode is enabled or not. + This parameter can be a value of @ref SPI_TI_mode */ + + uint32_t CRCCalculation; /*!< Specifies if the CRC calculation is enabled or not. + This parameter can be a value of @ref SPI_CRC_Calculation */ + + uint32_t CRCPolynomial; /*!< Specifies the polynomial used for the CRC calculation. + This parameter must be an odd number between Min_Data = 1 and Max_Data = 65535 */ +} SPI_InitTypeDef; + +/** + * @brief HAL SPI State structure definition + */ +typedef enum +{ + HAL_SPI_STATE_RESET = 0x00U, /*!< Peripheral not Initialized */ + HAL_SPI_STATE_READY = 0x01U, /*!< Peripheral Initialized and ready for use */ + HAL_SPI_STATE_BUSY = 0x02U, /*!< an internal process is ongoing */ + HAL_SPI_STATE_BUSY_TX = 0x03U, /*!< Data Transmission process is ongoing */ + HAL_SPI_STATE_BUSY_RX = 0x04U, /*!< Data Reception process is ongoing */ + HAL_SPI_STATE_BUSY_TX_RX = 0x05U, /*!< Data Transmission and Reception process is ongoing */ + HAL_SPI_STATE_ERROR = 0x06U, /*!< SPI error state */ + HAL_SPI_STATE_ABORT = 0x07U /*!< SPI abort is ongoing */ +} HAL_SPI_StateTypeDef; + +/** + * @brief SPI handle Structure definition + */ +typedef struct __SPI_HandleTypeDef +{ + SPI_TypeDef *Instance; /*!< SPI registers base address */ + + SPI_InitTypeDef Init; /*!< SPI communication parameters */ + + const uint8_t *pTxBuffPtr; /*!< Pointer to SPI Tx transfer Buffer */ + + uint16_t TxXferSize; /*!< SPI Tx Transfer size */ + + __IO uint16_t TxXferCount; /*!< SPI Tx Transfer Counter */ + + uint8_t *pRxBuffPtr; /*!< Pointer to SPI Rx transfer Buffer */ + + uint16_t RxXferSize; /*!< SPI Rx Transfer size */ + + __IO uint16_t RxXferCount; /*!< SPI Rx Transfer Counter */ + + void (*RxISR)(struct __SPI_HandleTypeDef *hspi); /*!< function pointer on Rx ISR */ + + void (*TxISR)(struct __SPI_HandleTypeDef *hspi); /*!< function pointer on Tx ISR */ + + DMA_HandleTypeDef *hdmatx; /*!< SPI Tx DMA Handle parameters */ + + DMA_HandleTypeDef *hdmarx; /*!< SPI Rx DMA Handle parameters */ + + HAL_LockTypeDef Lock; /*!< Locking object */ + + __IO HAL_SPI_StateTypeDef State; /*!< SPI communication state */ + + __IO uint32_t ErrorCode; /*!< SPI Error code */ + +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + void (* TxCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Tx Completed callback */ + void (* RxCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Rx Completed callback */ + void (* TxRxCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI TxRx Completed callback */ + void (* TxHalfCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Tx Half Completed callback */ + void (* RxHalfCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Rx Half Completed callback */ + void (* TxRxHalfCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI TxRx Half Completed callback */ + void (* ErrorCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Error callback */ + void (* AbortCpltCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Abort callback */ + void (* MspInitCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Msp Init callback */ + void (* MspDeInitCallback)(struct __SPI_HandleTypeDef *hspi); /*!< SPI Msp DeInit callback */ + +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +} SPI_HandleTypeDef; + +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +/** + * @brief HAL SPI Callback ID enumeration definition + */ +typedef enum +{ + HAL_SPI_TX_COMPLETE_CB_ID = 0x00U, /*!< SPI Tx Completed callback ID */ + HAL_SPI_RX_COMPLETE_CB_ID = 0x01U, /*!< SPI Rx Completed callback ID */ + HAL_SPI_TX_RX_COMPLETE_CB_ID = 0x02U, /*!< SPI TxRx Completed callback ID */ + HAL_SPI_TX_HALF_COMPLETE_CB_ID = 0x03U, /*!< SPI Tx Half Completed callback ID */ + HAL_SPI_RX_HALF_COMPLETE_CB_ID = 0x04U, /*!< SPI Rx Half Completed callback ID */ + HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID = 0x05U, /*!< SPI TxRx Half Completed callback ID */ + HAL_SPI_ERROR_CB_ID = 0x06U, /*!< SPI Error callback ID */ + HAL_SPI_ABORT_CB_ID = 0x07U, /*!< SPI Abort callback ID */ + HAL_SPI_MSPINIT_CB_ID = 0x08U, /*!< SPI Msp Init callback ID */ + HAL_SPI_MSPDEINIT_CB_ID = 0x09U /*!< SPI Msp DeInit callback ID */ + +} HAL_SPI_CallbackIDTypeDef; + +/** + * @brief HAL SPI Callback pointer definition + */ +typedef void (*pSPI_CallbackTypeDef)(SPI_HandleTypeDef *hspi); /*!< pointer to an SPI callback function */ + +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup SPI_Exported_Constants SPI Exported Constants + * @{ + */ + +/** @defgroup SPI_Error_Code SPI Error Code + * @{ + */ +#define HAL_SPI_ERROR_NONE (0x00000000U) /*!< No error */ +#define HAL_SPI_ERROR_MODF (0x00000001U) /*!< MODF error */ +#define HAL_SPI_ERROR_CRC (0x00000002U) /*!< CRC error */ +#define HAL_SPI_ERROR_OVR (0x00000004U) /*!< OVR error */ +#define HAL_SPI_ERROR_FRE (0x00000008U) /*!< FRE error */ +#define HAL_SPI_ERROR_DMA (0x00000010U) /*!< DMA transfer error */ +#define HAL_SPI_ERROR_FLAG (0x00000020U) /*!< Error on RXNE/TXE/BSY Flag */ +#define HAL_SPI_ERROR_ABORT (0x00000040U) /*!< Error during SPI Abort procedure */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +#define HAL_SPI_ERROR_INVALID_CALLBACK (0x00000080U) /*!< Invalid Callback error */ +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +/** + * @} + */ + +/** @defgroup SPI_Mode SPI Mode + * @{ + */ +#define SPI_MODE_SLAVE (0x00000000U) +#define SPI_MODE_MASTER (SPI_CR1_MSTR | SPI_CR1_SSI) +/** + * @} + */ + +/** @defgroup SPI_Direction SPI Direction Mode + * @{ + */ +#define SPI_DIRECTION_2LINES (0x00000000U) +#define SPI_DIRECTION_2LINES_RXONLY SPI_CR1_RXONLY +#define SPI_DIRECTION_1LINE SPI_CR1_BIDIMODE +/** + * @} + */ + +/** @defgroup SPI_Data_Size SPI Data Size + * @{ + */ +#define SPI_DATASIZE_8BIT (0x00000000U) +#define SPI_DATASIZE_16BIT SPI_CR1_DFF +/** + * @} + */ + +/** @defgroup SPI_Clock_Polarity SPI Clock Polarity + * @{ + */ +#define SPI_POLARITY_LOW (0x00000000U) +#define SPI_POLARITY_HIGH SPI_CR1_CPOL +/** + * @} + */ + +/** @defgroup SPI_Clock_Phase SPI Clock Phase + * @{ + */ +#define SPI_PHASE_1EDGE (0x00000000U) +#define SPI_PHASE_2EDGE SPI_CR1_CPHA +/** + * @} + */ + +/** @defgroup SPI_Slave_Select_management SPI Slave Select Management + * @{ + */ +#define SPI_NSS_SOFT SPI_CR1_SSM +#define SPI_NSS_HARD_INPUT (0x00000000U) +#define SPI_NSS_HARD_OUTPUT (SPI_CR2_SSOE << 16U) +/** + * @} + */ + +/** @defgroup SPI_BaudRate_Prescaler SPI BaudRate Prescaler + * @{ + */ +#define SPI_BAUDRATEPRESCALER_2 (0x00000000U) +#define SPI_BAUDRATEPRESCALER_4 (SPI_CR1_BR_0) +#define SPI_BAUDRATEPRESCALER_8 (SPI_CR1_BR_1) +#define SPI_BAUDRATEPRESCALER_16 (SPI_CR1_BR_1 | SPI_CR1_BR_0) +#define SPI_BAUDRATEPRESCALER_32 (SPI_CR1_BR_2) +#define SPI_BAUDRATEPRESCALER_64 (SPI_CR1_BR_2 | SPI_CR1_BR_0) +#define SPI_BAUDRATEPRESCALER_128 (SPI_CR1_BR_2 | SPI_CR1_BR_1) +#define SPI_BAUDRATEPRESCALER_256 (SPI_CR1_BR_2 | SPI_CR1_BR_1 | SPI_CR1_BR_0) +/** + * @} + */ + +/** @defgroup SPI_MSB_LSB_transmission SPI MSB LSB Transmission + * @{ + */ +#define SPI_FIRSTBIT_MSB (0x00000000U) +#define SPI_FIRSTBIT_LSB SPI_CR1_LSBFIRST +/** + * @} + */ + +/** @defgroup SPI_TI_mode SPI TI Mode + * @{ + */ +#define SPI_TIMODE_DISABLE (0x00000000U) +#define SPI_TIMODE_ENABLE SPI_CR2_FRF +/** + * @} + */ + +/** @defgroup SPI_CRC_Calculation SPI CRC Calculation + * @{ + */ +#define SPI_CRCCALCULATION_DISABLE (0x00000000U) +#define SPI_CRCCALCULATION_ENABLE SPI_CR1_CRCEN +/** + * @} + */ + +/** @defgroup SPI_Interrupt_definition SPI Interrupt Definition + * @{ + */ +#define SPI_IT_TXE SPI_CR2_TXEIE +#define SPI_IT_RXNE SPI_CR2_RXNEIE +#define SPI_IT_ERR SPI_CR2_ERRIE +/** + * @} + */ + +/** @defgroup SPI_Flags_definition SPI Flags Definition + * @{ + */ +#define SPI_FLAG_RXNE SPI_SR_RXNE /* SPI status flag: Rx buffer not empty flag */ +#define SPI_FLAG_TXE SPI_SR_TXE /* SPI status flag: Tx buffer empty flag */ +#define SPI_FLAG_BSY SPI_SR_BSY /* SPI status flag: Busy flag */ +#define SPI_FLAG_CRCERR SPI_SR_CRCERR /* SPI Error flag: CRC error flag */ +#define SPI_FLAG_MODF SPI_SR_MODF /* SPI Error flag: Mode fault flag */ +#define SPI_FLAG_OVR SPI_SR_OVR /* SPI Error flag: Overrun flag */ +#define SPI_FLAG_FRE SPI_SR_FRE /* SPI Error flag: TI mode frame format error flag */ +#define SPI_FLAG_MASK (SPI_SR_RXNE | SPI_SR_TXE | SPI_SR_BSY | SPI_SR_CRCERR\ + | SPI_SR_MODF | SPI_SR_OVR | SPI_SR_FRE) +/** + * @} + */ + +/** + * @} + */ + +/* Exported macros -----------------------------------------------------------*/ +/** @defgroup SPI_Exported_Macros SPI Exported Macros + * @{ + */ + +/** @brief Reset SPI handle state. + * @param __HANDLE__ specifies the SPI Handle. + * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. + * @retval None + */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +#define __HAL_SPI_RESET_HANDLE_STATE(__HANDLE__) \ + do{ \ + (__HANDLE__)->State = HAL_SPI_STATE_RESET; \ + (__HANDLE__)->MspInitCallback = NULL; \ + (__HANDLE__)->MspDeInitCallback = NULL; \ + } while(0) +#else +#define __HAL_SPI_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_SPI_STATE_RESET) +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + +/** @brief Enable the specified SPI interrupts. + * @param __HANDLE__ specifies the SPI Handle. + * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. + * @param __INTERRUPT__ specifies the interrupt source to enable. + * This parameter can be one of the following values: + * @arg SPI_IT_TXE: Tx buffer empty interrupt enable + * @arg SPI_IT_RXNE: RX buffer not empty interrupt enable + * @arg SPI_IT_ERR: Error interrupt enable + * @retval None + */ +#define __HAL_SPI_ENABLE_IT(__HANDLE__, __INTERRUPT__) SET_BIT((__HANDLE__)->Instance->CR2, (__INTERRUPT__)) + +/** @brief Disable the specified SPI interrupts. + * @param __HANDLE__ specifies the SPI handle. + * This parameter can be SPIx where x: 1, 2, or 3 to select the SPI peripheral. + * @param __INTERRUPT__ specifies the interrupt source to disable. + * This parameter can be one of the following values: + * @arg SPI_IT_TXE: Tx buffer empty interrupt enable + * @arg SPI_IT_RXNE: RX buffer not empty interrupt enable + * @arg SPI_IT_ERR: Error interrupt enable + * @retval None + */ +#define __HAL_SPI_DISABLE_IT(__HANDLE__, __INTERRUPT__) CLEAR_BIT((__HANDLE__)->Instance->CR2, (__INTERRUPT__)) + +/** @brief Check whether the specified SPI interrupt source is enabled or not. + * @param __HANDLE__ specifies the SPI Handle. + * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. + * @param __INTERRUPT__ specifies the SPI interrupt source to check. + * This parameter can be one of the following values: + * @arg SPI_IT_TXE: Tx buffer empty interrupt enable + * @arg SPI_IT_RXNE: RX buffer not empty interrupt enable + * @arg SPI_IT_ERR: Error interrupt enable + * @retval The new state of __IT__ (TRUE or FALSE). + */ +#define __HAL_SPI_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->CR2\ + & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) + +/** @brief Check whether the specified SPI flag is set or not. + * @param __HANDLE__ specifies the SPI Handle. + * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. + * @param __FLAG__ specifies the flag to check. + * This parameter can be one of the following values: + * @arg SPI_FLAG_RXNE: Receive buffer not empty flag + * @arg SPI_FLAG_TXE: Transmit buffer empty flag + * @arg SPI_FLAG_CRCERR: CRC error flag + * @arg SPI_FLAG_MODF: Mode fault flag + * @arg SPI_FLAG_OVR: Overrun flag + * @arg SPI_FLAG_BSY: Busy flag + * @arg SPI_FLAG_FRE: Frame format error flag + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_SPI_GET_FLAG(__HANDLE__, __FLAG__) ((((__HANDLE__)->Instance->SR) & (__FLAG__)) == (__FLAG__)) + +/** @brief Clear the SPI CRCERR pending flag. + * @param __HANDLE__ specifies the SPI Handle. + * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. + * @retval None + */ +#define __HAL_SPI_CLEAR_CRCERRFLAG(__HANDLE__) ((__HANDLE__)->Instance->SR = (uint16_t)(~SPI_FLAG_CRCERR)) + +/** @brief Clear the SPI MODF pending flag. + * @param __HANDLE__ specifies the SPI Handle. + * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. + * @retval None + */ +#define __HAL_SPI_CLEAR_MODFFLAG(__HANDLE__) \ + do{ \ + __IO uint32_t tmpreg_modf = 0x00U; \ + tmpreg_modf = (__HANDLE__)->Instance->SR; \ + CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_SPE); \ + UNUSED(tmpreg_modf); \ + } while(0U) + +/** @brief Clear the SPI OVR pending flag. + * @param __HANDLE__ specifies the SPI Handle. + * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. + * @retval None + */ +#define __HAL_SPI_CLEAR_OVRFLAG(__HANDLE__) \ + do{ \ + __IO uint32_t tmpreg_ovr = 0x00U; \ + tmpreg_ovr = (__HANDLE__)->Instance->DR; \ + tmpreg_ovr = (__HANDLE__)->Instance->SR; \ + UNUSED(tmpreg_ovr); \ + } while(0U) + +/** @brief Clear the SPI FRE pending flag. + * @param __HANDLE__ specifies the SPI Handle. + * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. + * @retval None + */ +#define __HAL_SPI_CLEAR_FREFLAG(__HANDLE__) \ + do{ \ + __IO uint32_t tmpreg_fre = 0x00U; \ + tmpreg_fre = (__HANDLE__)->Instance->SR; \ + UNUSED(tmpreg_fre); \ + } while(0U) + +/** @brief Enable the SPI peripheral. + * @param __HANDLE__ specifies the SPI Handle. + * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. + * @retval None + */ +#define __HAL_SPI_ENABLE(__HANDLE__) SET_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_SPE) + +/** @brief Disable the SPI peripheral. + * @param __HANDLE__ specifies the SPI Handle. + * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. + * @retval None + */ +#define __HAL_SPI_DISABLE(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_SPE) + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup SPI_Private_Macros SPI Private Macros + * @{ + */ + +/** @brief Set the SPI transmit-only mode. + * @param __HANDLE__ specifies the SPI Handle. + * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. + * @retval None + */ +#define SPI_1LINE_TX(__HANDLE__) SET_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_BIDIOE) + +/** @brief Set the SPI receive-only mode. + * @param __HANDLE__ specifies the SPI Handle. + * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. + * @retval None + */ +#define SPI_1LINE_RX(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_BIDIOE) + +/** @brief Reset the CRC calculation of the SPI. + * @param __HANDLE__ specifies the SPI Handle. + * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. + * @retval None + */ +#define SPI_RESET_CRC(__HANDLE__) \ + do{ \ + CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_CRCEN); \ + SET_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_CRCEN); \ + } while(0U) + +/** @brief Check whether the specified SPI flag is set or not. + * @param __SR__ copy of SPI SR register. + * @param __FLAG__ specifies the flag to check. + * This parameter can be one of the following values: + * @arg SPI_FLAG_RXNE: Receive buffer not empty flag + * @arg SPI_FLAG_TXE: Transmit buffer empty flag + * @arg SPI_FLAG_CRCERR: CRC error flag + * @arg SPI_FLAG_MODF: Mode fault flag + * @arg SPI_FLAG_OVR: Overrun flag + * @arg SPI_FLAG_BSY: Busy flag + * @arg SPI_FLAG_FRE: Frame format error flag + * @retval SET or RESET. + */ +#define SPI_CHECK_FLAG(__SR__, __FLAG__) ((((__SR__) & ((__FLAG__) & SPI_FLAG_MASK)) == \ + ((__FLAG__) & SPI_FLAG_MASK)) ? SET : RESET) + +/** @brief Check whether the specified SPI Interrupt is set or not. + * @param __CR2__ copy of SPI CR2 register. + * @param __INTERRUPT__ specifies the SPI interrupt source to check. + * This parameter can be one of the following values: + * @arg SPI_IT_TXE: Tx buffer empty interrupt enable + * @arg SPI_IT_RXNE: RX buffer not empty interrupt enable + * @arg SPI_IT_ERR: Error interrupt enable + * @retval SET or RESET. + */ +#define SPI_CHECK_IT_SOURCE(__CR2__, __INTERRUPT__) ((((__CR2__) & (__INTERRUPT__)) == \ + (__INTERRUPT__)) ? SET : RESET) + +/** @brief Checks if SPI Mode parameter is in allowed range. + * @param __MODE__ specifies the SPI Mode. + * This parameter can be a value of @ref SPI_Mode + * @retval None + */ +#define IS_SPI_MODE(__MODE__) (((__MODE__) == SPI_MODE_SLAVE) || \ + ((__MODE__) == SPI_MODE_MASTER)) + +/** @brief Checks if SPI Direction Mode parameter is in allowed range. + * @param __MODE__ specifies the SPI Direction Mode. + * This parameter can be a value of @ref SPI_Direction + * @retval None + */ +#define IS_SPI_DIRECTION(__MODE__) (((__MODE__) == SPI_DIRECTION_2LINES) || \ + ((__MODE__) == SPI_DIRECTION_2LINES_RXONLY) || \ + ((__MODE__) == SPI_DIRECTION_1LINE)) + +/** @brief Checks if SPI Direction Mode parameter is 2 lines. + * @param __MODE__ specifies the SPI Direction Mode. + * @retval None + */ +#define IS_SPI_DIRECTION_2LINES(__MODE__) ((__MODE__) == SPI_DIRECTION_2LINES) + +/** @brief Checks if SPI Direction Mode parameter is 1 or 2 lines. + * @param __MODE__ specifies the SPI Direction Mode. + * @retval None + */ +#define IS_SPI_DIRECTION_2LINES_OR_1LINE(__MODE__) (((__MODE__) == SPI_DIRECTION_2LINES) || \ + ((__MODE__) == SPI_DIRECTION_1LINE)) + +/** @brief Checks if SPI Data Size parameter is in allowed range. + * @param __DATASIZE__ specifies the SPI Data Size. + * This parameter can be a value of @ref SPI_Data_Size + * @retval None + */ +#define IS_SPI_DATASIZE(__DATASIZE__) (((__DATASIZE__) == SPI_DATASIZE_16BIT) || \ + ((__DATASIZE__) == SPI_DATASIZE_8BIT)) + +/** @brief Checks if SPI Serial clock steady state parameter is in allowed range. + * @param __CPOL__ specifies the SPI serial clock steady state. + * This parameter can be a value of @ref SPI_Clock_Polarity + * @retval None + */ +#define IS_SPI_CPOL(__CPOL__) (((__CPOL__) == SPI_POLARITY_LOW) || \ + ((__CPOL__) == SPI_POLARITY_HIGH)) + +/** @brief Checks if SPI Clock Phase parameter is in allowed range. + * @param __CPHA__ specifies the SPI Clock Phase. + * This parameter can be a value of @ref SPI_Clock_Phase + * @retval None + */ +#define IS_SPI_CPHA(__CPHA__) (((__CPHA__) == SPI_PHASE_1EDGE) || \ + ((__CPHA__) == SPI_PHASE_2EDGE)) + +/** @brief Checks if SPI Slave Select parameter is in allowed range. + * @param __NSS__ specifies the SPI Slave Select management parameter. + * This parameter can be a value of @ref SPI_Slave_Select_management + * @retval None + */ +#define IS_SPI_NSS(__NSS__) (((__NSS__) == SPI_NSS_SOFT) || \ + ((__NSS__) == SPI_NSS_HARD_INPUT) || \ + ((__NSS__) == SPI_NSS_HARD_OUTPUT)) + +/** @brief Checks if SPI Baudrate prescaler parameter is in allowed range. + * @param __PRESCALER__ specifies the SPI Baudrate prescaler. + * This parameter can be a value of @ref SPI_BaudRate_Prescaler + * @retval None + */ +#define IS_SPI_BAUDRATE_PRESCALER(__PRESCALER__) (((__PRESCALER__) == SPI_BAUDRATEPRESCALER_2) || \ + ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_4) || \ + ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_8) || \ + ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_16) || \ + ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_32) || \ + ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_64) || \ + ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_128) || \ + ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_256)) + +/** @brief Checks if SPI MSB LSB transmission parameter is in allowed range. + * @param __BIT__ specifies the SPI MSB LSB transmission (whether data transfer starts from MSB or LSB bit). + * This parameter can be a value of @ref SPI_MSB_LSB_transmission + * @retval None + */ +#define IS_SPI_FIRST_BIT(__BIT__) (((__BIT__) == SPI_FIRSTBIT_MSB) || \ + ((__BIT__) == SPI_FIRSTBIT_LSB)) + +/** @brief Checks if SPI TI mode parameter is in allowed range. + * @param __MODE__ specifies the SPI TI mode. + * This parameter can be a value of @ref SPI_TI_mode + * @retval None + */ +#define IS_SPI_TIMODE(__MODE__) (((__MODE__) == SPI_TIMODE_DISABLE) || \ + ((__MODE__) == SPI_TIMODE_ENABLE)) + +/** @brief Checks if SPI CRC calculation enabled state is in allowed range. + * @param __CALCULATION__ specifies the SPI CRC calculation enable state. + * This parameter can be a value of @ref SPI_CRC_Calculation + * @retval None + */ +#define IS_SPI_CRC_CALCULATION(__CALCULATION__) (((__CALCULATION__) == SPI_CRCCALCULATION_DISABLE) || \ + ((__CALCULATION__) == SPI_CRCCALCULATION_ENABLE)) + +/** @brief Checks if SPI polynomial value to be used for the CRC calculation, is in allowed range. + * @param __POLYNOMIAL__ specifies the SPI polynomial value to be used for the CRC calculation. + * This parameter must be a number between Min_Data = 0 and Max_Data = 65535 + * @retval None + */ +#define IS_SPI_CRC_POLYNOMIAL(__POLYNOMIAL__) (((__POLYNOMIAL__) >= 0x1U) && \ + ((__POLYNOMIAL__) <= 0xFFFFU) && \ + (((__POLYNOMIAL__)&0x1U) != 0U)) + +/** @brief Checks if DMA handle is valid. + * @param __HANDLE__ specifies a DMA Handle. + * @retval None + */ +#define IS_SPI_DMA_HANDLE(__HANDLE__) ((__HANDLE__) != NULL) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup SPI_Exported_Functions + * @{ + */ + +/** @addtogroup SPI_Exported_Functions_Group1 + * @{ + */ +/* Initialization/de-initialization functions ********************************/ +HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi); +HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi); +void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi); +void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi); + +/* Callbacks Register/UnRegister functions ***********************************/ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +HAL_StatusTypeDef HAL_SPI_RegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID, + pSPI_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_SPI_UnRegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +/** + * @} + */ + +/** @addtogroup SPI_Exported_Functions_Group2 + * @{ + */ +/* I/O operation functions ***************************************************/ +HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size, uint32_t Timeout); +HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout); +HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, + uint16_t Size, uint32_t Timeout); +HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, + uint16_t Size); +HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, + uint16_t Size); +HAL_StatusTypeDef HAL_SPI_DMAPause(SPI_HandleTypeDef *hspi); +HAL_StatusTypeDef HAL_SPI_DMAResume(SPI_HandleTypeDef *hspi); +HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi); +/* Transfer Abort functions */ +HAL_StatusTypeDef HAL_SPI_Abort(SPI_HandleTypeDef *hspi); +HAL_StatusTypeDef HAL_SPI_Abort_IT(SPI_HandleTypeDef *hspi); + +void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi); +void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi); +void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi); +void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi); +void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi); +void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi); +void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi); +void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi); +void HAL_SPI_AbortCpltCallback(SPI_HandleTypeDef *hspi); +/** + * @} + */ + +/** @addtogroup SPI_Exported_Functions_Group3 + * @{ + */ +/* Peripheral State and Error functions ***************************************/ +HAL_SPI_StateTypeDef HAL_SPI_GetState(const SPI_HandleTypeDef *hspi); +uint32_t HAL_SPI_GetError(const SPI_HandleTypeDef *hspi); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32F4xx_HAL_SPI_H */ + diff --git a/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h new file mode 100644 index 0000000..53c9bf6 --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h @@ -0,0 +1,2157 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_tim.h + * @author MCD Application Team + * @brief Header file of TIM HAL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32F4xx_HAL_TIM_H +#define STM32F4xx_HAL_TIM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup TIM + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup TIM_Exported_Types TIM Exported Types + * @{ + */ + +/** + * @brief TIM Time base Configuration Structure definition + */ +typedef struct +{ + uint32_t Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock. + This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ + + uint32_t CounterMode; /*!< Specifies the counter mode. + This parameter can be a value of @ref TIM_Counter_Mode */ + + uint32_t Period; /*!< Specifies the period value to be loaded into the active + Auto-Reload Register at the next update event. + This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. */ + + uint32_t ClockDivision; /*!< Specifies the clock division. + This parameter can be a value of @ref TIM_ClockDivision */ + + uint32_t RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter + reaches zero, an update event is generated and counting restarts + from the RCR value (N). + This means in PWM mode that (N+1) corresponds to: + - the number of PWM periods in edge-aligned mode + - the number of half PWM period in center-aligned mode + GP timers: this parameter must be a number between Min_Data = 0x00 and + Max_Data = 0xFF. + Advanced timers: this parameter must be a number between Min_Data = 0x0000 and + Max_Data = 0xFFFF. */ + + uint32_t AutoReloadPreload; /*!< Specifies the auto-reload preload. + This parameter can be a value of @ref TIM_AutoReloadPreload */ +} TIM_Base_InitTypeDef; + +/** + * @brief TIM Output Compare Configuration Structure definition + */ +typedef struct +{ + uint32_t OCMode; /*!< Specifies the TIM mode. + This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ + + uint32_t Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. + This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ + + uint32_t OCPolarity; /*!< Specifies the output polarity. + This parameter can be a value of @ref TIM_Output_Compare_Polarity */ + + uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. + This parameter can be a value of @ref TIM_Output_Compare_N_Polarity + @note This parameter is valid only for timer instances supporting break feature. */ + + uint32_t OCFastMode; /*!< Specifies the Fast mode state. + This parameter can be a value of @ref TIM_Output_Fast_State + @note This parameter is valid only in PWM1 and PWM2 mode. */ + + + uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_Idle_State + @note This parameter is valid only for timer instances supporting break feature. */ + + uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State + @note This parameter is valid only for timer instances supporting break feature. */ +} TIM_OC_InitTypeDef; + +/** + * @brief TIM One Pulse Mode Configuration Structure definition + */ +typedef struct +{ + uint32_t OCMode; /*!< Specifies the TIM mode. + This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ + + uint32_t Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. + This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ + + uint32_t OCPolarity; /*!< Specifies the output polarity. + This parameter can be a value of @ref TIM_Output_Compare_Polarity */ + + uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. + This parameter can be a value of @ref TIM_Output_Compare_N_Polarity + @note This parameter is valid only for timer instances supporting break feature. */ + + uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_Idle_State + @note This parameter is valid only for timer instances supporting break feature. */ + + uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State + @note This parameter is valid only for timer instances supporting break feature. */ + + uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + + uint32_t ICSelection; /*!< Specifies the input. + This parameter can be a value of @ref TIM_Input_Capture_Selection */ + + uint32_t ICFilter; /*!< Specifies the input capture filter. + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ +} TIM_OnePulse_InitTypeDef; + +/** + * @brief TIM Input Capture Configuration Structure definition + */ +typedef struct +{ + uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + + uint32_t ICSelection; /*!< Specifies the input. + This parameter can be a value of @ref TIM_Input_Capture_Selection */ + + uint32_t ICPrescaler; /*!< Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ + + uint32_t ICFilter; /*!< Specifies the input capture filter. + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ +} TIM_IC_InitTypeDef; + +/** + * @brief TIM Encoder Configuration Structure definition + */ +typedef struct +{ + uint32_t EncoderMode; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Encoder_Mode */ + + uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ + + uint32_t IC1Selection; /*!< Specifies the input. + This parameter can be a value of @ref TIM_Input_Capture_Selection */ + + uint32_t IC1Prescaler; /*!< Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ + + uint32_t IC1Filter; /*!< Specifies the input capture filter. + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ + + uint32_t IC2Polarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ + + uint32_t IC2Selection; /*!< Specifies the input. + This parameter can be a value of @ref TIM_Input_Capture_Selection */ + + uint32_t IC2Prescaler; /*!< Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ + + uint32_t IC2Filter; /*!< Specifies the input capture filter. + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ +} TIM_Encoder_InitTypeDef; + +/** + * @brief Clock Configuration Handle Structure definition + */ +typedef struct +{ + uint32_t ClockSource; /*!< TIM clock sources + This parameter can be a value of @ref TIM_Clock_Source */ + uint32_t ClockPolarity; /*!< TIM clock polarity + This parameter can be a value of @ref TIM_Clock_Polarity */ + uint32_t ClockPrescaler; /*!< TIM clock prescaler + This parameter can be a value of @ref TIM_Clock_Prescaler */ + uint32_t ClockFilter; /*!< TIM clock filter + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ +} TIM_ClockConfigTypeDef; + +/** + * @brief TIM Clear Input Configuration Handle Structure definition + */ +typedef struct +{ + uint32_t ClearInputState; /*!< TIM clear Input state + This parameter can be ENABLE or DISABLE */ + uint32_t ClearInputSource; /*!< TIM clear Input sources + This parameter can be a value of @ref TIM_ClearInput_Source */ + uint32_t ClearInputPolarity; /*!< TIM Clear Input polarity + This parameter can be a value of @ref TIM_ClearInput_Polarity */ + uint32_t ClearInputPrescaler; /*!< TIM Clear Input prescaler + This parameter must be 0: When OCRef clear feature is used with ETR source, + ETR prescaler must be off */ + uint32_t ClearInputFilter; /*!< TIM Clear Input filter + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ +} TIM_ClearInputConfigTypeDef; + +/** + * @brief TIM Master configuration Structure definition + */ +typedef struct +{ + uint32_t MasterOutputTrigger; /*!< Trigger output (TRGO) selection + This parameter can be a value of @ref TIM_Master_Mode_Selection */ + uint32_t MasterSlaveMode; /*!< Master/slave mode selection + This parameter can be a value of @ref TIM_Master_Slave_Mode + @note When the Master/slave mode is enabled, the effect of + an event on the trigger input (TRGI) is delayed to allow a + perfect synchronization between the current timer and its + slaves (through TRGO). It is not mandatory in case of timer + synchronization mode. */ +} TIM_MasterConfigTypeDef; + +/** + * @brief TIM Slave configuration Structure definition + */ +typedef struct +{ + uint32_t SlaveMode; /*!< Slave mode selection + This parameter can be a value of @ref TIM_Slave_Mode */ + uint32_t InputTrigger; /*!< Input Trigger source + This parameter can be a value of @ref TIM_Trigger_Selection */ + uint32_t TriggerPolarity; /*!< Input Trigger polarity + This parameter can be a value of @ref TIM_Trigger_Polarity */ + uint32_t TriggerPrescaler; /*!< Input trigger prescaler + This parameter can be a value of @ref TIM_Trigger_Prescaler */ + uint32_t TriggerFilter; /*!< Input trigger filter + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ + +} TIM_SlaveConfigTypeDef; + +/** + * @brief TIM Break input(s) and Dead time configuration Structure definition + * @note 2 break inputs can be configured (BKIN and BKIN2) with configurable + * filter and polarity. + */ +typedef struct +{ + uint32_t OffStateRunMode; /*!< TIM off state in run mode, This parameter can be a value of @ref TIM_OSSR_Off_State_Selection_for_Run_mode_state */ + + uint32_t OffStateIDLEMode; /*!< TIM off state in IDLE mode, This parameter can be a value of @ref TIM_OSSI_Off_State_Selection_for_Idle_mode_state */ + + uint32_t LockLevel; /*!< TIM Lock level, This parameter can be a value of @ref TIM_Lock_level */ + + uint32_t DeadTime; /*!< TIM dead Time, This parameter can be a number between Min_Data = 0x00 and Max_Data = 0xFF */ + + uint32_t BreakState; /*!< TIM Break State, This parameter can be a value of @ref TIM_Break_Input_enable_disable */ + + uint32_t BreakPolarity; /*!< TIM Break input polarity, This parameter can be a value of @ref TIM_Break_Polarity */ + + uint32_t BreakFilter; /*!< Specifies the break input filter.This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ + + uint32_t AutomaticOutput; /*!< TIM Automatic Output Enable state, This parameter can be a value of @ref TIM_AOE_Bit_Set_Reset */ + +} TIM_BreakDeadTimeConfigTypeDef; + +/** + * @brief HAL State structures definition + */ +typedef enum +{ + HAL_TIM_STATE_RESET = 0x00U, /*!< Peripheral not yet initialized or disabled */ + HAL_TIM_STATE_READY = 0x01U, /*!< Peripheral Initialized and ready for use */ + HAL_TIM_STATE_BUSY = 0x02U, /*!< An internal process is ongoing */ + HAL_TIM_STATE_TIMEOUT = 0x03U, /*!< Timeout state */ + HAL_TIM_STATE_ERROR = 0x04U /*!< Reception process is ongoing */ +} HAL_TIM_StateTypeDef; + +/** + * @brief TIM Channel States definition + */ +typedef enum +{ + HAL_TIM_CHANNEL_STATE_RESET = 0x00U, /*!< TIM Channel initial state */ + HAL_TIM_CHANNEL_STATE_READY = 0x01U, /*!< TIM Channel ready for use */ + HAL_TIM_CHANNEL_STATE_BUSY = 0x02U, /*!< An internal process is ongoing on the TIM channel */ +} HAL_TIM_ChannelStateTypeDef; + +/** + * @brief DMA Burst States definition + */ +typedef enum +{ + HAL_DMA_BURST_STATE_RESET = 0x00U, /*!< DMA Burst initial state */ + HAL_DMA_BURST_STATE_READY = 0x01U, /*!< DMA Burst ready for use */ + HAL_DMA_BURST_STATE_BUSY = 0x02U, /*!< Ongoing DMA Burst */ +} HAL_TIM_DMABurstStateTypeDef; + +/** + * @brief HAL Active channel structures definition + */ +typedef enum +{ + HAL_TIM_ACTIVE_CHANNEL_1 = 0x01U, /*!< The active channel is 1 */ + HAL_TIM_ACTIVE_CHANNEL_2 = 0x02U, /*!< The active channel is 2 */ + HAL_TIM_ACTIVE_CHANNEL_3 = 0x04U, /*!< The active channel is 3 */ + HAL_TIM_ACTIVE_CHANNEL_4 = 0x08U, /*!< The active channel is 4 */ + HAL_TIM_ACTIVE_CHANNEL_CLEARED = 0x00U /*!< All active channels cleared */ +} HAL_TIM_ActiveChannel; + +/** + * @brief TIM Time Base Handle Structure definition + */ +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +typedef struct __TIM_HandleTypeDef +#else +typedef struct +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +{ + TIM_TypeDef *Instance; /*!< Register base address */ + TIM_Base_InitTypeDef Init; /*!< TIM Time Base required parameters */ + HAL_TIM_ActiveChannel Channel; /*!< Active channel */ + DMA_HandleTypeDef *hdma[7]; /*!< DMA Handlers array + This array is accessed by a @ref DMA_Handle_index */ + HAL_LockTypeDef Lock; /*!< Locking object */ + __IO HAL_TIM_StateTypeDef State; /*!< TIM operation state */ + __IO HAL_TIM_ChannelStateTypeDef ChannelState[4]; /*!< TIM channel operation state */ + __IO HAL_TIM_ChannelStateTypeDef ChannelNState[4]; /*!< TIM complementary channel operation state */ + __IO HAL_TIM_DMABurstStateTypeDef DMABurstState; /*!< DMA burst operation state */ + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + void (* Base_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Base Msp Init Callback */ + void (* Base_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Base Msp DeInit Callback */ + void (* IC_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM IC Msp Init Callback */ + void (* IC_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM IC Msp DeInit Callback */ + void (* OC_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM OC Msp Init Callback */ + void (* OC_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM OC Msp DeInit Callback */ + void (* PWM_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Msp Init Callback */ + void (* PWM_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Msp DeInit Callback */ + void (* OnePulse_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM One Pulse Msp Init Callback */ + void (* OnePulse_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM One Pulse Msp DeInit Callback */ + void (* Encoder_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Encoder Msp Init Callback */ + void (* Encoder_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Encoder Msp DeInit Callback */ + void (* HallSensor_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Hall Sensor Msp Init Callback */ + void (* HallSensor_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Hall Sensor Msp DeInit Callback */ + void (* PeriodElapsedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Period Elapsed Callback */ + void (* PeriodElapsedHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Period Elapsed half complete Callback */ + void (* TriggerCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Trigger Callback */ + void (* TriggerHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Trigger half complete Callback */ + void (* IC_CaptureCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Input Capture Callback */ + void (* IC_CaptureHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Input Capture half complete Callback */ + void (* OC_DelayElapsedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Output Compare Delay Elapsed Callback */ + void (* PWM_PulseFinishedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Pulse Finished Callback */ + void (* PWM_PulseFinishedHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Pulse Finished half complete Callback */ + void (* ErrorCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Error Callback */ + void (* CommutationCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Commutation Callback */ + void (* CommutationHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Commutation half complete Callback */ + void (* BreakCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Break Callback */ +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} TIM_HandleTypeDef; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +/** + * @brief HAL TIM Callback ID enumeration definition + */ +typedef enum +{ + HAL_TIM_BASE_MSPINIT_CB_ID = 0x00U /*!< TIM Base MspInit Callback ID */ + , HAL_TIM_BASE_MSPDEINIT_CB_ID = 0x01U /*!< TIM Base MspDeInit Callback ID */ + , HAL_TIM_IC_MSPINIT_CB_ID = 0x02U /*!< TIM IC MspInit Callback ID */ + , HAL_TIM_IC_MSPDEINIT_CB_ID = 0x03U /*!< TIM IC MspDeInit Callback ID */ + , HAL_TIM_OC_MSPINIT_CB_ID = 0x04U /*!< TIM OC MspInit Callback ID */ + , HAL_TIM_OC_MSPDEINIT_CB_ID = 0x05U /*!< TIM OC MspDeInit Callback ID */ + , HAL_TIM_PWM_MSPINIT_CB_ID = 0x06U /*!< TIM PWM MspInit Callback ID */ + , HAL_TIM_PWM_MSPDEINIT_CB_ID = 0x07U /*!< TIM PWM MspDeInit Callback ID */ + , HAL_TIM_ONE_PULSE_MSPINIT_CB_ID = 0x08U /*!< TIM One Pulse MspInit Callback ID */ + , HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID = 0x09U /*!< TIM One Pulse MspDeInit Callback ID */ + , HAL_TIM_ENCODER_MSPINIT_CB_ID = 0x0AU /*!< TIM Encoder MspInit Callback ID */ + , HAL_TIM_ENCODER_MSPDEINIT_CB_ID = 0x0BU /*!< TIM Encoder MspDeInit Callback ID */ + , HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID = 0x0CU /*!< TIM Hall Sensor MspDeInit Callback ID */ + , HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID = 0x0DU /*!< TIM Hall Sensor MspDeInit Callback ID */ + , HAL_TIM_PERIOD_ELAPSED_CB_ID = 0x0EU /*!< TIM Period Elapsed Callback ID */ + , HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID = 0x0FU /*!< TIM Period Elapsed half complete Callback ID */ + , HAL_TIM_TRIGGER_CB_ID = 0x10U /*!< TIM Trigger Callback ID */ + , HAL_TIM_TRIGGER_HALF_CB_ID = 0x11U /*!< TIM Trigger half complete Callback ID */ + , HAL_TIM_IC_CAPTURE_CB_ID = 0x12U /*!< TIM Input Capture Callback ID */ + , HAL_TIM_IC_CAPTURE_HALF_CB_ID = 0x13U /*!< TIM Input Capture half complete Callback ID */ + , HAL_TIM_OC_DELAY_ELAPSED_CB_ID = 0x14U /*!< TIM Output Compare Delay Elapsed Callback ID */ + , HAL_TIM_PWM_PULSE_FINISHED_CB_ID = 0x15U /*!< TIM PWM Pulse Finished Callback ID */ + , HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID = 0x16U /*!< TIM PWM Pulse Finished half complete Callback ID */ + , HAL_TIM_ERROR_CB_ID = 0x17U /*!< TIM Error Callback ID */ + , HAL_TIM_COMMUTATION_CB_ID = 0x18U /*!< TIM Commutation Callback ID */ + , HAL_TIM_COMMUTATION_HALF_CB_ID = 0x19U /*!< TIM Commutation half complete Callback ID */ + , HAL_TIM_BREAK_CB_ID = 0x1AU /*!< TIM Break Callback ID */ +} HAL_TIM_CallbackIDTypeDef; + +/** + * @brief HAL TIM Callback pointer definition + */ +typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to the TIM callback function */ + +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @} + */ +/* End of exported types -----------------------------------------------------*/ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup TIM_Exported_Constants TIM Exported Constants + * @{ + */ + +/** @defgroup TIM_ClearInput_Source TIM Clear Input Source + * @{ + */ +#define TIM_CLEARINPUTSOURCE_NONE 0x00000000U /*!< OCREF_CLR is disabled */ +#define TIM_CLEARINPUTSOURCE_ETR 0x00000001U /*!< OCREF_CLR is connected to ETRF input */ +/** + * @} + */ + +/** @defgroup TIM_DMA_Base_address TIM DMA Base Address + * @{ + */ +#define TIM_DMABASE_CR1 0x00000000U +#define TIM_DMABASE_CR2 0x00000001U +#define TIM_DMABASE_SMCR 0x00000002U +#define TIM_DMABASE_DIER 0x00000003U +#define TIM_DMABASE_SR 0x00000004U +#define TIM_DMABASE_EGR 0x00000005U +#define TIM_DMABASE_CCMR1 0x00000006U +#define TIM_DMABASE_CCMR2 0x00000007U +#define TIM_DMABASE_CCER 0x00000008U +#define TIM_DMABASE_CNT 0x00000009U +#define TIM_DMABASE_PSC 0x0000000AU +#define TIM_DMABASE_ARR 0x0000000BU +#define TIM_DMABASE_RCR 0x0000000CU +#define TIM_DMABASE_CCR1 0x0000000DU +#define TIM_DMABASE_CCR2 0x0000000EU +#define TIM_DMABASE_CCR3 0x0000000FU +#define TIM_DMABASE_CCR4 0x00000010U +#define TIM_DMABASE_BDTR 0x00000011U +#define TIM_DMABASE_DCR 0x00000012U +#define TIM_DMABASE_DMAR 0x00000013U +/** + * @} + */ + +/** @defgroup TIM_Event_Source TIM Event Source + * @{ + */ +#define TIM_EVENTSOURCE_UPDATE TIM_EGR_UG /*!< Reinitialize the counter and generates an update of the registers */ +#define TIM_EVENTSOURCE_CC1 TIM_EGR_CC1G /*!< A capture/compare event is generated on channel 1 */ +#define TIM_EVENTSOURCE_CC2 TIM_EGR_CC2G /*!< A capture/compare event is generated on channel 2 */ +#define TIM_EVENTSOURCE_CC3 TIM_EGR_CC3G /*!< A capture/compare event is generated on channel 3 */ +#define TIM_EVENTSOURCE_CC4 TIM_EGR_CC4G /*!< A capture/compare event is generated on channel 4 */ +#define TIM_EVENTSOURCE_COM TIM_EGR_COMG /*!< A commutation event is generated */ +#define TIM_EVENTSOURCE_TRIGGER TIM_EGR_TG /*!< A trigger event is generated */ +#define TIM_EVENTSOURCE_BREAK TIM_EGR_BG /*!< A break event is generated */ +/** + * @} + */ + +/** @defgroup TIM_Input_Channel_Polarity TIM Input Channel polarity + * @{ + */ +#define TIM_INPUTCHANNELPOLARITY_RISING 0x00000000U /*!< Polarity for TIx source */ +#define TIM_INPUTCHANNELPOLARITY_FALLING TIM_CCER_CC1P /*!< Polarity for TIx source */ +#define TIM_INPUTCHANNELPOLARITY_BOTHEDGE (TIM_CCER_CC1P | TIM_CCER_CC1NP) /*!< Polarity for TIx source */ +/** + * @} + */ + +/** @defgroup TIM_ETR_Polarity TIM ETR Polarity + * @{ + */ +#define TIM_ETRPOLARITY_INVERTED TIM_SMCR_ETP /*!< Polarity for ETR source */ +#define TIM_ETRPOLARITY_NONINVERTED 0x00000000U /*!< Polarity for ETR source */ +/** + * @} + */ + +/** @defgroup TIM_ETR_Prescaler TIM ETR Prescaler + * @{ + */ +#define TIM_ETRPRESCALER_DIV1 0x00000000U /*!< No prescaler is used */ +#define TIM_ETRPRESCALER_DIV2 TIM_SMCR_ETPS_0 /*!< ETR input source is divided by 2 */ +#define TIM_ETRPRESCALER_DIV4 TIM_SMCR_ETPS_1 /*!< ETR input source is divided by 4 */ +#define TIM_ETRPRESCALER_DIV8 TIM_SMCR_ETPS /*!< ETR input source is divided by 8 */ +/** + * @} + */ + +/** @defgroup TIM_Counter_Mode TIM Counter Mode + * @{ + */ +#define TIM_COUNTERMODE_UP 0x00000000U /*!< Counter used as up-counter */ +#define TIM_COUNTERMODE_DOWN TIM_CR1_DIR /*!< Counter used as down-counter */ +#define TIM_COUNTERMODE_CENTERALIGNED1 TIM_CR1_CMS_0 /*!< Center-aligned mode 1 */ +#define TIM_COUNTERMODE_CENTERALIGNED2 TIM_CR1_CMS_1 /*!< Center-aligned mode 2 */ +#define TIM_COUNTERMODE_CENTERALIGNED3 TIM_CR1_CMS /*!< Center-aligned mode 3 */ +/** + * @} + */ + +/** @defgroup TIM_ClockDivision TIM Clock Division + * @{ + */ +#define TIM_CLOCKDIVISION_DIV1 0x00000000U /*!< Clock division: tDTS=tCK_INT */ +#define TIM_CLOCKDIVISION_DIV2 TIM_CR1_CKD_0 /*!< Clock division: tDTS=2*tCK_INT */ +#define TIM_CLOCKDIVISION_DIV4 TIM_CR1_CKD_1 /*!< Clock division: tDTS=4*tCK_INT */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_State TIM Output Compare State + * @{ + */ +#define TIM_OUTPUTSTATE_DISABLE 0x00000000U /*!< Capture/Compare 1 output disabled */ +#define TIM_OUTPUTSTATE_ENABLE TIM_CCER_CC1E /*!< Capture/Compare 1 output enabled */ +/** + * @} + */ + +/** @defgroup TIM_AutoReloadPreload TIM Auto-Reload Preload + * @{ + */ +#define TIM_AUTORELOAD_PRELOAD_DISABLE 0x00000000U /*!< TIMx_ARR register is not buffered */ +#define TIM_AUTORELOAD_PRELOAD_ENABLE TIM_CR1_ARPE /*!< TIMx_ARR register is buffered */ + +/** + * @} + */ + +/** @defgroup TIM_Output_Fast_State TIM Output Fast State + * @{ + */ +#define TIM_OCFAST_DISABLE 0x00000000U /*!< Output Compare fast disable */ +#define TIM_OCFAST_ENABLE TIM_CCMR1_OC1FE /*!< Output Compare fast enable */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_N_State TIM Complementary Output Compare State + * @{ + */ +#define TIM_OUTPUTNSTATE_DISABLE 0x00000000U /*!< OCxN is disabled */ +#define TIM_OUTPUTNSTATE_ENABLE TIM_CCER_CC1NE /*!< OCxN is enabled */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_Polarity TIM Output Compare Polarity + * @{ + */ +#define TIM_OCPOLARITY_HIGH 0x00000000U /*!< Capture/Compare output polarity */ +#define TIM_OCPOLARITY_LOW TIM_CCER_CC1P /*!< Capture/Compare output polarity */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_N_Polarity TIM Complementary Output Compare Polarity + * @{ + */ +#define TIM_OCNPOLARITY_HIGH 0x00000000U /*!< Capture/Compare complementary output polarity */ +#define TIM_OCNPOLARITY_LOW TIM_CCER_CC1NP /*!< Capture/Compare complementary output polarity */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_Idle_State TIM Output Compare Idle State + * @{ + */ +#define TIM_OCIDLESTATE_SET TIM_CR2_OIS1 /*!< Output Idle state: OCx=1 when MOE=0 */ +#define TIM_OCIDLESTATE_RESET 0x00000000U /*!< Output Idle state: OCx=0 when MOE=0 */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_N_Idle_State TIM Complementary Output Compare Idle State + * @{ + */ +#define TIM_OCNIDLESTATE_SET TIM_CR2_OIS1N /*!< Complementary output Idle state: OCxN=1 when MOE=0 */ +#define TIM_OCNIDLESTATE_RESET 0x00000000U /*!< Complementary output Idle state: OCxN=0 when MOE=0 */ +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Polarity TIM Input Capture Polarity + * @{ + */ +#define TIM_ICPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Capture triggered by rising edge on timer input */ +#define TIM_ICPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Capture triggered by falling edge on timer input */ +#define TIM_ICPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Capture triggered by both rising and falling edges on timer input*/ +/** + * @} + */ + +/** @defgroup TIM_Encoder_Input_Polarity TIM Encoder Input Polarity + * @{ + */ +#define TIM_ENCODERINPUTPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Encoder input with rising edge polarity */ +#define TIM_ENCODERINPUTPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Encoder input with falling edge polarity */ +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Selection TIM Input Capture Selection + * @{ + */ +#define TIM_ICSELECTION_DIRECTTI TIM_CCMR1_CC1S_0 /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to IC1, IC2, IC3 or IC4, respectively */ +#define TIM_ICSELECTION_INDIRECTTI TIM_CCMR1_CC1S_1 /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to IC2, IC1, IC4 or IC3, respectively */ +#define TIM_ICSELECTION_TRC TIM_CCMR1_CC1S /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to TRC */ +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Prescaler TIM Input Capture Prescaler + * @{ + */ +#define TIM_ICPSC_DIV1 0x00000000U /*!< Capture performed each time an edge is detected on the capture input */ +#define TIM_ICPSC_DIV2 TIM_CCMR1_IC1PSC_0 /*!< Capture performed once every 2 events */ +#define TIM_ICPSC_DIV4 TIM_CCMR1_IC1PSC_1 /*!< Capture performed once every 4 events */ +#define TIM_ICPSC_DIV8 TIM_CCMR1_IC1PSC /*!< Capture performed once every 8 events */ +/** + * @} + */ + +/** @defgroup TIM_One_Pulse_Mode TIM One Pulse Mode + * @{ + */ +#define TIM_OPMODE_SINGLE TIM_CR1_OPM /*!< Counter stops counting at the next update event */ +#define TIM_OPMODE_REPETITIVE 0x00000000U /*!< Counter is not stopped at update event */ +/** + * @} + */ + +/** @defgroup TIM_Encoder_Mode TIM Encoder Mode + * @{ + */ +#define TIM_ENCODERMODE_TI1 TIM_SMCR_SMS_0 /*!< Quadrature encoder mode 1, x2 mode, counts up/down on TI1FP1 edge depending on TI2FP2 level */ +#define TIM_ENCODERMODE_TI2 TIM_SMCR_SMS_1 /*!< Quadrature encoder mode 2, x2 mode, counts up/down on TI2FP2 edge depending on TI1FP1 level. */ +#define TIM_ENCODERMODE_TI12 (TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0) /*!< Quadrature encoder mode 3, x4 mode, counts up/down on both TI1FP1 and TI2FP2 edges depending on the level of the other input. */ +/** + * @} + */ + +/** @defgroup TIM_Interrupt_definition TIM interrupt Definition + * @{ + */ +#define TIM_IT_UPDATE TIM_DIER_UIE /*!< Update interrupt */ +#define TIM_IT_CC1 TIM_DIER_CC1IE /*!< Capture/Compare 1 interrupt */ +#define TIM_IT_CC2 TIM_DIER_CC2IE /*!< Capture/Compare 2 interrupt */ +#define TIM_IT_CC3 TIM_DIER_CC3IE /*!< Capture/Compare 3 interrupt */ +#define TIM_IT_CC4 TIM_DIER_CC4IE /*!< Capture/Compare 4 interrupt */ +#define TIM_IT_COM TIM_DIER_COMIE /*!< Commutation interrupt */ +#define TIM_IT_TRIGGER TIM_DIER_TIE /*!< Trigger interrupt */ +#define TIM_IT_BREAK TIM_DIER_BIE /*!< Break interrupt */ +/** + * @} + */ + +/** @defgroup TIM_Commutation_Source TIM Commutation Source + * @{ + */ +#define TIM_COMMUTATION_TRGI TIM_CR2_CCUS /*!< When Capture/compare control bits are preloaded, they are updated by setting the COMG bit or when an rising edge occurs on trigger input */ +#define TIM_COMMUTATION_SOFTWARE 0x00000000U /*!< When Capture/compare control bits are preloaded, they are updated by setting the COMG bit */ +/** + * @} + */ + +/** @defgroup TIM_DMA_sources TIM DMA Sources + * @{ + */ +#define TIM_DMA_UPDATE TIM_DIER_UDE /*!< DMA request is triggered by the update event */ +#define TIM_DMA_CC1 TIM_DIER_CC1DE /*!< DMA request is triggered by the capture/compare macth 1 event */ +#define TIM_DMA_CC2 TIM_DIER_CC2DE /*!< DMA request is triggered by the capture/compare macth 2 event event */ +#define TIM_DMA_CC3 TIM_DIER_CC3DE /*!< DMA request is triggered by the capture/compare macth 3 event event */ +#define TIM_DMA_CC4 TIM_DIER_CC4DE /*!< DMA request is triggered by the capture/compare macth 4 event event */ +#define TIM_DMA_COM TIM_DIER_COMDE /*!< DMA request is triggered by the commutation event */ +#define TIM_DMA_TRIGGER TIM_DIER_TDE /*!< DMA request is triggered by the trigger event */ +/** + * @} + */ + +/** @defgroup TIM_CC_DMA_Request CCx DMA request selection + * @{ + */ +#define TIM_CCDMAREQUEST_CC 0x00000000U /*!< CCx DMA request sent when capture or compare match event occurs */ +#define TIM_CCDMAREQUEST_UPDATE TIM_CR2_CCDS /*!< CCx DMA requests sent when update event occurs */ +/** + * @} + */ + +/** @defgroup TIM_Flag_definition TIM Flag Definition + * @{ + */ +#define TIM_FLAG_UPDATE TIM_SR_UIF /*!< Update interrupt flag */ +#define TIM_FLAG_CC1 TIM_SR_CC1IF /*!< Capture/Compare 1 interrupt flag */ +#define TIM_FLAG_CC2 TIM_SR_CC2IF /*!< Capture/Compare 2 interrupt flag */ +#define TIM_FLAG_CC3 TIM_SR_CC3IF /*!< Capture/Compare 3 interrupt flag */ +#define TIM_FLAG_CC4 TIM_SR_CC4IF /*!< Capture/Compare 4 interrupt flag */ +#define TIM_FLAG_COM TIM_SR_COMIF /*!< Commutation interrupt flag */ +#define TIM_FLAG_TRIGGER TIM_SR_TIF /*!< Trigger interrupt flag */ +#define TIM_FLAG_BREAK TIM_SR_BIF /*!< Break interrupt flag */ +#define TIM_FLAG_CC1OF TIM_SR_CC1OF /*!< Capture 1 overcapture flag */ +#define TIM_FLAG_CC2OF TIM_SR_CC2OF /*!< Capture 2 overcapture flag */ +#define TIM_FLAG_CC3OF TIM_SR_CC3OF /*!< Capture 3 overcapture flag */ +#define TIM_FLAG_CC4OF TIM_SR_CC4OF /*!< Capture 4 overcapture flag */ +/** + * @} + */ + +/** @defgroup TIM_Channel TIM Channel + * @{ + */ +#define TIM_CHANNEL_1 0x00000000U /*!< Capture/compare channel 1 identifier */ +#define TIM_CHANNEL_2 0x00000004U /*!< Capture/compare channel 2 identifier */ +#define TIM_CHANNEL_3 0x00000008U /*!< Capture/compare channel 3 identifier */ +#define TIM_CHANNEL_4 0x0000000CU /*!< Capture/compare channel 4 identifier */ +#define TIM_CHANNEL_ALL 0x0000003CU /*!< Global Capture/compare channel identifier */ +/** + * @} + */ + +/** @defgroup TIM_Clock_Source TIM Clock Source + * @{ + */ +#define TIM_CLOCKSOURCE_INTERNAL TIM_SMCR_ETPS_0 /*!< Internal clock source */ +#define TIM_CLOCKSOURCE_ETRMODE1 TIM_TS_ETRF /*!< External clock source mode 1 (ETRF) */ +#define TIM_CLOCKSOURCE_ETRMODE2 TIM_SMCR_ETPS_1 /*!< External clock source mode 2 */ +#define TIM_CLOCKSOURCE_TI1ED TIM_TS_TI1F_ED /*!< External clock source mode 1 (TTI1FP1 + edge detect.) */ +#define TIM_CLOCKSOURCE_TI1 TIM_TS_TI1FP1 /*!< External clock source mode 1 (TTI1FP1) */ +#define TIM_CLOCKSOURCE_TI2 TIM_TS_TI2FP2 /*!< External clock source mode 1 (TTI2FP2) */ +#define TIM_CLOCKSOURCE_ITR0 TIM_TS_ITR0 /*!< External clock source mode 1 (ITR0) */ +#define TIM_CLOCKSOURCE_ITR1 TIM_TS_ITR1 /*!< External clock source mode 1 (ITR1) */ +#define TIM_CLOCKSOURCE_ITR2 TIM_TS_ITR2 /*!< External clock source mode 1 (ITR2) */ +#define TIM_CLOCKSOURCE_ITR3 TIM_TS_ITR3 /*!< External clock source mode 1 (ITR3) */ +/** + * @} + */ + +/** @defgroup TIM_Clock_Polarity TIM Clock Polarity + * @{ + */ +#define TIM_CLOCKPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx clock sources */ +#define TIM_CLOCKPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx clock sources */ +#define TIM_CLOCKPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Polarity for TIx clock sources */ +#define TIM_CLOCKPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Polarity for TIx clock sources */ +#define TIM_CLOCKPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Polarity for TIx clock sources */ +/** + * @} + */ + +/** @defgroup TIM_Clock_Prescaler TIM Clock Prescaler + * @{ + */ +#define TIM_CLOCKPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ +#define TIM_CLOCKPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR Clock: Capture performed once every 2 events. */ +#define TIM_CLOCKPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR Clock: Capture performed once every 4 events. */ +#define TIM_CLOCKPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR Clock: Capture performed once every 8 events. */ +/** + * @} + */ + +/** @defgroup TIM_ClearInput_Polarity TIM Clear Input Polarity + * @{ + */ +#define TIM_CLEARINPUTPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx pin */ +#define TIM_CLEARINPUTPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx pin */ +/** + * @} + */ + +/** @defgroup TIM_ClearInput_Prescaler TIM Clear Input Prescaler + * @{ + */ +#define TIM_CLEARINPUTPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ +#define TIM_CLEARINPUTPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR pin: Capture performed once every 2 events. */ +#define TIM_CLEARINPUTPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR pin: Capture performed once every 4 events. */ +#define TIM_CLEARINPUTPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR pin: Capture performed once every 8 events. */ +/** + * @} + */ + +/** @defgroup TIM_OSSR_Off_State_Selection_for_Run_mode_state TIM OSSR OffState Selection for Run mode state + * @{ + */ +#define TIM_OSSR_ENABLE TIM_BDTR_OSSR /*!< When inactive, OC/OCN outputs are enabled (still controlled by the timer) */ +#define TIM_OSSR_DISABLE 0x00000000U /*!< When inactive, OC/OCN outputs are disabled (not controlled any longer by the timer) */ +/** + * @} + */ + +/** @defgroup TIM_OSSI_Off_State_Selection_for_Idle_mode_state TIM OSSI OffState Selection for Idle mode state + * @{ + */ +#define TIM_OSSI_ENABLE TIM_BDTR_OSSI /*!< When inactive, OC/OCN outputs are enabled (still controlled by the timer) */ +#define TIM_OSSI_DISABLE 0x00000000U /*!< When inactive, OC/OCN outputs are disabled (not controlled any longer by the timer) */ +/** + * @} + */ +/** @defgroup TIM_Lock_level TIM Lock level + * @{ + */ +#define TIM_LOCKLEVEL_OFF 0x00000000U /*!< LOCK OFF */ +#define TIM_LOCKLEVEL_1 TIM_BDTR_LOCK_0 /*!< LOCK Level 1 */ +#define TIM_LOCKLEVEL_2 TIM_BDTR_LOCK_1 /*!< LOCK Level 2 */ +#define TIM_LOCKLEVEL_3 TIM_BDTR_LOCK /*!< LOCK Level 3 */ +/** + * @} + */ + +/** @defgroup TIM_Break_Input_enable_disable TIM Break Input Enable + * @{ + */ +#define TIM_BREAK_ENABLE TIM_BDTR_BKE /*!< Break input BRK is enabled */ +#define TIM_BREAK_DISABLE 0x00000000U /*!< Break input BRK is disabled */ +/** + * @} + */ + +/** @defgroup TIM_Break_Polarity TIM Break Input Polarity + * @{ + */ +#define TIM_BREAKPOLARITY_LOW 0x00000000U /*!< Break input BRK is active low */ +#define TIM_BREAKPOLARITY_HIGH TIM_BDTR_BKP /*!< Break input BRK is active high */ +/** + * @} + */ + +/** @defgroup TIM_AOE_Bit_Set_Reset TIM Automatic Output Enable + * @{ + */ +#define TIM_AUTOMATICOUTPUT_DISABLE 0x00000000U /*!< MOE can be set only by software */ +#define TIM_AUTOMATICOUTPUT_ENABLE TIM_BDTR_AOE /*!< MOE can be set by software or automatically at the next update event (if none of the break inputs BRK and BRK2 is active) */ +/** + * @} + */ + +/** @defgroup TIM_Master_Mode_Selection TIM Master Mode Selection + * @{ + */ +#define TIM_TRGO_RESET 0x00000000U /*!< TIMx_EGR.UG bit is used as trigger output (TRGO) */ +#define TIM_TRGO_ENABLE TIM_CR2_MMS_0 /*!< TIMx_CR1.CEN bit is used as trigger output (TRGO) */ +#define TIM_TRGO_UPDATE TIM_CR2_MMS_1 /*!< Update event is used as trigger output (TRGO) */ +#define TIM_TRGO_OC1 (TIM_CR2_MMS_1 | TIM_CR2_MMS_0) /*!< Capture or a compare match 1 is used as trigger output (TRGO) */ +#define TIM_TRGO_OC1REF TIM_CR2_MMS_2 /*!< OC1REF signal is used as trigger output (TRGO) */ +#define TIM_TRGO_OC2REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_0) /*!< OC2REF signal is used as trigger output(TRGO) */ +#define TIM_TRGO_OC3REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_1) /*!< OC3REF signal is used as trigger output(TRGO) */ +#define TIM_TRGO_OC4REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_1 | TIM_CR2_MMS_0) /*!< OC4REF signal is used as trigger output(TRGO) */ +/** + * @} + */ + +/** @defgroup TIM_Master_Slave_Mode TIM Master/Slave Mode + * @{ + */ +#define TIM_MASTERSLAVEMODE_ENABLE TIM_SMCR_MSM /*!< No action */ +#define TIM_MASTERSLAVEMODE_DISABLE 0x00000000U /*!< Master/slave mode is selected */ +/** + * @} + */ + +/** @defgroup TIM_Slave_Mode TIM Slave mode + * @{ + */ +#define TIM_SLAVEMODE_DISABLE 0x00000000U /*!< Slave mode disabled */ +#define TIM_SLAVEMODE_RESET TIM_SMCR_SMS_2 /*!< Reset Mode */ +#define TIM_SLAVEMODE_GATED (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_0) /*!< Gated Mode */ +#define TIM_SLAVEMODE_TRIGGER (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1) /*!< Trigger Mode */ +#define TIM_SLAVEMODE_EXTERNAL1 (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0) /*!< External Clock Mode 1 */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_and_PWM_modes TIM Output Compare and PWM Modes + * @{ + */ +#define TIM_OCMODE_TIMING 0x00000000U /*!< Frozen */ +#define TIM_OCMODE_ACTIVE TIM_CCMR1_OC1M_0 /*!< Set channel to active level on match */ +#define TIM_OCMODE_INACTIVE TIM_CCMR1_OC1M_1 /*!< Set channel to inactive level on match */ +#define TIM_OCMODE_TOGGLE (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!< Toggle */ +#define TIM_OCMODE_PWM1 (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1) /*!< PWM mode 1 */ +#define TIM_OCMODE_PWM2 (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!< PWM mode 2 */ +#define TIM_OCMODE_FORCED_ACTIVE (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_0) /*!< Force active level */ +#define TIM_OCMODE_FORCED_INACTIVE TIM_CCMR1_OC1M_2 /*!< Force inactive level */ +/** + * @} + */ + +/** @defgroup TIM_Trigger_Selection TIM Trigger Selection + * @{ + */ +#define TIM_TS_ITR0 0x00000000U /*!< Internal Trigger 0 (ITR0) */ +#define TIM_TS_ITR1 TIM_SMCR_TS_0 /*!< Internal Trigger 1 (ITR1) */ +#define TIM_TS_ITR2 TIM_SMCR_TS_1 /*!< Internal Trigger 2 (ITR2) */ +#define TIM_TS_ITR3 (TIM_SMCR_TS_0 | TIM_SMCR_TS_1) /*!< Internal Trigger 3 (ITR3) */ +#define TIM_TS_TI1F_ED TIM_SMCR_TS_2 /*!< TI1 Edge Detector (TI1F_ED) */ +#define TIM_TS_TI1FP1 (TIM_SMCR_TS_0 | TIM_SMCR_TS_2) /*!< Filtered Timer Input 1 (TI1FP1) */ +#define TIM_TS_TI2FP2 (TIM_SMCR_TS_1 | TIM_SMCR_TS_2) /*!< Filtered Timer Input 2 (TI2FP2) */ +#define TIM_TS_ETRF (TIM_SMCR_TS_0 | TIM_SMCR_TS_1 | TIM_SMCR_TS_2) /*!< Filtered External Trigger input (ETRF) */ +#define TIM_TS_NONE 0x0000FFFFU /*!< No trigger selected */ +/** + * @} + */ + +/** @defgroup TIM_Trigger_Polarity TIM Trigger Polarity + * @{ + */ +#define TIM_TRIGGERPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx trigger sources */ +#define TIM_TRIGGERPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx trigger sources */ +#define TIM_TRIGGERPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Polarity for TIxFPx or TI1_ED trigger sources */ +#define TIM_TRIGGERPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Polarity for TIxFPx or TI1_ED trigger sources */ +#define TIM_TRIGGERPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Polarity for TIxFPx or TI1_ED trigger sources */ +/** + * @} + */ + +/** @defgroup TIM_Trigger_Prescaler TIM Trigger Prescaler + * @{ + */ +#define TIM_TRIGGERPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ +#define TIM_TRIGGERPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR Trigger: Capture performed once every 2 events. */ +#define TIM_TRIGGERPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR Trigger: Capture performed once every 4 events. */ +#define TIM_TRIGGERPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR Trigger: Capture performed once every 8 events. */ +/** + * @} + */ + +/** @defgroup TIM_TI1_Selection TIM TI1 Input Selection + * @{ + */ +#define TIM_TI1SELECTION_CH1 0x00000000U /*!< The TIMx_CH1 pin is connected to TI1 input */ +#define TIM_TI1SELECTION_XORCOMBINATION TIM_CR2_TI1S /*!< The TIMx_CH1, CH2 and CH3 pins are connected to the TI1 input (XOR combination) */ +/** + * @} + */ + +/** @defgroup TIM_DMA_Burst_Length TIM DMA Burst Length + * @{ + */ +#define TIM_DMABURSTLENGTH_1TRANSFER 0x00000000U /*!< The transfer is done to 1 register starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_2TRANSFERS 0x00000100U /*!< The transfer is done to 2 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_3TRANSFERS 0x00000200U /*!< The transfer is done to 3 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_4TRANSFERS 0x00000300U /*!< The transfer is done to 4 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_5TRANSFERS 0x00000400U /*!< The transfer is done to 5 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_6TRANSFERS 0x00000500U /*!< The transfer is done to 6 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_7TRANSFERS 0x00000600U /*!< The transfer is done to 7 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_8TRANSFERS 0x00000700U /*!< The transfer is done to 8 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_9TRANSFERS 0x00000800U /*!< The transfer is done to 9 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_10TRANSFERS 0x00000900U /*!< The transfer is done to 10 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_11TRANSFERS 0x00000A00U /*!< The transfer is done to 11 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_12TRANSFERS 0x00000B00U /*!< The transfer is done to 12 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_13TRANSFERS 0x00000C00U /*!< The transfer is done to 13 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_14TRANSFERS 0x00000D00U /*!< The transfer is done to 14 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_15TRANSFERS 0x00000E00U /*!< The transfer is done to 15 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_16TRANSFERS 0x00000F00U /*!< The transfer is done to 16 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_17TRANSFERS 0x00001000U /*!< The transfer is done to 17 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_18TRANSFERS 0x00001100U /*!< The transfer is done to 18 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +/** + * @} + */ + +/** @defgroup DMA_Handle_index TIM DMA Handle Index + * @{ + */ +#define TIM_DMA_ID_UPDATE ((uint16_t) 0x0000) /*!< Index of the DMA handle used for Update DMA requests */ +#define TIM_DMA_ID_CC1 ((uint16_t) 0x0001) /*!< Index of the DMA handle used for Capture/Compare 1 DMA requests */ +#define TIM_DMA_ID_CC2 ((uint16_t) 0x0002) /*!< Index of the DMA handle used for Capture/Compare 2 DMA requests */ +#define TIM_DMA_ID_CC3 ((uint16_t) 0x0003) /*!< Index of the DMA handle used for Capture/Compare 3 DMA requests */ +#define TIM_DMA_ID_CC4 ((uint16_t) 0x0004) /*!< Index of the DMA handle used for Capture/Compare 4 DMA requests */ +#define TIM_DMA_ID_COMMUTATION ((uint16_t) 0x0005) /*!< Index of the DMA handle used for Commutation DMA requests */ +#define TIM_DMA_ID_TRIGGER ((uint16_t) 0x0006) /*!< Index of the DMA handle used for Trigger DMA requests */ +/** + * @} + */ + +/** @defgroup Channel_CC_State TIM Capture/Compare Channel State + * @{ + */ +#define TIM_CCx_ENABLE 0x00000001U /*!< Input or output channel is enabled */ +#define TIM_CCx_DISABLE 0x00000000U /*!< Input or output channel is disabled */ +#define TIM_CCxN_ENABLE 0x00000004U /*!< Complementary output channel is enabled */ +#define TIM_CCxN_DISABLE 0x00000000U /*!< Complementary output channel is enabled */ +/** + * @} + */ + +/** + * @} + */ +/* End of exported constants -------------------------------------------------*/ + +/* Exported macros -----------------------------------------------------------*/ +/** @defgroup TIM_Exported_Macros TIM Exported Macros + * @{ + */ + +/** @brief Reset TIM handle state. + * @param __HANDLE__ TIM handle. + * @retval None + */ +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +#define __HAL_TIM_RESET_HANDLE_STATE(__HANDLE__) do { \ + (__HANDLE__)->State = HAL_TIM_STATE_RESET; \ + (__HANDLE__)->ChannelState[0] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelState[1] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelState[2] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelState[3] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelNState[0] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelNState[1] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelNState[2] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelNState[3] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->DMABurstState = HAL_DMA_BURST_STATE_RESET; \ + (__HANDLE__)->Base_MspInitCallback = NULL; \ + (__HANDLE__)->Base_MspDeInitCallback = NULL; \ + (__HANDLE__)->IC_MspInitCallback = NULL; \ + (__HANDLE__)->IC_MspDeInitCallback = NULL; \ + (__HANDLE__)->OC_MspInitCallback = NULL; \ + (__HANDLE__)->OC_MspDeInitCallback = NULL; \ + (__HANDLE__)->PWM_MspInitCallback = NULL; \ + (__HANDLE__)->PWM_MspDeInitCallback = NULL; \ + (__HANDLE__)->OnePulse_MspInitCallback = NULL; \ + (__HANDLE__)->OnePulse_MspDeInitCallback = NULL; \ + (__HANDLE__)->Encoder_MspInitCallback = NULL; \ + (__HANDLE__)->Encoder_MspDeInitCallback = NULL; \ + (__HANDLE__)->HallSensor_MspInitCallback = NULL; \ + (__HANDLE__)->HallSensor_MspDeInitCallback = NULL; \ + } while(0) +#else +#define __HAL_TIM_RESET_HANDLE_STATE(__HANDLE__) do { \ + (__HANDLE__)->State = HAL_TIM_STATE_RESET; \ + (__HANDLE__)->ChannelState[0] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelState[1] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelState[2] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelState[3] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelNState[0] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelNState[1] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelNState[2] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelNState[3] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->DMABurstState = HAL_DMA_BURST_STATE_RESET; \ + } while(0) +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @brief Enable the TIM peripheral. + * @param __HANDLE__ TIM handle + * @retval None + */ +#define __HAL_TIM_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|=(TIM_CR1_CEN)) + +/** + * @brief Enable the TIM main Output. + * @param __HANDLE__ TIM handle + * @retval None + */ +#define __HAL_TIM_MOE_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->BDTR|=(TIM_BDTR_MOE)) + +/** + * @brief Disable the TIM peripheral. + * @param __HANDLE__ TIM handle + * @retval None + */ +#define __HAL_TIM_DISABLE(__HANDLE__) \ + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ + } \ + } \ + } while(0) + +/** + * @brief Disable the TIM main Output. + * @param __HANDLE__ TIM handle + * @retval None + * @note The Main Output Enable of a timer instance is disabled only if all the CCx and CCxN channels have been + * disabled + */ +#define __HAL_TIM_MOE_DISABLE(__HANDLE__) \ + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ + } \ + } \ + } while(0) + +/** + * @brief Disable the TIM main Output. + * @param __HANDLE__ TIM handle + * @retval None + * @note The Main Output Enable of a timer instance is disabled unconditionally + */ +#define __HAL_TIM_MOE_DISABLE_UNCONDITIONALLY(__HANDLE__) (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE) + +/** @brief Enable the specified TIM interrupt. + * @param __HANDLE__ specifies the TIM Handle. + * @param __INTERRUPT__ specifies the TIM interrupt source to enable. + * This parameter can be one of the following values: + * @arg TIM_IT_UPDATE: Update interrupt + * @arg TIM_IT_CC1: Capture/Compare 1 interrupt + * @arg TIM_IT_CC2: Capture/Compare 2 interrupt + * @arg TIM_IT_CC3: Capture/Compare 3 interrupt + * @arg TIM_IT_CC4: Capture/Compare 4 interrupt + * @arg TIM_IT_COM: Commutation interrupt + * @arg TIM_IT_TRIGGER: Trigger interrupt + * @arg TIM_IT_BREAK: Break interrupt + * @retval None + */ +#define __HAL_TIM_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER |= (__INTERRUPT__)) + +/** @brief Disable the specified TIM interrupt. + * @param __HANDLE__ specifies the TIM Handle. + * @param __INTERRUPT__ specifies the TIM interrupt source to disable. + * This parameter can be one of the following values: + * @arg TIM_IT_UPDATE: Update interrupt + * @arg TIM_IT_CC1: Capture/Compare 1 interrupt + * @arg TIM_IT_CC2: Capture/Compare 2 interrupt + * @arg TIM_IT_CC3: Capture/Compare 3 interrupt + * @arg TIM_IT_CC4: Capture/Compare 4 interrupt + * @arg TIM_IT_COM: Commutation interrupt + * @arg TIM_IT_TRIGGER: Trigger interrupt + * @arg TIM_IT_BREAK: Break interrupt + * @retval None + */ +#define __HAL_TIM_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER &= ~(__INTERRUPT__)) + +/** @brief Enable the specified DMA request. + * @param __HANDLE__ specifies the TIM Handle. + * @param __DMA__ specifies the TIM DMA request to enable. + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: Update DMA request + * @arg TIM_DMA_CC1: Capture/Compare 1 DMA request + * @arg TIM_DMA_CC2: Capture/Compare 2 DMA request + * @arg TIM_DMA_CC3: Capture/Compare 3 DMA request + * @arg TIM_DMA_CC4: Capture/Compare 4 DMA request + * @arg TIM_DMA_COM: Commutation DMA request + * @arg TIM_DMA_TRIGGER: Trigger DMA request + * @retval None + */ +#define __HAL_TIM_ENABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER |= (__DMA__)) + +/** @brief Disable the specified DMA request. + * @param __HANDLE__ specifies the TIM Handle. + * @param __DMA__ specifies the TIM DMA request to disable. + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: Update DMA request + * @arg TIM_DMA_CC1: Capture/Compare 1 DMA request + * @arg TIM_DMA_CC2: Capture/Compare 2 DMA request + * @arg TIM_DMA_CC3: Capture/Compare 3 DMA request + * @arg TIM_DMA_CC4: Capture/Compare 4 DMA request + * @arg TIM_DMA_COM: Commutation DMA request + * @arg TIM_DMA_TRIGGER: Trigger DMA request + * @retval None + */ +#define __HAL_TIM_DISABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER &= ~(__DMA__)) + +/** @brief Check whether the specified TIM interrupt flag is set or not. + * @param __HANDLE__ specifies the TIM Handle. + * @param __FLAG__ specifies the TIM interrupt flag to check. + * This parameter can be one of the following values: + * @arg TIM_FLAG_UPDATE: Update interrupt flag + * @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag + * @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag + * @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag + * @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag + * @arg TIM_FLAG_COM: Commutation interrupt flag + * @arg TIM_FLAG_TRIGGER: Trigger interrupt flag + * @arg TIM_FLAG_BREAK: Break interrupt flag + * @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag + * @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag + * @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag + * @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_TIM_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR &(__FLAG__)) == (__FLAG__)) + +/** @brief Clear the specified TIM interrupt flag. + * @param __HANDLE__ specifies the TIM Handle. + * @param __FLAG__ specifies the TIM interrupt flag to clear. + * This parameter can be one of the following values: + * @arg TIM_FLAG_UPDATE: Update interrupt flag + * @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag + * @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag + * @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag + * @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag + * @arg TIM_FLAG_COM: Commutation interrupt flag + * @arg TIM_FLAG_TRIGGER: Trigger interrupt flag + * @arg TIM_FLAG_BREAK: Break interrupt flag + * @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag + * @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag + * @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag + * @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_TIM_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ~(__FLAG__)) + +/** + * @brief Check whether the specified TIM interrupt source is enabled or not. + * @param __HANDLE__ TIM handle + * @param __INTERRUPT__ specifies the TIM interrupt source to check. + * This parameter can be one of the following values: + * @arg TIM_IT_UPDATE: Update interrupt + * @arg TIM_IT_CC1: Capture/Compare 1 interrupt + * @arg TIM_IT_CC2: Capture/Compare 2 interrupt + * @arg TIM_IT_CC3: Capture/Compare 3 interrupt + * @arg TIM_IT_CC4: Capture/Compare 4 interrupt + * @arg TIM_IT_COM: Commutation interrupt + * @arg TIM_IT_TRIGGER: Trigger interrupt + * @arg TIM_IT_BREAK: Break interrupt + * @retval The state of TIM_IT (SET or RESET). + */ +#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) \ + == (__INTERRUPT__)) ? SET : RESET) + +/** @brief Clear the TIM interrupt pending bits. + * @param __HANDLE__ TIM handle + * @param __INTERRUPT__ specifies the interrupt pending bit to clear. + * This parameter can be one of the following values: + * @arg TIM_IT_UPDATE: Update interrupt + * @arg TIM_IT_CC1: Capture/Compare 1 interrupt + * @arg TIM_IT_CC2: Capture/Compare 2 interrupt + * @arg TIM_IT_CC3: Capture/Compare 3 interrupt + * @arg TIM_IT_CC4: Capture/Compare 4 interrupt + * @arg TIM_IT_COM: Commutation interrupt + * @arg TIM_IT_TRIGGER: Trigger interrupt + * @arg TIM_IT_BREAK: Break interrupt + * @retval None + */ +#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__)) + +/** + * @brief Indicates whether or not the TIM Counter is used as downcounter. + * @param __HANDLE__ TIM handle. + * @retval False (Counter used as upcounter) or True (Counter used as downcounter) + * @note This macro is particularly useful to get the counting mode when the timer operates in Center-aligned mode + * or Encoder mode. + */ +#define __HAL_TIM_IS_TIM_COUNTING_DOWN(__HANDLE__) (((__HANDLE__)->Instance->CR1 &(TIM_CR1_DIR)) == (TIM_CR1_DIR)) + +/** + * @brief Set the TIM Prescaler on runtime. + * @param __HANDLE__ TIM handle. + * @param __PRESC__ specifies the Prescaler new value. + * @retval None + */ +#define __HAL_TIM_SET_PRESCALER(__HANDLE__, __PRESC__) ((__HANDLE__)->Instance->PSC = (__PRESC__)) + +/** + * @brief Set the TIM Counter Register value on runtime. + * @param __HANDLE__ TIM handle. + * @param __COUNTER__ specifies the Counter register new value. + * @retval None + */ +#define __HAL_TIM_SET_COUNTER(__HANDLE__, __COUNTER__) ((__HANDLE__)->Instance->CNT = (__COUNTER__)) + +/** + * @brief Get the TIM Counter Register value on runtime. + * @param __HANDLE__ TIM handle. + * @retval 16-bit or 32-bit value of the timer counter register (TIMx_CNT) + */ +#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT) + +/** + * @brief Set the TIM Autoreload Register value on runtime without calling another time any Init function. + * @param __HANDLE__ TIM handle. + * @param __AUTORELOAD__ specifies the Counter register new value. + * @retval None + */ +#define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \ + do{ \ + (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ + (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ + } while(0) + +/** + * @brief Get the TIM Autoreload Register value on runtime. + * @param __HANDLE__ TIM handle. + * @retval 16-bit or 32-bit value of the timer auto-reload register(TIMx_ARR) + */ +#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) ((__HANDLE__)->Instance->ARR) + +/** + * @brief Set the TIM Clock Division value on runtime without calling another time any Init function. + * @param __HANDLE__ TIM handle. + * @param __CKD__ specifies the clock division value. + * This parameter can be one of the following value: + * @arg TIM_CLOCKDIVISION_DIV1: tDTS=tCK_INT + * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT + * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT + * @retval None + */ +#define __HAL_TIM_SET_CLOCKDIVISION(__HANDLE__, __CKD__) \ + do{ \ + (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ + (__HANDLE__)->Instance->CR1 |= (__CKD__); \ + (__HANDLE__)->Init.ClockDivision = (__CKD__); \ + } while(0) + +/** + * @brief Get the TIM Clock Division value on runtime. + * @param __HANDLE__ TIM handle. + * @retval The clock division can be one of the following values: + * @arg TIM_CLOCKDIVISION_DIV1: tDTS=tCK_INT + * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT + * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT + */ +#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) + +/** + * @brief Set the TIM Input Capture prescaler on runtime without calling another time HAL_TIM_IC_ConfigChannel() + * function. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param __ICPSC__ specifies the Input Capture4 prescaler new value. + * This parameter can be one of the following values: + * @arg TIM_ICPSC_DIV1: no prescaler + * @arg TIM_ICPSC_DIV2: capture is done once every 2 events + * @arg TIM_ICPSC_DIV4: capture is done once every 4 events + * @arg TIM_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +#define __HAL_TIM_SET_ICPRESCALER(__HANDLE__, __CHANNEL__, __ICPSC__) \ + do{ \ + TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ + } while(0) + +/** + * @brief Get the TIM Input Capture prescaler on runtime. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: get input capture 1 prescaler value + * @arg TIM_CHANNEL_2: get input capture 2 prescaler value + * @arg TIM_CHANNEL_3: get input capture 3 prescaler value + * @arg TIM_CHANNEL_4: get input capture 4 prescaler value + * @retval The input capture prescaler can be one of the following values: + * @arg TIM_ICPSC_DIV1: no prescaler + * @arg TIM_ICPSC_DIV2: capture is done once every 2 events + * @arg TIM_ICPSC_DIV4: capture is done once every 4 events + * @arg TIM_ICPSC_DIV8: capture is done once every 8 events + */ +#define __HAL_TIM_GET_ICPRESCALER(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC1PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? (((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC2PSC) >> 8U) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 & TIM_CCMR2_IC3PSC) :\ + (((__HANDLE__)->Instance->CCMR2 & TIM_CCMR2_IC4PSC)) >> 8U) + +/** + * @brief Set the TIM Capture Compare Register value on runtime without calling another time ConfigChannel function. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param __COMPARE__ specifies the Capture Compare register new value. + * @retval None + */ +#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ + ((__HANDLE__)->Instance->CCR4 = (__COMPARE__))) + +/** + * @brief Get the TIM Capture Compare Register value on runtime. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channel associated with the capture compare register + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: get capture/compare 1 register value + * @arg TIM_CHANNEL_2: get capture/compare 2 register value + * @arg TIM_CHANNEL_3: get capture/compare 3 register value + * @arg TIM_CHANNEL_4: get capture/compare 4 register value + * @retval 16-bit or 32-bit value of the capture/compare register (TIMx_CCRy) + */ +#define __HAL_TIM_GET_COMPARE(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ + ((__HANDLE__)->Instance->CCR4)) + +/** + * @brief Set the TIM Output compare preload. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval None + */ +#define __HAL_TIM_ENABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ + ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE)) + +/** + * @brief Reset the TIM Output compare preload. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval None + */ +#define __HAL_TIM_DISABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3PE) :\ + ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4PE)) + +/** + * @brief Enable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @note When fast mode is enabled an active edge on the trigger input acts + * like a compare match on CCx output. Delay to sample the trigger + * input and to activate CCx output is reduced to 3 clock cycles. + * @note Fast mode acts only if the channel is configured in PWM1 or PWM2 mode. + * @retval None + */ +#define __HAL_TIM_ENABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3FE) :\ + ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4FE)) + +/** + * @brief Disable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @note When fast mode is disabled CCx output behaves normally depending + * on counter and CCRx values even when the trigger is ON. The minimum + * delay to activate CCx output when an active edge occurs on the + * trigger input is 5 clock cycles. + * @retval None + */ +#define __HAL_TIM_DISABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE) :\ + ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE)) + +/** + * @brief Set the Update Request Source (URS) bit of the TIMx_CR1 register. + * @param __HANDLE__ TIM handle. + * @note When the URS bit of the TIMx_CR1 register is set, only counter + * overflow/underflow generates an update interrupt or DMA request (if + * enabled) + * @retval None + */ +#define __HAL_TIM_URS_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) + +/** + * @brief Reset the Update Request Source (URS) bit of the TIMx_CR1 register. + * @param __HANDLE__ TIM handle. + * @note When the URS bit of the TIMx_CR1 register is reset, any of the + * following events generate an update interrupt or DMA request (if + * enabled): + * _ Counter overflow underflow + * _ Setting the UG bit + * _ Update generation through the slave mode controller + * @retval None + */ +#define __HAL_TIM_URS_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) + +/** + * @brief Set the TIM Capture x input polarity on runtime. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param __POLARITY__ Polarity for TIx source + * @arg TIM_INPUTCHANNELPOLARITY_RISING: Rising Edge + * @arg TIM_INPUTCHANNELPOLARITY_FALLING: Falling Edge + * @arg TIM_INPUTCHANNELPOLARITY_BOTHEDGE: Rising and Falling Edge + * @retval None + */ +#define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ + do{ \ + TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ + }while(0) + +/** @brief Select the Capture/compare DMA request source. + * @param __HANDLE__ specifies the TIM Handle. + * @param __CCDMA__ specifies Capture/compare DMA request source + * This parameter can be one of the following values: + * @arg TIM_CCDMAREQUEST_CC: CCx DMA request generated on Capture/Compare event + * @arg TIM_CCDMAREQUEST_UPDATE: CCx DMA request generated on Update event + * @retval None + */ +#define __HAL_TIM_SELECT_CCDMAREQUEST(__HANDLE__, __CCDMA__) \ + MODIFY_REG((__HANDLE__)->Instance->CR2, TIM_CR2_CCDS, (__CCDMA__)) + +/** + * @} + */ +/* End of exported macros ----------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup TIM_Private_Constants TIM Private Constants + * @{ + */ +/* The counter of a timer instance is disabled only if all the CCx and CCxN + channels have been disabled */ +#define TIM_CCER_CCxE_MASK ((uint32_t)(TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E)) +#define TIM_CCER_CCxNE_MASK ((uint32_t)(TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) +/** + * @} + */ +/* End of private constants --------------------------------------------------*/ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup TIM_Private_Macros TIM Private Macros + * @{ + */ +#define IS_TIM_CLEARINPUT_SOURCE(__MODE__) (((__MODE__) == TIM_CLEARINPUTSOURCE_NONE) || \ + ((__MODE__) == TIM_CLEARINPUTSOURCE_ETR)) + +#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ + ((__BASE__) == TIM_DMABASE_CR2) || \ + ((__BASE__) == TIM_DMABASE_SMCR) || \ + ((__BASE__) == TIM_DMABASE_DIER) || \ + ((__BASE__) == TIM_DMABASE_SR) || \ + ((__BASE__) == TIM_DMABASE_EGR) || \ + ((__BASE__) == TIM_DMABASE_CCMR1) || \ + ((__BASE__) == TIM_DMABASE_CCMR2) || \ + ((__BASE__) == TIM_DMABASE_CCER) || \ + ((__BASE__) == TIM_DMABASE_CNT) || \ + ((__BASE__) == TIM_DMABASE_PSC) || \ + ((__BASE__) == TIM_DMABASE_ARR) || \ + ((__BASE__) == TIM_DMABASE_RCR) || \ + ((__BASE__) == TIM_DMABASE_CCR1) || \ + ((__BASE__) == TIM_DMABASE_CCR2) || \ + ((__BASE__) == TIM_DMABASE_CCR3) || \ + ((__BASE__) == TIM_DMABASE_CCR4) || \ + ((__BASE__) == TIM_DMABASE_BDTR)) + +#define IS_TIM_EVENT_SOURCE(__SOURCE__) ((((__SOURCE__) & 0xFFFFFF00U) == 0x00000000U) && ((__SOURCE__) != 0x00000000U)) + +#define IS_TIM_COUNTER_MODE(__MODE__) (((__MODE__) == TIM_COUNTERMODE_UP) || \ + ((__MODE__) == TIM_COUNTERMODE_DOWN) || \ + ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED1) || \ + ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED2) || \ + ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED3)) + +#define IS_TIM_CLOCKDIVISION_DIV(__DIV__) (((__DIV__) == TIM_CLOCKDIVISION_DIV1) || \ + ((__DIV__) == TIM_CLOCKDIVISION_DIV2) || \ + ((__DIV__) == TIM_CLOCKDIVISION_DIV4)) + +#define IS_TIM_AUTORELOAD_PRELOAD(PRELOAD) (((PRELOAD) == TIM_AUTORELOAD_PRELOAD_DISABLE) || \ + ((PRELOAD) == TIM_AUTORELOAD_PRELOAD_ENABLE)) + +#define IS_TIM_FAST_STATE(__STATE__) (((__STATE__) == TIM_OCFAST_DISABLE) || \ + ((__STATE__) == TIM_OCFAST_ENABLE)) + +#define IS_TIM_OC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_OCPOLARITY_HIGH) || \ + ((__POLARITY__) == TIM_OCPOLARITY_LOW)) + +#define IS_TIM_OCN_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_OCNPOLARITY_HIGH) || \ + ((__POLARITY__) == TIM_OCNPOLARITY_LOW)) + +#define IS_TIM_OCIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCIDLESTATE_SET) || \ + ((__STATE__) == TIM_OCIDLESTATE_RESET)) + +#define IS_TIM_OCNIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCNIDLESTATE_SET) || \ + ((__STATE__) == TIM_OCNIDLESTATE_RESET)) + +#define IS_TIM_ENCODERINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_RISING) || \ + ((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_FALLING)) + +#define IS_TIM_IC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ICPOLARITY_RISING) || \ + ((__POLARITY__) == TIM_ICPOLARITY_FALLING) || \ + ((__POLARITY__) == TIM_ICPOLARITY_BOTHEDGE)) + +#define IS_TIM_IC_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_ICSELECTION_DIRECTTI) || \ + ((__SELECTION__) == TIM_ICSELECTION_INDIRECTTI) || \ + ((__SELECTION__) == TIM_ICSELECTION_TRC)) + +#define IS_TIM_IC_PRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_ICPSC_DIV1) || \ + ((__PRESCALER__) == TIM_ICPSC_DIV2) || \ + ((__PRESCALER__) == TIM_ICPSC_DIV4) || \ + ((__PRESCALER__) == TIM_ICPSC_DIV8)) + +#define IS_TIM_OPM_MODE(__MODE__) (((__MODE__) == TIM_OPMODE_SINGLE) || \ + ((__MODE__) == TIM_OPMODE_REPETITIVE)) + +#define IS_TIM_ENCODER_MODE(__MODE__) (((__MODE__) == TIM_ENCODERMODE_TI1) || \ + ((__MODE__) == TIM_ENCODERMODE_TI2) || \ + ((__MODE__) == TIM_ENCODERMODE_TI12)) + +#define IS_TIM_DMA_SOURCE(__SOURCE__) ((((__SOURCE__) & 0xFFFF80FFU) == 0x00000000U) && ((__SOURCE__) != 0x00000000U)) + +#define IS_TIM_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ + ((__CHANNEL__) == TIM_CHANNEL_2) || \ + ((__CHANNEL__) == TIM_CHANNEL_3) || \ + ((__CHANNEL__) == TIM_CHANNEL_4) || \ + ((__CHANNEL__) == TIM_CHANNEL_ALL)) + +#define IS_TIM_OPM_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ + ((__CHANNEL__) == TIM_CHANNEL_2)) + +#define IS_TIM_PERIOD(__HANDLE__, __PERIOD__) ((IS_TIM_32B_COUNTER_INSTANCE(((__HANDLE__)->Instance)) == 0U) ? \ + (((__PERIOD__) > 0U) && ((__PERIOD__) <= 0x0000FFFFU)) : \ + ((__PERIOD__) > 0U)) + +#define IS_TIM_COMPLEMENTARY_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ + ((__CHANNEL__) == TIM_CHANNEL_2) || \ + ((__CHANNEL__) == TIM_CHANNEL_3)) + +#define IS_TIM_CLOCKSOURCE(__CLOCK__) (((__CLOCK__) == TIM_CLOCKSOURCE_INTERNAL) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ETRMODE1) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ETRMODE2) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_TI1ED) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_TI1) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_TI2) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ITR0) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ITR1) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ITR2) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ITR3)) + +#define IS_TIM_CLOCKPOLARITY(__POLARITY__) (((__POLARITY__) == TIM_CLOCKPOLARITY_INVERTED) || \ + ((__POLARITY__) == TIM_CLOCKPOLARITY_NONINVERTED) || \ + ((__POLARITY__) == TIM_CLOCKPOLARITY_RISING) || \ + ((__POLARITY__) == TIM_CLOCKPOLARITY_FALLING) || \ + ((__POLARITY__) == TIM_CLOCKPOLARITY_BOTHEDGE)) + +#define IS_TIM_CLOCKPRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV1) || \ + ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV2) || \ + ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV4) || \ + ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV8)) + +#define IS_TIM_CLOCKFILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) + +#define IS_TIM_CLEARINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_CLEARINPUTPOLARITY_INVERTED) || \ + ((__POLARITY__) == TIM_CLEARINPUTPOLARITY_NONINVERTED)) + +#define IS_TIM_CLEARINPUT_PRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV1) || \ + ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV2) || \ + ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV4) || \ + ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV8)) + +#define IS_TIM_CLEARINPUT_FILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) + +#define IS_TIM_OSSR_STATE(__STATE__) (((__STATE__) == TIM_OSSR_ENABLE) || \ + ((__STATE__) == TIM_OSSR_DISABLE)) + +#define IS_TIM_OSSI_STATE(__STATE__) (((__STATE__) == TIM_OSSI_ENABLE) || \ + ((__STATE__) == TIM_OSSI_DISABLE)) + +#define IS_TIM_LOCK_LEVEL(__LEVEL__) (((__LEVEL__) == TIM_LOCKLEVEL_OFF) || \ + ((__LEVEL__) == TIM_LOCKLEVEL_1) || \ + ((__LEVEL__) == TIM_LOCKLEVEL_2) || \ + ((__LEVEL__) == TIM_LOCKLEVEL_3)) + +#define IS_TIM_BREAK_FILTER(__BRKFILTER__) ((__BRKFILTER__) <= 0xFUL) + +#define IS_TIM_BREAK_STATE(__STATE__) (((__STATE__) == TIM_BREAK_ENABLE) || \ + ((__STATE__) == TIM_BREAK_DISABLE)) + +#define IS_TIM_BREAK_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_BREAKPOLARITY_LOW) || \ + ((__POLARITY__) == TIM_BREAKPOLARITY_HIGH)) + +#define IS_TIM_AUTOMATIC_OUTPUT_STATE(__STATE__) (((__STATE__) == TIM_AUTOMATICOUTPUT_ENABLE) || \ + ((__STATE__) == TIM_AUTOMATICOUTPUT_DISABLE)) + +#define IS_TIM_TRGO_SOURCE(__SOURCE__) (((__SOURCE__) == TIM_TRGO_RESET) || \ + ((__SOURCE__) == TIM_TRGO_ENABLE) || \ + ((__SOURCE__) == TIM_TRGO_UPDATE) || \ + ((__SOURCE__) == TIM_TRGO_OC1) || \ + ((__SOURCE__) == TIM_TRGO_OC1REF) || \ + ((__SOURCE__) == TIM_TRGO_OC2REF) || \ + ((__SOURCE__) == TIM_TRGO_OC3REF) || \ + ((__SOURCE__) == TIM_TRGO_OC4REF)) + +#define IS_TIM_MSM_STATE(__STATE__) (((__STATE__) == TIM_MASTERSLAVEMODE_ENABLE) || \ + ((__STATE__) == TIM_MASTERSLAVEMODE_DISABLE)) + +#define IS_TIM_SLAVE_MODE(__MODE__) (((__MODE__) == TIM_SLAVEMODE_DISABLE) || \ + ((__MODE__) == TIM_SLAVEMODE_RESET) || \ + ((__MODE__) == TIM_SLAVEMODE_GATED) || \ + ((__MODE__) == TIM_SLAVEMODE_TRIGGER) || \ + ((__MODE__) == TIM_SLAVEMODE_EXTERNAL1)) + +#define IS_TIM_PWM_MODE(__MODE__) (((__MODE__) == TIM_OCMODE_PWM1) || \ + ((__MODE__) == TIM_OCMODE_PWM2)) + +#define IS_TIM_OC_MODE(__MODE__) (((__MODE__) == TIM_OCMODE_TIMING) || \ + ((__MODE__) == TIM_OCMODE_ACTIVE) || \ + ((__MODE__) == TIM_OCMODE_INACTIVE) || \ + ((__MODE__) == TIM_OCMODE_TOGGLE) || \ + ((__MODE__) == TIM_OCMODE_FORCED_ACTIVE) || \ + ((__MODE__) == TIM_OCMODE_FORCED_INACTIVE)) + +#define IS_TIM_TRIGGER_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_TS_ITR0) || \ + ((__SELECTION__) == TIM_TS_ITR1) || \ + ((__SELECTION__) == TIM_TS_ITR2) || \ + ((__SELECTION__) == TIM_TS_ITR3) || \ + ((__SELECTION__) == TIM_TS_TI1F_ED) || \ + ((__SELECTION__) == TIM_TS_TI1FP1) || \ + ((__SELECTION__) == TIM_TS_TI2FP2) || \ + ((__SELECTION__) == TIM_TS_ETRF)) + +#define IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_TS_ITR0) || \ + ((__SELECTION__) == TIM_TS_ITR1) || \ + ((__SELECTION__) == TIM_TS_ITR2) || \ + ((__SELECTION__) == TIM_TS_ITR3) || \ + ((__SELECTION__) == TIM_TS_NONE)) + +#define IS_TIM_TRIGGERPOLARITY(__POLARITY__) (((__POLARITY__) == TIM_TRIGGERPOLARITY_INVERTED ) || \ + ((__POLARITY__) == TIM_TRIGGERPOLARITY_NONINVERTED) || \ + ((__POLARITY__) == TIM_TRIGGERPOLARITY_RISING ) || \ + ((__POLARITY__) == TIM_TRIGGERPOLARITY_FALLING ) || \ + ((__POLARITY__) == TIM_TRIGGERPOLARITY_BOTHEDGE )) + +#define IS_TIM_TRIGGERPRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV1) || \ + ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV2) || \ + ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV4) || \ + ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV8)) + +#define IS_TIM_TRIGGERFILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) + +#define IS_TIM_TI1SELECTION(__TI1SELECTION__) (((__TI1SELECTION__) == TIM_TI1SELECTION_CH1) || \ + ((__TI1SELECTION__) == TIM_TI1SELECTION_XORCOMBINATION)) + +#define IS_TIM_DMA_LENGTH(__LENGTH__) (((__LENGTH__) == TIM_DMABURSTLENGTH_1TRANSFER) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_2TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_3TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_4TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_5TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_6TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_7TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_8TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_9TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_10TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_11TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_12TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_13TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_14TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_15TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_16TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_17TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_18TRANSFERS)) + +#define IS_TIM_DMA_DATA_LENGTH(LENGTH) (((LENGTH) >= 0x1U) && ((LENGTH) < 0x10000U)) + +#define IS_TIM_IC_FILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) + +#define IS_TIM_DEADTIME(__DEADTIME__) ((__DEADTIME__) <= 0xFFU) + +#define IS_TIM_SLAVEMODE_TRIGGER_ENABLED(__TRIGGER__) ((__TRIGGER__) == TIM_SLAVEMODE_TRIGGER) + +#define TIM_SET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__, __ICPSC__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ + ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) + +#define TIM_RESET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC) :\ + ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC)) + +#define TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ + ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) + +#define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ + ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) + +#define TIM_CHANNEL_STATE_GET(__HANDLE__, __CHANNEL__)\ + (((__CHANNEL__) == TIM_CHANNEL_1) ? (__HANDLE__)->ChannelState[0] :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? (__HANDLE__)->ChannelState[1] :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? (__HANDLE__)->ChannelState[2] :\ + (__HANDLE__)->ChannelState[3]) + +#define TIM_CHANNEL_STATE_SET(__HANDLE__, __CHANNEL__, __CHANNEL_STATE__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->ChannelState[0] = (__CHANNEL_STATE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->ChannelState[1] = (__CHANNEL_STATE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->ChannelState[2] = (__CHANNEL_STATE__)) :\ + ((__HANDLE__)->ChannelState[3] = (__CHANNEL_STATE__))) + +#define TIM_CHANNEL_STATE_SET_ALL(__HANDLE__, __CHANNEL_STATE__)\ + do {\ + (__HANDLE__)->ChannelState[0] = (__CHANNEL_STATE__);\ + (__HANDLE__)->ChannelState[1] = (__CHANNEL_STATE__);\ + (__HANDLE__)->ChannelState[2] = (__CHANNEL_STATE__);\ + (__HANDLE__)->ChannelState[3] = (__CHANNEL_STATE__);\ + } while(0) + +#define TIM_CHANNEL_N_STATE_GET(__HANDLE__, __CHANNEL__)\ + (((__CHANNEL__) == TIM_CHANNEL_1) ? (__HANDLE__)->ChannelNState[0] :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? (__HANDLE__)->ChannelNState[1] :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? (__HANDLE__)->ChannelNState[2] :\ + (__HANDLE__)->ChannelNState[3]) + +#define TIM_CHANNEL_N_STATE_SET(__HANDLE__, __CHANNEL__, __CHANNEL_STATE__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->ChannelNState[0] = (__CHANNEL_STATE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->ChannelNState[1] = (__CHANNEL_STATE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->ChannelNState[2] = (__CHANNEL_STATE__)) :\ + ((__HANDLE__)->ChannelNState[3] = (__CHANNEL_STATE__))) + +#define TIM_CHANNEL_N_STATE_SET_ALL(__HANDLE__, __CHANNEL_STATE__)\ + do {\ + (__HANDLE__)->ChannelNState[0] = \ + (__CHANNEL_STATE__); \ + (__HANDLE__)->ChannelNState[1] = \ + (__CHANNEL_STATE__); \ + (__HANDLE__)->ChannelNState[2] = \ + (__CHANNEL_STATE__); \ + (__HANDLE__)->ChannelNState[3] = \ + (__CHANNEL_STATE__); \ + } while(0) + +/** + * @} + */ +/* End of private macros -----------------------------------------------------*/ + +/* Include TIM HAL Extended module */ +#include "stm32f4xx_hal_tim_ex.h" + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup TIM_Exported_Functions TIM Exported Functions + * @{ + */ + +/** @addtogroup TIM_Exported_Functions_Group1 TIM Time Base functions + * @brief Time Base functions + * @{ + */ +/* Time Base functions ********************************************************/ +HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, const uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group2 TIM Output Compare functions + * @brief TIM Output Compare functions + * @{ + */ +/* Timer Output Compare functions *********************************************/ +HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, + uint16_t Length); +HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group3 TIM PWM functions + * @brief TIM PWM functions + * @{ + */ +/* Timer PWM functions ********************************************************/ +HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, + uint16_t Length); +HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group4 TIM Input Capture functions + * @brief TIM Input Capture functions + * @{ + */ +/* Timer Input Capture functions **********************************************/ +HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group5 TIM One Pulse functions + * @brief TIM One Pulse functions + * @{ + */ +/* Timer One Pulse functions **************************************************/ +HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode); +HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group6 TIM Encoder functions + * @brief TIM Encoder functions + * @{ + */ +/* Timer Encoder functions ****************************************************/ +HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, const TIM_Encoder_InitTypeDef *sConfig); +HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group7 TIM IRQ handler management + * @brief IRQ handler management + * @{ + */ +/* Interrupt Handler functions ***********************************************/ +void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim); +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions + * @brief Peripheral Control functions + * @{ + */ +/* Control functions *********************************************************/ +HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, const TIM_OC_InitTypeDef *sConfig, + uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, const TIM_OC_InitTypeDef *sConfig, + uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, const TIM_IC_InitTypeDef *sConfig, + uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel); +HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, + const TIM_ClearInputConfigTypeDef *sClearInputConfig, + uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, const TIM_ClockConfigTypeDef *sClockSourceConfig); +HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection); +HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, const TIM_SlaveConfigTypeDef *sSlaveConfig); +HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, const TIM_SlaveConfigTypeDef *sSlaveConfig); +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, const uint32_t *BurstBuffer, + uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_MultiWriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, const uint32_t *BurstBuffer, + uint32_t BurstLength, uint32_t DataLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_MultiReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, + uint32_t BurstLength, uint32_t DataLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); +HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource); +uint32_t HAL_TIM_ReadCapturedValue(const TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions + * @brief TIM Callbacks functions + * @{ + */ +/* Callback in non blocking modes (Interrupt and DMA) *************************/ +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim); + +/* Callbacks Register/UnRegister functions ***********************************/ +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions + * @brief Peripheral State functions + * @{ + */ +/* Peripheral State functions ************************************************/ +HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(const TIM_HandleTypeDef *htim); +HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(const TIM_HandleTypeDef *htim); +HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(const TIM_HandleTypeDef *htim); +HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(const TIM_HandleTypeDef *htim); +HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(const TIM_HandleTypeDef *htim); +HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(const TIM_HandleTypeDef *htim); + +/* Peripheral Channel state functions ************************************************/ +HAL_TIM_ActiveChannel HAL_TIM_GetActiveChannel(const TIM_HandleTypeDef *htim); +HAL_TIM_ChannelStateTypeDef HAL_TIM_GetChannelState(const TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_TIM_DMABurstStateTypeDef HAL_TIM_DMABurstState(const TIM_HandleTypeDef *htim); +/** + * @} + */ + +/** + * @} + */ +/* End of exported functions -------------------------------------------------*/ + +/* Private functions----------------------------------------------------------*/ +/** @defgroup TIM_Private_Functions TIM Private Functions + * @{ + */ +void TIM_Base_SetConfig(TIM_TypeDef *TIMx, const TIM_Base_InitTypeDef *Structure); +void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t TIM_ICFilter); +void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config); +void TIM_ETR_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ExtTRGPrescaler, + uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter); + +void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma); +void TIM_DMAError(DMA_HandleTypeDef *hdma); +void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma); +void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma); +void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +void TIM_ResetCallback(TIM_HandleTypeDef *htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @} + */ +/* End of private functions --------------------------------------------------*/ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32F4xx_HAL_TIM_H */ diff --git a/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h new file mode 100644 index 0000000..4f1d01b --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h @@ -0,0 +1,357 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_tim_ex.h + * @author MCD Application Team + * @brief Header file of TIM HAL Extended module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32F4xx_HAL_TIM_EX_H +#define STM32F4xx_HAL_TIM_EX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup TIMEx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup TIMEx_Exported_Types TIM Extended Exported Types + * @{ + */ + +/** + * @brief TIM Hall sensor Configuration Structure definition + */ + +typedef struct +{ + uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + + uint32_t IC1Prescaler; /*!< Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ + + uint32_t IC1Filter; /*!< Specifies the input capture filter. + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ + + uint32_t Commutation_Delay; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. + This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ +} TIM_HallSensor_InitTypeDef; +/** + * @} + */ +/* End of exported types -----------------------------------------------------*/ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup TIMEx_Exported_Constants TIM Extended Exported Constants + * @{ + */ + +/** @defgroup TIMEx_Remap TIM Extended Remapping + * @{ + */ +#if defined (TIM2) +#if defined(TIM8) +#define TIM_TIM2_TIM8_TRGO 0x00000000U /*!< TIM2 ITR1 is connected to TIM8 TRGO */ +#endif /* TIM8 */ +#define TIM_TIM2_ETH_PTP TIM_OR_ITR1_RMP_0 /*!< TIM2 ITR1 is connected to PTP trigger output */ +#define TIM_TIM2_USBFS_SOF TIM_OR_ITR1_RMP_1 /*!< TIM2 ITR1 is connected to OTG FS SOF */ +#define TIM_TIM2_USBHS_SOF (TIM_OR_ITR1_RMP_1 | TIM_OR_ITR1_RMP_0) /*!< TIM2 ITR1 is connected to OTG HS SOF */ +#endif /* TIM2 */ + +#define TIM_TIM5_GPIO 0x00000000U /*!< TIM5 TI4 is connected to GPIO */ +#define TIM_TIM5_LSI TIM_OR_TI4_RMP_0 /*!< TIM5 TI4 is connected to LSI */ +#define TIM_TIM5_LSE TIM_OR_TI4_RMP_1 /*!< TIM5 TI4 is connected to LSE */ +#define TIM_TIM5_RTC (TIM_OR_TI4_RMP_1 | TIM_OR_TI4_RMP_0) /*!< TIM5 TI4 is connected to the RTC wakeup interrupt */ + +#define TIM_TIM11_GPIO 0x00000000U /*!< TIM11 TI1 is connected to GPIO */ +#define TIM_TIM11_HSE TIM_OR_TI1_RMP_1 /*!< TIM11 TI1 is connected to HSE_RTC clock */ +#if defined(SPDIFRX) +#define TIM_TIM11_SPDIFRX TIM_OR_TI1_RMP_0 /*!< TIM11 TI1 is connected to SPDIFRX_FRAME_SYNC */ +#endif /* SPDIFRX*/ + +#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) +#define LPTIM_REMAP_MASK 0x10000000U + +#define TIM_TIM9_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM9 ITR1 is connected to TIM3 TRGO */ +#define TIM_TIM9_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM9_ITR1_RMP) /*!< TIM9 ITR1 is connected to LPTIM1 output */ + +#define TIM_TIM5_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM5 ITR1 is connected to TIM3 TRGO */ +#define TIM_TIM5_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM5_ITR1_RMP) /*!< TIM5 ITR1 is connected to LPTIM1 output */ + +#define TIM_TIM1_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM1 ITR2 is connected to TIM3 TRGO */ +#define TIM_TIM1_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM1_ITR2_RMP) /*!< TIM1 ITR2 is connected to LPTIM1 output */ +#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM5_ITR1_RMP */ +/** + * @} + */ + +/** + * @} + */ +/* End of exported constants -------------------------------------------------*/ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup TIMEx_Exported_Macros TIM Extended Exported Macros + * @{ + */ + +/** + * @} + */ +/* End of exported macro -----------------------------------------------------*/ + +/* Private macro -------------------------------------------------------------*/ +/** @defgroup TIMEx_Private_Macros TIM Extended Private Macros + * @{ + */ +#if defined(SPDIFRX) +#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ + ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ + ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ + ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ + (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ + ((TIM_REMAP) == TIM_TIM5_LSI) || \ + ((TIM_REMAP) == TIM_TIM5_LSE) || \ + ((TIM_REMAP) == TIM_TIM5_RTC))) || \ + (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ + ((TIM_REMAP) == TIM_TIM11_SPDIFRX) || \ + ((TIM_REMAP) == TIM_TIM11_HSE)))) +#elif defined(TIM2) +#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) +#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ + ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ + ((TIM_REMAP) == TIM_TIM2_ETH_PTP) || \ + ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ + ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ + (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ + ((TIM_REMAP) == TIM_TIM5_LSI) || \ + ((TIM_REMAP) == TIM_TIM5_LSE) || \ + ((TIM_REMAP) == TIM_TIM5_RTC))) || \ + (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ + ((TIM_REMAP) == TIM_TIM11_HSE))) || \ + (((INSTANCE) == TIM1) && (((TIM_REMAP) == TIM_TIM1_TIM3_TRGO) || \ + ((TIM_REMAP) == TIM_TIM1_LPTIM))) || \ + (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_TIM3_TRGO) || \ + ((TIM_REMAP) == TIM_TIM5_LPTIM))) || \ + (((INSTANCE) == TIM9) && (((TIM_REMAP) == TIM_TIM9_TIM3_TRGO) || \ + ((TIM_REMAP) == TIM_TIM9_LPTIM)))) +#elif defined(TIM8) +#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ + ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ + ((TIM_REMAP) == TIM_TIM2_ETH_PTP) || \ + ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ + ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ + (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ + ((TIM_REMAP) == TIM_TIM5_LSI) || \ + ((TIM_REMAP) == TIM_TIM5_LSE) || \ + ((TIM_REMAP) == TIM_TIM5_RTC))) || \ + (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ + ((TIM_REMAP) == TIM_TIM11_HSE)))) +#else +#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ + ((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_ETH_PTP) || \ + ((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ + ((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ + (((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ + ((TIM_REMAP) == TIM_TIM5_LSI) || \ + ((TIM_REMAP) == TIM_TIM5_LSE) || \ + ((TIM_REMAP) == TIM_TIM5_RTC))) || \ + (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ + ((TIM_REMAP) == TIM_TIM11_HSE)))) +#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM5_ITR1_RMP */ +#else +#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ + ((((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ + ((TIM_REMAP) == TIM_TIM5_LSI) || \ + ((TIM_REMAP) == TIM_TIM5_LSE) || \ + ((TIM_REMAP) == TIM_TIM5_RTC))) || \ + (((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ + ((TIM_REMAP) == TIM_TIM11_HSE)))) +#endif /* SPDIFRX */ + +/** + * @} + */ +/* End of private macro ------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup TIMEx_Exported_Functions TIM Extended Exported Functions + * @{ + */ + +/** @addtogroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions + * @brief Timer Hall Sensor functions + * @{ + */ +/* Timer Hall Sensor functions **********************************************/ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, const TIM_HallSensor_InitTypeDef *sConfig); +HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim); + +void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim); + +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim); +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions + * @brief Timer Complementary Output Compare functions + * @{ + */ +/* Timer Complementary Output Compare functions *****************************/ +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); + +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); + +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, + uint16_t Length); +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions + * @brief Timer Complementary PWM functions + * @{ + */ +/* Timer Complementary PWM functions ****************************************/ +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); + +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, + uint16_t Length); +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions + * @brief Timer Complementary One Pulse functions + * @{ + */ +/* Timer Complementary One Pulse functions **********************************/ +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel); + +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions + * @brief Peripheral Control functions + * @{ + */ +/* Extended Control functions ************************************************/ +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, + const TIM_MasterConfigTypeDef *sMasterConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, + const TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); +HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap); +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group6 Extended Callbacks functions + * @brief Extended Callbacks functions + * @{ + */ +/* Extended Callback **********************************************************/ +void HAL_TIMEx_CommutCallback(TIM_HandleTypeDef *htim); +void HAL_TIMEx_CommutHalfCpltCallback(TIM_HandleTypeDef *htim); +void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim); +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group7 Extended Peripheral State functions + * @brief Extended Peripheral State functions + * @{ + */ +/* Extended Peripheral State functions ***************************************/ +HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(const TIM_HandleTypeDef *htim); +HAL_TIM_ChannelStateTypeDef HAL_TIMEx_GetChannelNState(const TIM_HandleTypeDef *htim, uint32_t ChannelN); +/** + * @} + */ + +/** + * @} + */ +/* End of exported functions -------------------------------------------------*/ + +/* Private functions----------------------------------------------------------*/ +/** @addtogroup TIMEx_Private_Functions TIM Extended Private Functions + * @{ + */ +void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma); +void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma); +/** + * @} + */ +/* End of private functions --------------------------------------------------*/ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /* STM32F4xx_HAL_TIM_EX_H */ diff --git a/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h new file mode 100644 index 0000000..e6ce82f --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h @@ -0,0 +1,909 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_uart.h + * @author MCD Application Team + * @brief Header file of UART HAL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_UART_H +#define __STM32F4xx_HAL_UART_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup UART + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup UART_Exported_Types UART Exported Types + * @{ + */ + +/** + * @brief UART Init Structure definition + */ +typedef struct +{ + uint32_t BaudRate; /*!< This member configures the UART communication baud rate. + The baud rate is computed using the following formula: + - IntegerDivider = ((PCLKx) / (8 * (OVR8+1) * (huart->Init.BaudRate))) + - FractionalDivider = ((IntegerDivider - ((uint32_t) IntegerDivider)) * 8 * (OVR8+1)) + 0.5 + Where OVR8 is the "oversampling by 8 mode" configuration bit in the CR1 register. */ + + uint32_t WordLength; /*!< Specifies the number of data bits transmitted or received in a frame. + This parameter can be a value of @ref UART_Word_Length */ + + uint32_t StopBits; /*!< Specifies the number of stop bits transmitted. + This parameter can be a value of @ref UART_Stop_Bits */ + + uint32_t Parity; /*!< Specifies the parity mode. + This parameter can be a value of @ref UART_Parity + @note When parity is enabled, the computed parity is inserted + at the MSB position of the transmitted data (9th bit when + the word length is set to 9 data bits; 8th bit when the + word length is set to 8 data bits). */ + + uint32_t Mode; /*!< Specifies whether the Receive or Transmit mode is enabled or disabled. + This parameter can be a value of @ref UART_Mode */ + + uint32_t HwFlowCtl; /*!< Specifies whether the hardware flow control mode is enabled or disabled. + This parameter can be a value of @ref UART_Hardware_Flow_Control */ + + uint32_t OverSampling; /*!< Specifies whether the Over sampling 8 is enabled or disabled, to achieve higher speed (up to fPCLK/8). + This parameter can be a value of @ref UART_Over_Sampling */ +} UART_InitTypeDef; + +/** + * @brief HAL UART State structures definition + * @note HAL UART State value is a combination of 2 different substates: gState and RxState. + * - gState contains UART state information related to global Handle management + * and also information related to Tx operations. + * gState value coding follow below described bitmap : + * b7-b6 Error information + * 00 : No Error + * 01 : (Not Used) + * 10 : Timeout + * 11 : Error + * b5 Peripheral initialization status + * 0 : Reset (Peripheral not initialized) + * 1 : Init done (Peripheral initialized. HAL UART Init function already called) + * b4-b3 (not used) + * xx : Should be set to 00 + * b2 Intrinsic process state + * 0 : Ready + * 1 : Busy (Peripheral busy with some configuration or internal operations) + * b1 (not used) + * x : Should be set to 0 + * b0 Tx state + * 0 : Ready (no Tx operation ongoing) + * 1 : Busy (Tx operation ongoing) + * - RxState contains information related to Rx operations. + * RxState value coding follow below described bitmap : + * b7-b6 (not used) + * xx : Should be set to 00 + * b5 Peripheral initialization status + * 0 : Reset (Peripheral not initialized) + * 1 : Init done (Peripheral initialized) + * b4-b2 (not used) + * xxx : Should be set to 000 + * b1 Rx state + * 0 : Ready (no Rx operation ongoing) + * 1 : Busy (Rx operation ongoing) + * b0 (not used) + * x : Should be set to 0. + */ +typedef enum +{ + HAL_UART_STATE_RESET = 0x00U, /*!< Peripheral is not yet Initialized + Value is allowed for gState and RxState */ + HAL_UART_STATE_READY = 0x20U, /*!< Peripheral Initialized and ready for use + Value is allowed for gState and RxState */ + HAL_UART_STATE_BUSY = 0x24U, /*!< an internal process is ongoing + Value is allowed for gState only */ + HAL_UART_STATE_BUSY_TX = 0x21U, /*!< Data Transmission process is ongoing + Value is allowed for gState only */ + HAL_UART_STATE_BUSY_RX = 0x22U, /*!< Data Reception process is ongoing + Value is allowed for RxState only */ + HAL_UART_STATE_BUSY_TX_RX = 0x23U, /*!< Data Transmission and Reception process is ongoing + Not to be used for neither gState nor RxState. + Value is result of combination (Or) between gState and RxState values */ + HAL_UART_STATE_TIMEOUT = 0xA0U, /*!< Timeout state + Value is allowed for gState only */ + HAL_UART_STATE_ERROR = 0xE0U /*!< Error + Value is allowed for gState only */ +} HAL_UART_StateTypeDef; + +/** + * @brief HAL UART Reception type definition + * @note HAL UART Reception type value aims to identify which type of Reception is ongoing. + * This parameter can be a value of @ref UART_Reception_Type_Values : + * HAL_UART_RECEPTION_STANDARD = 0x00U, + * HAL_UART_RECEPTION_TOIDLE = 0x01U, + */ +typedef uint32_t HAL_UART_RxTypeTypeDef; + +/** + * @brief HAL UART Rx Event type definition + * @note HAL UART Rx Event type value aims to identify which type of Event has occurred + * leading to call of the RxEvent callback. + * This parameter can be a value of @ref UART_RxEvent_Type_Values : + * HAL_UART_RXEVENT_TC = 0x00U, + * HAL_UART_RXEVENT_HT = 0x01U, + * HAL_UART_RXEVENT_IDLE = 0x02U, + */ +typedef uint32_t HAL_UART_RxEventTypeTypeDef; + +/** + * @brief UART handle Structure definition + */ +typedef struct __UART_HandleTypeDef +{ + USART_TypeDef *Instance; /*!< UART registers base address */ + + UART_InitTypeDef Init; /*!< UART communication parameters */ + + const uint8_t *pTxBuffPtr; /*!< Pointer to UART Tx transfer Buffer */ + + uint16_t TxXferSize; /*!< UART Tx Transfer size */ + + __IO uint16_t TxXferCount; /*!< UART Tx Transfer Counter */ + + uint8_t *pRxBuffPtr; /*!< Pointer to UART Rx transfer Buffer */ + + uint16_t RxXferSize; /*!< UART Rx Transfer size */ + + __IO uint16_t RxXferCount; /*!< UART Rx Transfer Counter */ + + __IO HAL_UART_RxTypeTypeDef ReceptionType; /*!< Type of ongoing reception */ + + __IO HAL_UART_RxEventTypeTypeDef RxEventType; /*!< Type of Rx Event */ + + DMA_HandleTypeDef *hdmatx; /*!< UART Tx DMA Handle parameters */ + + DMA_HandleTypeDef *hdmarx; /*!< UART Rx DMA Handle parameters */ + + HAL_LockTypeDef Lock; /*!< Locking object */ + + __IO HAL_UART_StateTypeDef gState; /*!< UART state information related to global Handle management + and also related to Tx operations. + This parameter can be a value of @ref HAL_UART_StateTypeDef */ + + __IO HAL_UART_StateTypeDef RxState; /*!< UART state information related to Rx operations. + This parameter can be a value of @ref HAL_UART_StateTypeDef */ + + __IO uint32_t ErrorCode; /*!< UART Error code */ + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + void (* TxHalfCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Tx Half Complete Callback */ + void (* TxCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Tx Complete Callback */ + void (* RxHalfCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Rx Half Complete Callback */ + void (* RxCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Rx Complete Callback */ + void (* ErrorCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Error Callback */ + void (* AbortCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Abort Complete Callback */ + void (* AbortTransmitCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Abort Transmit Complete Callback */ + void (* AbortReceiveCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Abort Receive Complete Callback */ + void (* WakeupCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Wakeup Callback */ + void (* RxEventCallback)(struct __UART_HandleTypeDef *huart, uint16_t Pos); /*!< UART Reception Event Callback */ + + void (* MspInitCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Msp Init callback */ + void (* MspDeInitCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Msp DeInit callback */ +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + +} UART_HandleTypeDef; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) +/** + * @brief HAL UART Callback ID enumeration definition + */ +typedef enum +{ + HAL_UART_TX_HALFCOMPLETE_CB_ID = 0x00U, /*!< UART Tx Half Complete Callback ID */ + HAL_UART_TX_COMPLETE_CB_ID = 0x01U, /*!< UART Tx Complete Callback ID */ + HAL_UART_RX_HALFCOMPLETE_CB_ID = 0x02U, /*!< UART Rx Half Complete Callback ID */ + HAL_UART_RX_COMPLETE_CB_ID = 0x03U, /*!< UART Rx Complete Callback ID */ + HAL_UART_ERROR_CB_ID = 0x04U, /*!< UART Error Callback ID */ + HAL_UART_ABORT_COMPLETE_CB_ID = 0x05U, /*!< UART Abort Complete Callback ID */ + HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID = 0x06U, /*!< UART Abort Transmit Complete Callback ID */ + HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID = 0x07U, /*!< UART Abort Receive Complete Callback ID */ + HAL_UART_WAKEUP_CB_ID = 0x08U, /*!< UART Wakeup Callback ID */ + + HAL_UART_MSPINIT_CB_ID = 0x0BU, /*!< UART MspInit callback ID */ + HAL_UART_MSPDEINIT_CB_ID = 0x0CU /*!< UART MspDeInit callback ID */ + +} HAL_UART_CallbackIDTypeDef; + +/** + * @brief HAL UART Callback pointer definition + */ +typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer to an UART callback function */ +typedef void (*pUART_RxEventCallbackTypeDef)(struct __UART_HandleTypeDef *huart, uint16_t Pos); /*!< pointer to a UART Rx Event specific callback function */ + +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup UART_Exported_Constants UART Exported Constants + * @{ + */ + +/** @defgroup UART_Error_Code UART Error Code + * @{ + */ +#define HAL_UART_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_UART_ERROR_PE 0x00000001U /*!< Parity error */ +#define HAL_UART_ERROR_NE 0x00000002U /*!< Noise error */ +#define HAL_UART_ERROR_FE 0x00000004U /*!< Frame error */ +#define HAL_UART_ERROR_ORE 0x00000008U /*!< Overrun error */ +#define HAL_UART_ERROR_DMA 0x00000010U /*!< DMA transfer error */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) +#define HAL_UART_ERROR_INVALID_CALLBACK 0x00000020U /*!< Invalid Callback error */ +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +/** + * @} + */ + +/** @defgroup UART_Word_Length UART Word Length + * @{ + */ +#define UART_WORDLENGTH_8B 0x00000000U +#define UART_WORDLENGTH_9B ((uint32_t)USART_CR1_M) +/** + * @} + */ + +/** @defgroup UART_Stop_Bits UART Number of Stop Bits + * @{ + */ +#define UART_STOPBITS_1 0x00000000U +#define UART_STOPBITS_2 ((uint32_t)USART_CR2_STOP_1) +/** + * @} + */ + +/** @defgroup UART_Parity UART Parity + * @{ + */ +#define UART_PARITY_NONE 0x00000000U +#define UART_PARITY_EVEN ((uint32_t)USART_CR1_PCE) +#define UART_PARITY_ODD ((uint32_t)(USART_CR1_PCE | USART_CR1_PS)) +/** + * @} + */ + +/** @defgroup UART_Hardware_Flow_Control UART Hardware Flow Control + * @{ + */ +#define UART_HWCONTROL_NONE 0x00000000U +#define UART_HWCONTROL_RTS ((uint32_t)USART_CR3_RTSE) +#define UART_HWCONTROL_CTS ((uint32_t)USART_CR3_CTSE) +#define UART_HWCONTROL_RTS_CTS ((uint32_t)(USART_CR3_RTSE | USART_CR3_CTSE)) +/** + * @} + */ + +/** @defgroup UART_Mode UART Transfer Mode + * @{ + */ +#define UART_MODE_RX ((uint32_t)USART_CR1_RE) +#define UART_MODE_TX ((uint32_t)USART_CR1_TE) +#define UART_MODE_TX_RX ((uint32_t)(USART_CR1_TE | USART_CR1_RE)) +/** + * @} + */ + +/** @defgroup UART_State UART State + * @{ + */ +#define UART_STATE_DISABLE 0x00000000U +#define UART_STATE_ENABLE ((uint32_t)USART_CR1_UE) +/** + * @} + */ + +/** @defgroup UART_Over_Sampling UART Over Sampling + * @{ + */ +#define UART_OVERSAMPLING_16 0x00000000U +#define UART_OVERSAMPLING_8 ((uint32_t)USART_CR1_OVER8) +/** + * @} + */ + +/** @defgroup UART_LIN_Break_Detection_Length UART LIN Break Detection Length + * @{ + */ +#define UART_LINBREAKDETECTLENGTH_10B 0x00000000U +#define UART_LINBREAKDETECTLENGTH_11B ((uint32_t)USART_CR2_LBDL) +/** + * @} + */ + +/** @defgroup UART_WakeUp_functions UART Wakeup Functions + * @{ + */ +#define UART_WAKEUPMETHOD_IDLELINE 0x00000000U +#define UART_WAKEUPMETHOD_ADDRESSMARK ((uint32_t)USART_CR1_WAKE) +/** + * @} + */ + +/** @defgroup UART_Flags UART FLags + * Elements values convention: 0xXXXX + * - 0xXXXX : Flag mask in the SR register + * @{ + */ +#define UART_FLAG_CTS ((uint32_t)USART_SR_CTS) +#define UART_FLAG_LBD ((uint32_t)USART_SR_LBD) +#define UART_FLAG_TXE ((uint32_t)USART_SR_TXE) +#define UART_FLAG_TC ((uint32_t)USART_SR_TC) +#define UART_FLAG_RXNE ((uint32_t)USART_SR_RXNE) +#define UART_FLAG_IDLE ((uint32_t)USART_SR_IDLE) +#define UART_FLAG_ORE ((uint32_t)USART_SR_ORE) +#define UART_FLAG_NE ((uint32_t)USART_SR_NE) +#define UART_FLAG_FE ((uint32_t)USART_SR_FE) +#define UART_FLAG_PE ((uint32_t)USART_SR_PE) +/** + * @} + */ + +/** @defgroup UART_Interrupt_definition UART Interrupt Definitions + * Elements values convention: 0xY000XXXX + * - XXXX : Interrupt mask (16 bits) in the Y register + * - Y : Interrupt source register (2bits) + * - 0001: CR1 register + * - 0010: CR2 register + * - 0011: CR3 register + * @{ + */ + +#define UART_IT_PE ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_PEIE)) +#define UART_IT_TXE ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_TXEIE)) +#define UART_IT_TC ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_TCIE)) +#define UART_IT_RXNE ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_RXNEIE)) +#define UART_IT_IDLE ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_IDLEIE)) + +#define UART_IT_LBD ((uint32_t)(UART_CR2_REG_INDEX << 28U | USART_CR2_LBDIE)) + +#define UART_IT_CTS ((uint32_t)(UART_CR3_REG_INDEX << 28U | USART_CR3_CTSIE)) +#define UART_IT_ERR ((uint32_t)(UART_CR3_REG_INDEX << 28U | USART_CR3_EIE)) +/** + * @} + */ + +/** @defgroup UART_Reception_Type_Values UART Reception type values + * @{ + */ +#define HAL_UART_RECEPTION_STANDARD (0x00000000U) /*!< Standard reception */ +#define HAL_UART_RECEPTION_TOIDLE (0x00000001U) /*!< Reception till completion or IDLE event */ +/** + * @} + */ + +/** @defgroup UART_RxEvent_Type_Values UART RxEvent type values + * @{ + */ +#define HAL_UART_RXEVENT_TC (0x00000000U) /*!< RxEvent linked to Transfer Complete event */ +#define HAL_UART_RXEVENT_HT (0x00000001U) /*!< RxEvent linked to Half Transfer event */ +#define HAL_UART_RXEVENT_IDLE (0x00000002U) +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup UART_Exported_Macros UART Exported Macros + * @{ + */ + +/** @brief Reset UART handle gstate & RxState + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + * @retval None + */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) +#define __HAL_UART_RESET_HANDLE_STATE(__HANDLE__) do{ \ + (__HANDLE__)->gState = HAL_UART_STATE_RESET; \ + (__HANDLE__)->RxState = HAL_UART_STATE_RESET; \ + (__HANDLE__)->MspInitCallback = NULL; \ + (__HANDLE__)->MspDeInitCallback = NULL; \ + } while(0U) +#else +#define __HAL_UART_RESET_HANDLE_STATE(__HANDLE__) do{ \ + (__HANDLE__)->gState = HAL_UART_STATE_RESET; \ + (__HANDLE__)->RxState = HAL_UART_STATE_RESET; \ + } while(0U) +#endif /*USE_HAL_UART_REGISTER_CALLBACKS */ + +/** @brief Flushes the UART DR register + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + */ +#define __HAL_UART_FLUSH_DRREGISTER(__HANDLE__) ((__HANDLE__)->Instance->DR) + +/** @brief Checks whether the specified UART flag is set or not. + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + * @param __FLAG__ specifies the flag to check. + * This parameter can be one of the following values: + * @arg UART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5) + * @arg UART_FLAG_LBD: LIN Break detection flag + * @arg UART_FLAG_TXE: Transmit data register empty flag + * @arg UART_FLAG_TC: Transmission Complete flag + * @arg UART_FLAG_RXNE: Receive data register not empty flag + * @arg UART_FLAG_IDLE: Idle Line detection flag + * @arg UART_FLAG_ORE: Overrun Error flag + * @arg UART_FLAG_NE: Noise Error flag + * @arg UART_FLAG_FE: Framing Error flag + * @arg UART_FLAG_PE: Parity Error flag + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_UART_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR & (__FLAG__)) == (__FLAG__)) + +/** @brief Clears the specified UART pending flag. + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + * @param __FLAG__ specifies the flag to check. + * This parameter can be any combination of the following values: + * @arg UART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5). + * @arg UART_FLAG_LBD: LIN Break detection flag. + * @arg UART_FLAG_TC: Transmission Complete flag. + * @arg UART_FLAG_RXNE: Receive data register not empty flag. + * + * @note PE (Parity error), FE (Framing error), NE (Noise error), ORE (Overrun + * error) and IDLE (Idle line detected) flags are cleared by software + * sequence: a read operation to USART_SR register followed by a read + * operation to USART_DR register. + * @note RXNE flag can be also cleared by a read to the USART_DR register. + * @note TC flag can be also cleared by software sequence: a read operation to + * USART_SR register followed by a write operation to USART_DR register. + * @note TXE flag is cleared only by a write to the USART_DR register. + * + * @retval None + */ +#define __HAL_UART_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ~(__FLAG__)) + +/** @brief Clears the UART PE pending flag. + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + * @retval None + */ +#define __HAL_UART_CLEAR_PEFLAG(__HANDLE__) \ + do{ \ + __IO uint32_t tmpreg = 0x00U; \ + tmpreg = (__HANDLE__)->Instance->SR; \ + tmpreg = (__HANDLE__)->Instance->DR; \ + UNUSED(tmpreg); \ + } while(0U) + +/** @brief Clears the UART FE pending flag. + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + * @retval None + */ +#define __HAL_UART_CLEAR_FEFLAG(__HANDLE__) __HAL_UART_CLEAR_PEFLAG(__HANDLE__) + +/** @brief Clears the UART NE pending flag. + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + * @retval None + */ +#define __HAL_UART_CLEAR_NEFLAG(__HANDLE__) __HAL_UART_CLEAR_PEFLAG(__HANDLE__) + +/** @brief Clears the UART ORE pending flag. + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + * @retval None + */ +#define __HAL_UART_CLEAR_OREFLAG(__HANDLE__) __HAL_UART_CLEAR_PEFLAG(__HANDLE__) + +/** @brief Clears the UART IDLE pending flag. + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + * @retval None + */ +#define __HAL_UART_CLEAR_IDLEFLAG(__HANDLE__) __HAL_UART_CLEAR_PEFLAG(__HANDLE__) + +/** @brief Enable the specified UART interrupt. + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + * @param __INTERRUPT__ specifies the UART interrupt source to enable. + * This parameter can be one of the following values: + * @arg UART_IT_CTS: CTS change interrupt + * @arg UART_IT_LBD: LIN Break detection interrupt + * @arg UART_IT_TXE: Transmit Data Register empty interrupt + * @arg UART_IT_TC: Transmission complete interrupt + * @arg UART_IT_RXNE: Receive Data register not empty interrupt + * @arg UART_IT_IDLE: Idle line detection interrupt + * @arg UART_IT_PE: Parity Error interrupt + * @arg UART_IT_ERR: Error interrupt(Frame error, noise error, overrun error) + * @retval None + */ +#define __HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((((__INTERRUPT__) >> 28U) == UART_CR1_REG_INDEX)? ((__HANDLE__)->Instance->CR1 |= ((__INTERRUPT__) & UART_IT_MASK)): \ + (((__INTERRUPT__) >> 28U) == UART_CR2_REG_INDEX)? ((__HANDLE__)->Instance->CR2 |= ((__INTERRUPT__) & UART_IT_MASK)): \ + ((__HANDLE__)->Instance->CR3 |= ((__INTERRUPT__) & UART_IT_MASK))) + +/** @brief Disable the specified UART interrupt. + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + * @param __INTERRUPT__ specifies the UART interrupt source to disable. + * This parameter can be one of the following values: + * @arg UART_IT_CTS: CTS change interrupt + * @arg UART_IT_LBD: LIN Break detection interrupt + * @arg UART_IT_TXE: Transmit Data Register empty interrupt + * @arg UART_IT_TC: Transmission complete interrupt + * @arg UART_IT_RXNE: Receive Data register not empty interrupt + * @arg UART_IT_IDLE: Idle line detection interrupt + * @arg UART_IT_PE: Parity Error interrupt + * @arg UART_IT_ERR: Error interrupt(Frame error, noise error, overrun error) + * @retval None + */ +#define __HAL_UART_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((((__INTERRUPT__) >> 28U) == UART_CR1_REG_INDEX)? ((__HANDLE__)->Instance->CR1 &= ~((__INTERRUPT__) & UART_IT_MASK)): \ + (((__INTERRUPT__) >> 28U) == UART_CR2_REG_INDEX)? ((__HANDLE__)->Instance->CR2 &= ~((__INTERRUPT__) & UART_IT_MASK)): \ + ((__HANDLE__)->Instance->CR3 &= ~ ((__INTERRUPT__) & UART_IT_MASK))) + +/** @brief Checks whether the specified UART interrupt source is enabled or not. + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + * @param __IT__ specifies the UART interrupt source to check. + * This parameter can be one of the following values: + * @arg UART_IT_CTS: CTS change interrupt (not available for UART4 and UART5) + * @arg UART_IT_LBD: LIN Break detection interrupt + * @arg UART_IT_TXE: Transmit Data Register empty interrupt + * @arg UART_IT_TC: Transmission complete interrupt + * @arg UART_IT_RXNE: Receive Data register not empty interrupt + * @arg UART_IT_IDLE: Idle line detection interrupt + * @arg UART_IT_ERR: Error interrupt + * @retval The new state of __IT__ (TRUE or FALSE). + */ +#define __HAL_UART_GET_IT_SOURCE(__HANDLE__, __IT__) (((((__IT__) >> 28U) == UART_CR1_REG_INDEX)? (__HANDLE__)->Instance->CR1:(((((uint32_t)(__IT__)) >> 28U) == UART_CR2_REG_INDEX)? \ + (__HANDLE__)->Instance->CR2 : (__HANDLE__)->Instance->CR3)) & (((uint32_t)(__IT__)) & UART_IT_MASK)) + +/** @brief Enable CTS flow control + * @note This macro allows to enable CTS hardware flow control for a given UART instance, + * without need to call HAL_UART_Init() function. + * As involving direct access to UART registers, usage of this macro should be fully endorsed by user. + * @note As macro is expected to be used for modifying CTS Hw flow control feature activation, without need + * for USART instance Deinit/Init, following conditions for macro call should be fulfilled : + * - UART instance should have already been initialised (through call of HAL_UART_Init() ) + * - macro could only be called when corresponding UART instance is disabled (i.e __HAL_UART_DISABLE(__HANDLE__)) + * and should be followed by an Enable macro (i.e __HAL_UART_ENABLE(__HANDLE__)). + * @param __HANDLE__ specifies the UART Handle. + * The Handle Instance can be any USARTx (supporting the HW Flow control feature). + * It is used to select the USART peripheral (USART availability and x value depending on device). + * @retval None + */ +#define __HAL_UART_HWCONTROL_CTS_ENABLE(__HANDLE__) \ + do{ \ + ATOMIC_SET_BIT((__HANDLE__)->Instance->CR3, USART_CR3_CTSE); \ + (__HANDLE__)->Init.HwFlowCtl |= USART_CR3_CTSE; \ + } while(0U) + +/** @brief Disable CTS flow control + * @note This macro allows to disable CTS hardware flow control for a given UART instance, + * without need to call HAL_UART_Init() function. + * As involving direct access to UART registers, usage of this macro should be fully endorsed by user. + * @note As macro is expected to be used for modifying CTS Hw flow control feature activation, without need + * for USART instance Deinit/Init, following conditions for macro call should be fulfilled : + * - UART instance should have already been initialised (through call of HAL_UART_Init() ) + * - macro could only be called when corresponding UART instance is disabled (i.e __HAL_UART_DISABLE(__HANDLE__)) + * and should be followed by an Enable macro (i.e __HAL_UART_ENABLE(__HANDLE__)). + * @param __HANDLE__ specifies the UART Handle. + * The Handle Instance can be any USARTx (supporting the HW Flow control feature). + * It is used to select the USART peripheral (USART availability and x value depending on device). + * @retval None + */ +#define __HAL_UART_HWCONTROL_CTS_DISABLE(__HANDLE__) \ + do{ \ + ATOMIC_CLEAR_BIT((__HANDLE__)->Instance->CR3, USART_CR3_CTSE); \ + (__HANDLE__)->Init.HwFlowCtl &= ~(USART_CR3_CTSE); \ + } while(0U) + +/** @brief Enable RTS flow control + * This macro allows to enable RTS hardware flow control for a given UART instance, + * without need to call HAL_UART_Init() function. + * As involving direct access to UART registers, usage of this macro should be fully endorsed by user. + * @note As macro is expected to be used for modifying RTS Hw flow control feature activation, without need + * for USART instance Deinit/Init, following conditions for macro call should be fulfilled : + * - UART instance should have already been initialised (through call of HAL_UART_Init() ) + * - macro could only be called when corresponding UART instance is disabled (i.e __HAL_UART_DISABLE(__HANDLE__)) + * and should be followed by an Enable macro (i.e __HAL_UART_ENABLE(__HANDLE__)). + * @param __HANDLE__ specifies the UART Handle. + * The Handle Instance can be any USARTx (supporting the HW Flow control feature). + * It is used to select the USART peripheral (USART availability and x value depending on device). + * @retval None + */ +#define __HAL_UART_HWCONTROL_RTS_ENABLE(__HANDLE__) \ + do{ \ + ATOMIC_SET_BIT((__HANDLE__)->Instance->CR3, USART_CR3_RTSE); \ + (__HANDLE__)->Init.HwFlowCtl |= USART_CR3_RTSE; \ + } while(0U) + +/** @brief Disable RTS flow control + * This macro allows to disable RTS hardware flow control for a given UART instance, + * without need to call HAL_UART_Init() function. + * As involving direct access to UART registers, usage of this macro should be fully endorsed by user. + * @note As macro is expected to be used for modifying RTS Hw flow control feature activation, without need + * for USART instance Deinit/Init, following conditions for macro call should be fulfilled : + * - UART instance should have already been initialised (through call of HAL_UART_Init() ) + * - macro could only be called when corresponding UART instance is disabled (i.e __HAL_UART_DISABLE(__HANDLE__)) + * and should be followed by an Enable macro (i.e __HAL_UART_ENABLE(__HANDLE__)). + * @param __HANDLE__ specifies the UART Handle. + * The Handle Instance can be any USARTx (supporting the HW Flow control feature). + * It is used to select the USART peripheral (USART availability and x value depending on device). + * @retval None + */ +#define __HAL_UART_HWCONTROL_RTS_DISABLE(__HANDLE__) \ + do{ \ + ATOMIC_CLEAR_BIT((__HANDLE__)->Instance->CR3, USART_CR3_RTSE);\ + (__HANDLE__)->Init.HwFlowCtl &= ~(USART_CR3_RTSE); \ + } while(0U) + +/** @brief Macro to enable the UART's one bit sample method + * @param __HANDLE__ specifies the UART Handle. + * @retval None + */ +#define __HAL_UART_ONE_BIT_SAMPLE_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3|= USART_CR3_ONEBIT) + +/** @brief Macro to disable the UART's one bit sample method + * @param __HANDLE__ specifies the UART Handle. + * @retval None + */ +#define __HAL_UART_ONE_BIT_SAMPLE_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3\ + &= (uint16_t)~((uint16_t)USART_CR3_ONEBIT)) + +/** @brief Enable UART + * @param __HANDLE__ specifies the UART Handle. + * @retval None + */ +#define __HAL_UART_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 |= USART_CR1_UE) + +/** @brief Disable UART + * @param __HANDLE__ specifies the UART Handle. + * @retval None + */ +#define __HAL_UART_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 &= ~USART_CR1_UE) +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup UART_Exported_Functions + * @{ + */ + +/** @addtogroup UART_Exported_Functions_Group1 Initialization and de-initialization functions + * @{ + */ + +/* Initialization/de-initialization functions **********************************/ +HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength); +HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod); +HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart); +void HAL_UART_MspInit(UART_HandleTypeDef *huart); +void HAL_UART_MspDeInit(UART_HandleTypeDef *huart); + +/* Callbacks Register/UnRegister functions ***********************************/ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) +HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, + pUART_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID); + +HAL_StatusTypeDef HAL_UART_RegisterRxEventCallback(UART_HandleTypeDef *huart, pUART_RxEventCallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_UART_UnRegisterRxEventCallback(UART_HandleTypeDef *huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @addtogroup UART_Exported_Functions_Group2 IO operation functions + * @{ + */ + +/* IO operation functions *******************************************************/ +HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout); +HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); +HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart); + +HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint16_t *RxLen, + uint32_t Timeout); +HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); + +HAL_UART_RxEventTypeTypeDef HAL_UARTEx_GetRxEventType(UART_HandleTypeDef *huart); + +/* Transfer Abort functions */ +HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart); + +void HAL_UART_IRQHandler(UART_HandleTypeDef *huart); +void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); +void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); +void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); +void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart); +void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart); +void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart); +void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart); +void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart); + +void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size); + +/** + * @} + */ + +/** @addtogroup UART_Exported_Functions_Group3 + * @{ + */ +/* Peripheral Control functions ************************************************/ +HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_MultiProcessor_ExitMuteMode(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart); +/** + * @} + */ + +/** @addtogroup UART_Exported_Functions_Group4 + * @{ + */ +/* Peripheral State functions **************************************************/ +HAL_UART_StateTypeDef HAL_UART_GetState(const UART_HandleTypeDef *huart); +uint32_t HAL_UART_GetError(const UART_HandleTypeDef *huart); +/** + * @} + */ + +/** + * @} + */ +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup UART_Private_Constants UART Private Constants + * @{ + */ +/** @brief UART interruptions flag mask + * + */ +#define UART_IT_MASK 0x0000FFFFU + +#define UART_CR1_REG_INDEX 1U +#define UART_CR2_REG_INDEX 2U +#define UART_CR3_REG_INDEX 3U +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup UART_Private_Macros UART Private Macros + * @{ + */ +#define IS_UART_WORD_LENGTH(LENGTH) (((LENGTH) == UART_WORDLENGTH_8B) || \ + ((LENGTH) == UART_WORDLENGTH_9B)) +#define IS_UART_LIN_WORD_LENGTH(LENGTH) (((LENGTH) == UART_WORDLENGTH_8B)) +#define IS_UART_STOPBITS(STOPBITS) (((STOPBITS) == UART_STOPBITS_1) || \ + ((STOPBITS) == UART_STOPBITS_2)) +#define IS_UART_PARITY(PARITY) (((PARITY) == UART_PARITY_NONE) || \ + ((PARITY) == UART_PARITY_EVEN) || \ + ((PARITY) == UART_PARITY_ODD)) +#define IS_UART_HARDWARE_FLOW_CONTROL(CONTROL)\ + (((CONTROL) == UART_HWCONTROL_NONE) || \ + ((CONTROL) == UART_HWCONTROL_RTS) || \ + ((CONTROL) == UART_HWCONTROL_CTS) || \ + ((CONTROL) == UART_HWCONTROL_RTS_CTS)) +#define IS_UART_MODE(MODE) ((((MODE) & 0x0000FFF3U) == 0x00U) && ((MODE) != 0x00U)) +#define IS_UART_STATE(STATE) (((STATE) == UART_STATE_DISABLE) || \ + ((STATE) == UART_STATE_ENABLE)) +#define IS_UART_OVERSAMPLING(SAMPLING) (((SAMPLING) == UART_OVERSAMPLING_16) || \ + ((SAMPLING) == UART_OVERSAMPLING_8)) +#define IS_UART_LIN_OVERSAMPLING(SAMPLING) (((SAMPLING) == UART_OVERSAMPLING_16)) +#define IS_UART_LIN_BREAK_DETECT_LENGTH(LENGTH) (((LENGTH) == UART_LINBREAKDETECTLENGTH_10B) || \ + ((LENGTH) == UART_LINBREAKDETECTLENGTH_11B)) +#define IS_UART_WAKEUPMETHOD(WAKEUP) (((WAKEUP) == UART_WAKEUPMETHOD_IDLELINE) || \ + ((WAKEUP) == UART_WAKEUPMETHOD_ADDRESSMARK)) +#define IS_UART_BAUDRATE(BAUDRATE) ((BAUDRATE) <= 10500000U) +#define IS_UART_ADDRESS(ADDRESS) ((ADDRESS) <= 0x0FU) + +#define UART_DIV_SAMPLING16(_PCLK_, _BAUD_) ((uint32_t)((((uint64_t)(_PCLK_))*25U)/(4U*((uint64_t)(_BAUD_))))) +#define UART_DIVMANT_SAMPLING16(_PCLK_, _BAUD_) (UART_DIV_SAMPLING16((_PCLK_), (_BAUD_))/100U) +#define UART_DIVFRAQ_SAMPLING16(_PCLK_, _BAUD_) ((((UART_DIV_SAMPLING16((_PCLK_), (_BAUD_)) - (UART_DIVMANT_SAMPLING16((_PCLK_), (_BAUD_)) * 100U)) * 16U)\ + + 50U) / 100U) +/* UART BRR = mantissa + overflow + fraction + = (UART DIVMANT << 4) + (UART DIVFRAQ & 0xF0) + (UART DIVFRAQ & 0x0FU) */ +#define UART_BRR_SAMPLING16(_PCLK_, _BAUD_) ((UART_DIVMANT_SAMPLING16((_PCLK_), (_BAUD_)) << 4U) + \ + (UART_DIVFRAQ_SAMPLING16((_PCLK_), (_BAUD_)) & 0xF0U) + \ + (UART_DIVFRAQ_SAMPLING16((_PCLK_), (_BAUD_)) & 0x0FU)) + +#define UART_DIV_SAMPLING8(_PCLK_, _BAUD_) ((uint32_t)((((uint64_t)(_PCLK_))*25U)/(2U*((uint64_t)(_BAUD_))))) +#define UART_DIVMANT_SAMPLING8(_PCLK_, _BAUD_) (UART_DIV_SAMPLING8((_PCLK_), (_BAUD_))/100U) +#define UART_DIVFRAQ_SAMPLING8(_PCLK_, _BAUD_) ((((UART_DIV_SAMPLING8((_PCLK_), (_BAUD_)) - (UART_DIVMANT_SAMPLING8((_PCLK_), (_BAUD_)) * 100U)) * 8U)\ + + 50U) / 100U) +/* UART BRR = mantissa + overflow + fraction + = (UART DIVMANT << 4) + ((UART DIVFRAQ & 0xF8) << 1) + (UART DIVFRAQ & 0x07U) */ +#define UART_BRR_SAMPLING8(_PCLK_, _BAUD_) ((UART_DIVMANT_SAMPLING8((_PCLK_), (_BAUD_)) << 4U) + \ + ((UART_DIVFRAQ_SAMPLING8((_PCLK_), (_BAUD_)) & 0xF8U) << 1U) + \ + (UART_DIVFRAQ_SAMPLING8((_PCLK_), (_BAUD_)) & 0x07U)) + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup UART_Private_Functions UART Private Functions + * @{ + */ + +HAL_StatusTypeDef UART_Start_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef UART_Start_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_UART_H */ + diff --git a/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h new file mode 100644 index 0000000..ce19d4d --- /dev/null +++ b/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/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h new file mode 100644 index 0000000..9a183ea --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h @@ -0,0 +1,647 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_cortex.h + * @author MCD Application Team + * @brief Header file of CORTEX LL module. + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The LL CORTEX driver contains a set of generic APIs that can be + used by user: + (+) SYSTICK configuration used by LL_mDelay and LL_Init1msTick + functions + (+) Low power mode configuration (SCB register of Cortex-MCU) + (+) MPU API to configure and enable regions + (MPU services provided only on some devices) + (+) API to access to MCU info (CPUID register) + (+) API to enable fault handler (SHCSR accesses) + + @endverbatim + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_CORTEX_H +#define __STM32F4xx_LL_CORTEX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +/** @defgroup CORTEX_LL CORTEX + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ + +/* Private macros ------------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup CORTEX_LL_Exported_Constants CORTEX Exported Constants + * @{ + */ + +/** @defgroup CORTEX_LL_EC_CLKSOURCE_HCLK SYSTICK Clock Source + * @{ + */ +#define LL_SYSTICK_CLKSOURCE_HCLK_DIV8 0x00000000U /*!< AHB clock divided by 8 selected as SysTick clock source.*/ +#define LL_SYSTICK_CLKSOURCE_HCLK SysTick_CTRL_CLKSOURCE_Msk /*!< AHB clock selected as SysTick clock source. */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_FAULT Handler Fault type + * @{ + */ +#define LL_HANDLER_FAULT_USG SCB_SHCSR_USGFAULTENA_Msk /*!< Usage fault */ +#define LL_HANDLER_FAULT_BUS SCB_SHCSR_BUSFAULTENA_Msk /*!< Bus fault */ +#define LL_HANDLER_FAULT_MEM SCB_SHCSR_MEMFAULTENA_Msk /*!< Memory management fault */ +/** + * @} + */ + +#if __MPU_PRESENT + +/** @defgroup CORTEX_LL_EC_CTRL_HFNMI_PRIVDEF MPU Control + * @{ + */ +#define LL_MPU_CTRL_HFNMI_PRIVDEF_NONE 0x00000000U /*!< Disable NMI and privileged SW access */ +#define LL_MPU_CTRL_HARDFAULT_NMI MPU_CTRL_HFNMIENA_Msk /*!< Enables the operation of MPU during hard fault, NMI, and FAULTMASK handlers */ +#define LL_MPU_CTRL_PRIVILEGED_DEFAULT MPU_CTRL_PRIVDEFENA_Msk /*!< Enable privileged software access to default memory map */ +#define LL_MPU_CTRL_HFNMI_PRIVDEF (MPU_CTRL_HFNMIENA_Msk | MPU_CTRL_PRIVDEFENA_Msk) /*!< Enable NMI and privileged SW access */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_REGION MPU Region Number + * @{ + */ +#define LL_MPU_REGION_NUMBER0 0x00U /*!< REGION Number 0 */ +#define LL_MPU_REGION_NUMBER1 0x01U /*!< REGION Number 1 */ +#define LL_MPU_REGION_NUMBER2 0x02U /*!< REGION Number 2 */ +#define LL_MPU_REGION_NUMBER3 0x03U /*!< REGION Number 3 */ +#define LL_MPU_REGION_NUMBER4 0x04U /*!< REGION Number 4 */ +#define LL_MPU_REGION_NUMBER5 0x05U /*!< REGION Number 5 */ +#define LL_MPU_REGION_NUMBER6 0x06U /*!< REGION Number 6 */ +#define LL_MPU_REGION_NUMBER7 0x07U /*!< REGION Number 7 */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_REGION_SIZE MPU Region Size + * @{ + */ +#define LL_MPU_REGION_SIZE_32B (0x04U << MPU_RASR_SIZE_Pos) /*!< 32B Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_64B (0x05U << MPU_RASR_SIZE_Pos) /*!< 64B Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_128B (0x06U << MPU_RASR_SIZE_Pos) /*!< 128B Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_256B (0x07U << MPU_RASR_SIZE_Pos) /*!< 256B Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_512B (0x08U << MPU_RASR_SIZE_Pos) /*!< 512B Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_1KB (0x09U << MPU_RASR_SIZE_Pos) /*!< 1KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_2KB (0x0AU << MPU_RASR_SIZE_Pos) /*!< 2KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_4KB (0x0BU << MPU_RASR_SIZE_Pos) /*!< 4KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_8KB (0x0CU << MPU_RASR_SIZE_Pos) /*!< 8KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_16KB (0x0DU << MPU_RASR_SIZE_Pos) /*!< 16KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_32KB (0x0EU << MPU_RASR_SIZE_Pos) /*!< 32KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_64KB (0x0FU << MPU_RASR_SIZE_Pos) /*!< 64KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_128KB (0x10U << MPU_RASR_SIZE_Pos) /*!< 128KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_256KB (0x11U << MPU_RASR_SIZE_Pos) /*!< 256KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_512KB (0x12U << MPU_RASR_SIZE_Pos) /*!< 512KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_1MB (0x13U << MPU_RASR_SIZE_Pos) /*!< 1MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_2MB (0x14U << MPU_RASR_SIZE_Pos) /*!< 2MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_4MB (0x15U << MPU_RASR_SIZE_Pos) /*!< 4MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_8MB (0x16U << MPU_RASR_SIZE_Pos) /*!< 8MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_16MB (0x17U << MPU_RASR_SIZE_Pos) /*!< 16MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_32MB (0x18U << MPU_RASR_SIZE_Pos) /*!< 32MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_64MB (0x19U << MPU_RASR_SIZE_Pos) /*!< 64MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_128MB (0x1AU << MPU_RASR_SIZE_Pos) /*!< 128MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_256MB (0x1BU << MPU_RASR_SIZE_Pos) /*!< 256MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_512MB (0x1CU << MPU_RASR_SIZE_Pos) /*!< 512MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_1GB (0x1DU << MPU_RASR_SIZE_Pos) /*!< 1GB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_2GB (0x1EU << MPU_RASR_SIZE_Pos) /*!< 2GB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_4GB (0x1FU << MPU_RASR_SIZE_Pos) /*!< 4GB Size of the MPU protection region */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_REGION_PRIVILEDGES MPU Region Privileges + * @{ + */ +#define LL_MPU_REGION_NO_ACCESS (0x00U << MPU_RASR_AP_Pos) /*!< No access*/ +#define LL_MPU_REGION_PRIV_RW (0x01U << MPU_RASR_AP_Pos) /*!< RW privileged (privileged access only)*/ +#define LL_MPU_REGION_PRIV_RW_URO (0x02U << MPU_RASR_AP_Pos) /*!< RW privileged - RO user (Write in a user program generates a fault) */ +#define LL_MPU_REGION_FULL_ACCESS (0x03U << MPU_RASR_AP_Pos) /*!< RW privileged & user (Full access) */ +#define LL_MPU_REGION_PRIV_RO (0x05U << MPU_RASR_AP_Pos) /*!< RO privileged (privileged read only)*/ +#define LL_MPU_REGION_PRIV_RO_URO (0x06U << MPU_RASR_AP_Pos) /*!< RO privileged & user (read only) */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_TEX MPU TEX Level + * @{ + */ +#define LL_MPU_TEX_LEVEL0 (0x00U << MPU_RASR_TEX_Pos) /*!< b000 for TEX bits */ +#define LL_MPU_TEX_LEVEL1 (0x01U << MPU_RASR_TEX_Pos) /*!< b001 for TEX bits */ +#define LL_MPU_TEX_LEVEL2 (0x02U << MPU_RASR_TEX_Pos) /*!< b010 for TEX bits */ +#define LL_MPU_TEX_LEVEL4 (0x04U << MPU_RASR_TEX_Pos) /*!< b100 for TEX bits */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_INSTRUCTION_ACCESS MPU Instruction Access + * @{ + */ +#define LL_MPU_INSTRUCTION_ACCESS_ENABLE 0x00U /*!< Instruction fetches enabled */ +#define LL_MPU_INSTRUCTION_ACCESS_DISABLE MPU_RASR_XN_Msk /*!< Instruction fetches disabled*/ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_SHAREABLE_ACCESS MPU Shareable Access + * @{ + */ +#define LL_MPU_ACCESS_SHAREABLE MPU_RASR_S_Msk /*!< Shareable memory attribute */ +#define LL_MPU_ACCESS_NOT_SHAREABLE 0x00U /*!< Not Shareable memory attribute */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_CACHEABLE_ACCESS MPU Cacheable Access + * @{ + */ +#define LL_MPU_ACCESS_CACHEABLE MPU_RASR_C_Msk /*!< Cacheable memory attribute */ +#define LL_MPU_ACCESS_NOT_CACHEABLE 0x00U /*!< Not Cacheable memory attribute */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_BUFFERABLE_ACCESS MPU Bufferable Access + * @{ + */ +#define LL_MPU_ACCESS_BUFFERABLE MPU_RASR_B_Msk /*!< Bufferable memory attribute */ +#define LL_MPU_ACCESS_NOT_BUFFERABLE 0x00U /*!< Not Bufferable memory attribute */ +/** + * @} + */ +#endif /* __MPU_PRESENT */ +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup CORTEX_LL_Exported_Functions CORTEX Exported Functions + * @{ + */ + +/** @defgroup CORTEX_LL_EF_SYSTICK SYSTICK + * @{ + */ + +/** + * @brief This function checks if the Systick counter flag is active or not. + * @note It can be used in timeout function on application side. + * @rmtoll STK_CTRL COUNTFLAG LL_SYSTICK_IsActiveCounterFlag + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SYSTICK_IsActiveCounterFlag(void) +{ + return ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == (SysTick_CTRL_COUNTFLAG_Msk)); +} + +/** + * @brief Configures the SysTick clock source + * @rmtoll STK_CTRL CLKSOURCE LL_SYSTICK_SetClkSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK_DIV8 + * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK + * @retval None + */ +__STATIC_INLINE void LL_SYSTICK_SetClkSource(uint32_t Source) +{ + if (Source == LL_SYSTICK_CLKSOURCE_HCLK) + { + SET_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK); + } + else + { + CLEAR_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK); + } +} + +/** + * @brief Get the SysTick clock source + * @rmtoll STK_CTRL CLKSOURCE LL_SYSTICK_GetClkSource + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK_DIV8 + * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK + */ +__STATIC_INLINE uint32_t LL_SYSTICK_GetClkSource(void) +{ + return READ_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK); +} + +/** + * @brief Enable SysTick exception request + * @rmtoll STK_CTRL TICKINT LL_SYSTICK_EnableIT + * @retval None + */ +__STATIC_INLINE void LL_SYSTICK_EnableIT(void) +{ + SET_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk); +} + +/** + * @brief Disable SysTick exception request + * @rmtoll STK_CTRL TICKINT LL_SYSTICK_DisableIT + * @retval None + */ +__STATIC_INLINE void LL_SYSTICK_DisableIT(void) +{ + CLEAR_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk); +} + +/** + * @brief Checks if the SYSTICK interrupt is enabled or disabled. + * @rmtoll STK_CTRL TICKINT LL_SYSTICK_IsEnabledIT + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SYSTICK_IsEnabledIT(void) +{ + return (READ_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk) == (SysTick_CTRL_TICKINT_Msk)); +} + +/** + * @} + */ + +/** @defgroup CORTEX_LL_EF_LOW_POWER_MODE LOW POWER MODE + * @{ + */ + +/** + * @brief Processor uses sleep as its low power mode + * @rmtoll SCB_SCR SLEEPDEEP LL_LPM_EnableSleep + * @retval None + */ +__STATIC_INLINE void LL_LPM_EnableSleep(void) +{ + /* Clear SLEEPDEEP bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); +} + +/** + * @brief Processor uses deep sleep as its low power mode + * @rmtoll SCB_SCR SLEEPDEEP LL_LPM_EnableDeepSleep + * @retval None + */ +__STATIC_INLINE void LL_LPM_EnableDeepSleep(void) +{ + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); +} + +/** + * @brief Configures sleep-on-exit when returning from Handler mode to Thread mode. + * @note Setting this bit to 1 enables an interrupt-driven application to avoid returning to an + * empty main application. + * @rmtoll SCB_SCR SLEEPONEXIT LL_LPM_EnableSleepOnExit + * @retval None + */ +__STATIC_INLINE void LL_LPM_EnableSleepOnExit(void) +{ + /* Set SLEEPONEXIT bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); +} + +/** + * @brief Do not sleep when returning to Thread mode. + * @rmtoll SCB_SCR SLEEPONEXIT LL_LPM_DisableSleepOnExit + * @retval None + */ +__STATIC_INLINE void LL_LPM_DisableSleepOnExit(void) +{ + /* Clear SLEEPONEXIT bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); +} + +/** + * @brief Enabled events and all interrupts, including disabled interrupts, can wakeup the + * processor. + * @rmtoll SCB_SCR SEVEONPEND LL_LPM_EnableEventOnPend + * @retval None + */ +__STATIC_INLINE void LL_LPM_EnableEventOnPend(void) +{ + /* Set SEVEONPEND bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); +} + +/** + * @brief Only enabled interrupts or events can wakeup the processor, disabled interrupts are + * excluded + * @rmtoll SCB_SCR SEVEONPEND LL_LPM_DisableEventOnPend + * @retval None + */ +__STATIC_INLINE void LL_LPM_DisableEventOnPend(void) +{ + /* Clear SEVEONPEND bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); +} + +/** + * @brief Clear pending events. + * @retval None + */ +__STATIC_INLINE void LL_LPM_ClearEvent(void) +{ + __SEV(); + __WFE(); +} + +/** + * @} + */ + +/** @defgroup CORTEX_LL_EF_HANDLER HANDLER + * @{ + */ + +/** + * @brief Enable a fault in System handler control register (SHCSR) + * @rmtoll SCB_SHCSR MEMFAULTENA LL_HANDLER_EnableFault + * @param Fault This parameter can be a combination of the following values: + * @arg @ref LL_HANDLER_FAULT_USG + * @arg @ref LL_HANDLER_FAULT_BUS + * @arg @ref LL_HANDLER_FAULT_MEM + * @retval None + */ +__STATIC_INLINE void LL_HANDLER_EnableFault(uint32_t Fault) +{ + /* Enable the system handler fault */ + SET_BIT(SCB->SHCSR, Fault); +} + +/** + * @brief Disable a fault in System handler control register (SHCSR) + * @rmtoll SCB_SHCSR MEMFAULTENA LL_HANDLER_DisableFault + * @param Fault This parameter can be a combination of the following values: + * @arg @ref LL_HANDLER_FAULT_USG + * @arg @ref LL_HANDLER_FAULT_BUS + * @arg @ref LL_HANDLER_FAULT_MEM + * @retval None + */ +__STATIC_INLINE void LL_HANDLER_DisableFault(uint32_t Fault) +{ + /* Disable the system handler fault */ + CLEAR_BIT(SCB->SHCSR, Fault); +} + +/** + * @} + */ + +/** @defgroup CORTEX_LL_EF_MCU_INFO MCU INFO + * @{ + */ + +/** + * @brief Get Implementer code + * @rmtoll SCB_CPUID IMPLEMENTER LL_CPUID_GetImplementer + * @retval Value should be equal to 0x41 for ARM + */ +__STATIC_INLINE uint32_t LL_CPUID_GetImplementer(void) +{ + return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_IMPLEMENTER_Msk) >> SCB_CPUID_IMPLEMENTER_Pos); +} + +/** + * @brief Get Variant number (The r value in the rnpn product revision identifier) + * @rmtoll SCB_CPUID VARIANT LL_CPUID_GetVariant + * @retval Value between 0 and 255 (0x0: revision 0) + */ +__STATIC_INLINE uint32_t LL_CPUID_GetVariant(void) +{ + return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_VARIANT_Msk) >> SCB_CPUID_VARIANT_Pos); +} + +/** + * @brief Get Constant number + * @rmtoll SCB_CPUID ARCHITECTURE LL_CPUID_GetConstant + * @retval Value should be equal to 0xF for Cortex-M4 devices + */ +__STATIC_INLINE uint32_t LL_CPUID_GetConstant(void) +{ + return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_ARCHITECTURE_Msk) >> SCB_CPUID_ARCHITECTURE_Pos); +} + +/** + * @brief Get Part number + * @rmtoll SCB_CPUID PARTNO LL_CPUID_GetParNo + * @retval Value should be equal to 0xC24 for Cortex-M4 + */ +__STATIC_INLINE uint32_t LL_CPUID_GetParNo(void) +{ + return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_PARTNO_Msk) >> SCB_CPUID_PARTNO_Pos); +} + +/** + * @brief Get Revision number (The p value in the rnpn product revision identifier, indicates patch release) + * @rmtoll SCB_CPUID REVISION LL_CPUID_GetRevision + * @retval Value between 0 and 255 (0x1: patch 1) + */ +__STATIC_INLINE uint32_t LL_CPUID_GetRevision(void) +{ + return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_REVISION_Msk) >> SCB_CPUID_REVISION_Pos); +} + +/** + * @} + */ + +#if __MPU_PRESENT +/** @defgroup CORTEX_LL_EF_MPU MPU + * @{ + */ + +/** + * @brief Enable MPU with input options + * @rmtoll MPU_CTRL ENABLE LL_MPU_Enable + * @param Options This parameter can be one of the following values: + * @arg @ref LL_MPU_CTRL_HFNMI_PRIVDEF_NONE + * @arg @ref LL_MPU_CTRL_HARDFAULT_NMI + * @arg @ref LL_MPU_CTRL_PRIVILEGED_DEFAULT + * @arg @ref LL_MPU_CTRL_HFNMI_PRIVDEF + * @retval None + */ +__STATIC_INLINE void LL_MPU_Enable(uint32_t Options) +{ + /* Enable the MPU*/ + WRITE_REG(MPU->CTRL, (MPU_CTRL_ENABLE_Msk | Options)); + /* Ensure MPU settings take effects */ + __DSB(); + /* Sequence instruction fetches using update settings */ + __ISB(); +} + +/** + * @brief Disable MPU + * @rmtoll MPU_CTRL ENABLE LL_MPU_Disable + * @retval None + */ +__STATIC_INLINE void LL_MPU_Disable(void) +{ + /* Make sure outstanding transfers are done */ + __DMB(); + /* Disable MPU*/ + WRITE_REG(MPU->CTRL, 0U); +} + +/** + * @brief Check if MPU is enabled or not + * @rmtoll MPU_CTRL ENABLE LL_MPU_IsEnabled + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_MPU_IsEnabled(void) +{ + return (READ_BIT(MPU->CTRL, MPU_CTRL_ENABLE_Msk) == (MPU_CTRL_ENABLE_Msk)); +} + +/** + * @brief Enable a MPU region + * @rmtoll MPU_RASR ENABLE LL_MPU_EnableRegion + * @param Region This parameter can be one of the following values: + * @arg @ref LL_MPU_REGION_NUMBER0 + * @arg @ref LL_MPU_REGION_NUMBER1 + * @arg @ref LL_MPU_REGION_NUMBER2 + * @arg @ref LL_MPU_REGION_NUMBER3 + * @arg @ref LL_MPU_REGION_NUMBER4 + * @arg @ref LL_MPU_REGION_NUMBER5 + * @arg @ref LL_MPU_REGION_NUMBER6 + * @arg @ref LL_MPU_REGION_NUMBER7 + * @retval None + */ +__STATIC_INLINE void LL_MPU_EnableRegion(uint32_t Region) +{ + /* Set Region number */ + WRITE_REG(MPU->RNR, Region); + /* Enable the MPU region */ + SET_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); +} + +/** + * @brief Configure and enable a region + * @rmtoll MPU_RNR REGION LL_MPU_ConfigRegion\n + * MPU_RBAR REGION LL_MPU_ConfigRegion\n + * MPU_RBAR ADDR LL_MPU_ConfigRegion\n + * MPU_RASR XN LL_MPU_ConfigRegion\n + * MPU_RASR AP LL_MPU_ConfigRegion\n + * MPU_RASR S LL_MPU_ConfigRegion\n + * MPU_RASR C LL_MPU_ConfigRegion\n + * MPU_RASR B LL_MPU_ConfigRegion\n + * MPU_RASR SIZE LL_MPU_ConfigRegion + * @param Region This parameter can be one of the following values: + * @arg @ref LL_MPU_REGION_NUMBER0 + * @arg @ref LL_MPU_REGION_NUMBER1 + * @arg @ref LL_MPU_REGION_NUMBER2 + * @arg @ref LL_MPU_REGION_NUMBER3 + * @arg @ref LL_MPU_REGION_NUMBER4 + * @arg @ref LL_MPU_REGION_NUMBER5 + * @arg @ref LL_MPU_REGION_NUMBER6 + * @arg @ref LL_MPU_REGION_NUMBER7 + * @param Address Value of region base address + * @param SubRegionDisable Sub-region disable value between Min_Data = 0x00 and Max_Data = 0xFF + * @param Attributes This parameter can be a combination of the following values: + * @arg @ref LL_MPU_REGION_SIZE_32B or @ref LL_MPU_REGION_SIZE_64B or @ref LL_MPU_REGION_SIZE_128B or @ref LL_MPU_REGION_SIZE_256B or @ref LL_MPU_REGION_SIZE_512B + * or @ref LL_MPU_REGION_SIZE_1KB or @ref LL_MPU_REGION_SIZE_2KB or @ref LL_MPU_REGION_SIZE_4KB or @ref LL_MPU_REGION_SIZE_8KB or @ref LL_MPU_REGION_SIZE_16KB + * or @ref LL_MPU_REGION_SIZE_32KB or @ref LL_MPU_REGION_SIZE_64KB or @ref LL_MPU_REGION_SIZE_128KB or @ref LL_MPU_REGION_SIZE_256KB or @ref LL_MPU_REGION_SIZE_512KB + * or @ref LL_MPU_REGION_SIZE_1MB or @ref LL_MPU_REGION_SIZE_2MB or @ref LL_MPU_REGION_SIZE_4MB or @ref LL_MPU_REGION_SIZE_8MB or @ref LL_MPU_REGION_SIZE_16MB + * or @ref LL_MPU_REGION_SIZE_32MB or @ref LL_MPU_REGION_SIZE_64MB or @ref LL_MPU_REGION_SIZE_128MB or @ref LL_MPU_REGION_SIZE_256MB or @ref LL_MPU_REGION_SIZE_512MB + * or @ref LL_MPU_REGION_SIZE_1GB or @ref LL_MPU_REGION_SIZE_2GB or @ref LL_MPU_REGION_SIZE_4GB + * @arg @ref LL_MPU_REGION_NO_ACCESS or @ref LL_MPU_REGION_PRIV_RW or @ref LL_MPU_REGION_PRIV_RW_URO or @ref LL_MPU_REGION_FULL_ACCESS + * or @ref LL_MPU_REGION_PRIV_RO or @ref LL_MPU_REGION_PRIV_RO_URO + * @arg @ref LL_MPU_TEX_LEVEL0 or @ref LL_MPU_TEX_LEVEL1 or @ref LL_MPU_TEX_LEVEL2 or @ref LL_MPU_TEX_LEVEL4 + * @arg @ref LL_MPU_INSTRUCTION_ACCESS_ENABLE or @ref LL_MPU_INSTRUCTION_ACCESS_DISABLE + * @arg @ref LL_MPU_ACCESS_SHAREABLE or @ref LL_MPU_ACCESS_NOT_SHAREABLE + * @arg @ref LL_MPU_ACCESS_CACHEABLE or @ref LL_MPU_ACCESS_NOT_CACHEABLE + * @arg @ref LL_MPU_ACCESS_BUFFERABLE or @ref LL_MPU_ACCESS_NOT_BUFFERABLE + * @retval None + */ +__STATIC_INLINE void LL_MPU_ConfigRegion(uint32_t Region, uint32_t SubRegionDisable, uint32_t Address, uint32_t Attributes) +{ + /* Set Region number */ + WRITE_REG(MPU->RNR, Region); + /* Set base address */ + WRITE_REG(MPU->RBAR, (Address & 0xFFFFFFE0U)); + /* Configure MPU */ + WRITE_REG(MPU->RASR, (MPU_RASR_ENABLE_Msk | Attributes | (SubRegionDisable << MPU_RASR_SRD_Pos))); +} + +/** + * @brief Disable a region + * @rmtoll MPU_RNR REGION LL_MPU_DisableRegion\n + * MPU_RASR ENABLE LL_MPU_DisableRegion + * @param Region This parameter can be one of the following values: + * @arg @ref LL_MPU_REGION_NUMBER0 + * @arg @ref LL_MPU_REGION_NUMBER1 + * @arg @ref LL_MPU_REGION_NUMBER2 + * @arg @ref LL_MPU_REGION_NUMBER3 + * @arg @ref LL_MPU_REGION_NUMBER4 + * @arg @ref LL_MPU_REGION_NUMBER5 + * @arg @ref LL_MPU_REGION_NUMBER6 + * @arg @ref LL_MPU_REGION_NUMBER7 + * @retval None + */ +__STATIC_INLINE void LL_MPU_DisableRegion(uint32_t Region) +{ + /* Set Region number */ + WRITE_REG(MPU->RNR, Region); + /* Disable the MPU region */ + CLEAR_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); +} + +/** + * @} + */ + +#endif /* __MPU_PRESENT */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_CORTEX_H */ + diff --git a/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h new file mode 100644 index 0000000..055ba5f --- /dev/null +++ b/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 Get Current target (only in double buffer mode). + * @rmtoll CR CT LL_DMA_GetCurrentTargetMem + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_CURRENTTARGETMEM0 + * @arg @ref LL_DMA_CURRENTTARGETMEM1 + */ +__STATIC_INLINE uint32_t LL_DMA_GetCurrentTargetMem(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CT)); +} + +/** + * @brief Enable the double buffer mode. + * @rmtoll CR DBM LL_DMA_EnableDoubleBufferMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableDoubleBufferMode(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DBM); +} + +/** + * @brief Disable the double buffer mode. + * @rmtoll CR DBM LL_DMA_DisableDoubleBufferMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableDoubleBufferMode(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DBM); +} + +/** + * @brief Get FIFO status. + * @rmtoll FCR FS LL_DMA_GetFIFOStatus + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_FIFOSTATUS_0_25 + * @arg @ref LL_DMA_FIFOSTATUS_25_50 + * @arg @ref LL_DMA_FIFOSTATUS_50_75 + * @arg @ref LL_DMA_FIFOSTATUS_75_100 + * @arg @ref LL_DMA_FIFOSTATUS_EMPTY + * @arg @ref LL_DMA_FIFOSTATUS_FULL + */ +__STATIC_INLINE uint32_t LL_DMA_GetFIFOStatus(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FS)); +} + +/** + * @brief Disable Fifo mode. + * @rmtoll FCR DMDIS LL_DMA_DisableFifoMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableFifoMode(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_DMDIS); +} + +/** + * @brief Enable Fifo mode. + * @rmtoll FCR DMDIS LL_DMA_EnableFifoMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableFifoMode(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_DMDIS); +} + +/** + * @brief Select FIFO threshold. + * @rmtoll FCR FTH LL_DMA_SetFIFOThreshold + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Threshold This parameter can be one of the following values: + * @arg @ref LL_DMA_FIFOTHRESHOLD_1_4 + * @arg @ref LL_DMA_FIFOTHRESHOLD_1_2 + * @arg @ref LL_DMA_FIFOTHRESHOLD_3_4 + * @arg @ref LL_DMA_FIFOTHRESHOLD_FULL + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetFIFOThreshold(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Threshold) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FTH, Threshold); +} + +/** + * @brief Get FIFO threshold. + * @rmtoll FCR FTH LL_DMA_GetFIFOThreshold + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_FIFOTHRESHOLD_1_4 + * @arg @ref LL_DMA_FIFOTHRESHOLD_1_2 + * @arg @ref LL_DMA_FIFOTHRESHOLD_3_4 + * @arg @ref LL_DMA_FIFOTHRESHOLD_FULL + */ +__STATIC_INLINE uint32_t LL_DMA_GetFIFOThreshold(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FTH)); +} + +/** + * @brief Configure the FIFO . + * @rmtoll FCR FTH LL_DMA_ConfigFifo\n + * FCR DMDIS LL_DMA_ConfigFifo + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param FifoMode This parameter can be one of the following values: + * @arg @ref LL_DMA_FIFOMODE_ENABLE + * @arg @ref LL_DMA_FIFOMODE_DISABLE + * @param FifoThreshold This parameter can be one of the following values: + * @arg @ref LL_DMA_FIFOTHRESHOLD_1_4 + * @arg @ref LL_DMA_FIFOTHRESHOLD_1_2 + * @arg @ref LL_DMA_FIFOTHRESHOLD_3_4 + * @arg @ref LL_DMA_FIFOTHRESHOLD_FULL + * @retval None + */ +__STATIC_INLINE void LL_DMA_ConfigFifo(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t FifoMode, uint32_t FifoThreshold) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FTH|DMA_SxFCR_DMDIS, FifoMode|FifoThreshold); +} + +/** + * @brief Configure the Source and Destination addresses. + * @note This API must not be called when the DMA stream is enabled. + * @rmtoll M0AR M0A LL_DMA_ConfigAddresses\n + * PAR PA LL_DMA_ConfigAddresses + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param SrcAddress Between 0 to 0xFFFFFFFF + * @param DstAddress Between 0 to 0xFFFFFFFF + * @param Direction This parameter can be one of the following values: + * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY + * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH + * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY + * @retval None + */ +__STATIC_INLINE void LL_DMA_ConfigAddresses(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t SrcAddress, uint32_t DstAddress, uint32_t Direction) +{ + /* Direction Memory to Periph */ + if (Direction == LL_DMA_DIRECTION_MEMORY_TO_PERIPH) + { + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, SrcAddress); + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, DstAddress); + } + /* Direction Periph to Memory and Memory to Memory */ + else + { + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, SrcAddress); + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, DstAddress); + } +} + +/** + * @brief Set the Memory address. + * @rmtoll M0AR M0A LL_DMA_SetMemoryAddress + * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. + * @note This API must not be called when the DMA channel is enabled. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param MemoryAddress Between 0 to 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetMemoryAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t MemoryAddress) +{ + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, MemoryAddress); +} + +/** + * @brief Set the Peripheral address. + * @rmtoll PAR PA LL_DMA_SetPeriphAddress + * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. + * @note This API must not be called when the DMA channel is enabled. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param PeriphAddress Between 0 to 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetPeriphAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t PeriphAddress) +{ + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, PeriphAddress); +} + +/** + * @brief Get the Memory address. + * @rmtoll M0AR M0A LL_DMA_GetMemoryAddress + * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Between 0 to 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetMemoryAddress(DMA_TypeDef* DMAx, uint32_t Stream) +{ + return (READ_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR)); +} + +/** + * @brief Get the Peripheral address. + * @rmtoll PAR PA LL_DMA_GetPeriphAddress + * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Between 0 to 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetPeriphAddress(DMA_TypeDef* DMAx, uint32_t Stream) +{ + return (READ_REG(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR)); +} + +/** + * @brief Set the Memory to Memory Source address. + * @rmtoll PAR PA LL_DMA_SetM2MSrcAddress + * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. + * @note This API must not be called when the DMA channel is enabled. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param MemoryAddress Between 0 to 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetM2MSrcAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t MemoryAddress) +{ + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, MemoryAddress); +} + +/** + * @brief Set the Memory to Memory Destination address. + * @rmtoll M0AR M0A LL_DMA_SetM2MDstAddress + * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. + * @note This API must not be called when the DMA channel is enabled. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param MemoryAddress Between 0 to 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetM2MDstAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t MemoryAddress) + { + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, MemoryAddress); + } + +/** + * @brief Get the Memory to Memory Source address. + * @rmtoll PAR PA LL_DMA_GetM2MSrcAddress + * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Between 0 to 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetM2MSrcAddress(DMA_TypeDef* DMAx, uint32_t Stream) + { + return (READ_REG(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR)); + } + +/** + * @brief Get the Memory to Memory Destination address. + * @rmtoll M0AR M0A LL_DMA_GetM2MDstAddress + * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Between 0 to 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetM2MDstAddress(DMA_TypeDef* DMAx, uint32_t Stream) +{ + return (READ_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR)); +} + +/** + * @brief Set Memory 1 address (used in case of Double buffer mode). + * @rmtoll M1AR M1A LL_DMA_SetMemory1Address + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Address Between 0 to 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetMemory1Address(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Address) +{ + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M1AR, Address); +} + +/** + * @brief Get Memory 1 address (used in case of Double buffer mode). + * @rmtoll M1AR M1A LL_DMA_GetMemory1Address + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Between 0 to 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetMemory1Address(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M1AR); +} + +/** + * @} + */ + +/** @defgroup DMA_LL_EF_FLAG_Management FLAG_Management + * @{ + */ + +/** + * @brief Get Stream 0 half transfer flag. + * @rmtoll LISR HTIF0 LL_DMA_IsActiveFlag_HT0 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT0(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF0)==(DMA_LISR_HTIF0)); +} + +/** + * @brief Get Stream 1 half transfer flag. + * @rmtoll LISR HTIF1 LL_DMA_IsActiveFlag_HT1 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT1(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF1)==(DMA_LISR_HTIF1)); +} + +/** + * @brief Get Stream 2 half transfer flag. + * @rmtoll LISR HTIF2 LL_DMA_IsActiveFlag_HT2 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT2(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF2)==(DMA_LISR_HTIF2)); +} + +/** + * @brief Get Stream 3 half transfer flag. + * @rmtoll LISR HTIF3 LL_DMA_IsActiveFlag_HT3 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT3(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF3)==(DMA_LISR_HTIF3)); +} + +/** + * @brief Get Stream 4 half transfer flag. + * @rmtoll HISR HTIF4 LL_DMA_IsActiveFlag_HT4 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT4(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF4)==(DMA_HISR_HTIF4)); +} + +/** + * @brief Get Stream 5 half transfer flag. + * @rmtoll HISR HTIF0 LL_DMA_IsActiveFlag_HT5 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT5(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF5)==(DMA_HISR_HTIF5)); +} + +/** + * @brief Get Stream 6 half transfer flag. + * @rmtoll HISR HTIF6 LL_DMA_IsActiveFlag_HT6 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT6(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF6)==(DMA_HISR_HTIF6)); +} + +/** + * @brief Get Stream 7 half transfer flag. + * @rmtoll HISR HTIF7 LL_DMA_IsActiveFlag_HT7 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT7(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF7)==(DMA_HISR_HTIF7)); +} + +/** + * @brief Get Stream 0 transfer complete flag. + * @rmtoll LISR TCIF0 LL_DMA_IsActiveFlag_TC0 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC0(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF0)==(DMA_LISR_TCIF0)); +} + +/** + * @brief Get Stream 1 transfer complete flag. + * @rmtoll LISR TCIF1 LL_DMA_IsActiveFlag_TC1 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC1(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF1)==(DMA_LISR_TCIF1)); +} + +/** + * @brief Get Stream 2 transfer complete flag. + * @rmtoll LISR TCIF2 LL_DMA_IsActiveFlag_TC2 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC2(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF2)==(DMA_LISR_TCIF2)); +} + +/** + * @brief Get Stream 3 transfer complete flag. + * @rmtoll LISR TCIF3 LL_DMA_IsActiveFlag_TC3 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC3(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF3)==(DMA_LISR_TCIF3)); +} + +/** + * @brief Get Stream 4 transfer complete flag. + * @rmtoll HISR TCIF4 LL_DMA_IsActiveFlag_TC4 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC4(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF4)==(DMA_HISR_TCIF4)); +} + +/** + * @brief Get Stream 5 transfer complete flag. + * @rmtoll HISR TCIF0 LL_DMA_IsActiveFlag_TC5 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC5(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF5)==(DMA_HISR_TCIF5)); +} + +/** + * @brief Get Stream 6 transfer complete flag. + * @rmtoll HISR TCIF6 LL_DMA_IsActiveFlag_TC6 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC6(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF6)==(DMA_HISR_TCIF6)); +} + +/** + * @brief Get Stream 7 transfer complete flag. + * @rmtoll HISR TCIF7 LL_DMA_IsActiveFlag_TC7 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC7(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF7)==(DMA_HISR_TCIF7)); +} + +/** + * @brief Get Stream 0 transfer error flag. + * @rmtoll LISR TEIF0 LL_DMA_IsActiveFlag_TE0 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE0(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF0)==(DMA_LISR_TEIF0)); +} + +/** + * @brief Get Stream 1 transfer error flag. + * @rmtoll LISR TEIF1 LL_DMA_IsActiveFlag_TE1 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE1(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF1)==(DMA_LISR_TEIF1)); +} + +/** + * @brief Get Stream 2 transfer error flag. + * @rmtoll LISR TEIF2 LL_DMA_IsActiveFlag_TE2 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE2(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF2)==(DMA_LISR_TEIF2)); +} + +/** + * @brief Get Stream 3 transfer error flag. + * @rmtoll LISR TEIF3 LL_DMA_IsActiveFlag_TE3 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE3(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF3)==(DMA_LISR_TEIF3)); +} + +/** + * @brief Get Stream 4 transfer error flag. + * @rmtoll HISR TEIF4 LL_DMA_IsActiveFlag_TE4 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE4(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF4)==(DMA_HISR_TEIF4)); +} + +/** + * @brief Get Stream 5 transfer error flag. + * @rmtoll HISR TEIF0 LL_DMA_IsActiveFlag_TE5 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE5(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF5)==(DMA_HISR_TEIF5)); +} + +/** + * @brief Get Stream 6 transfer error flag. + * @rmtoll HISR TEIF6 LL_DMA_IsActiveFlag_TE6 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE6(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF6)==(DMA_HISR_TEIF6)); +} + +/** + * @brief Get Stream 7 transfer error flag. + * @rmtoll HISR TEIF7 LL_DMA_IsActiveFlag_TE7 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE7(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF7)==(DMA_HISR_TEIF7)); +} + +/** + * @brief Get Stream 0 direct mode error flag. + * @rmtoll LISR DMEIF0 LL_DMA_IsActiveFlag_DME0 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME0(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF0)==(DMA_LISR_DMEIF0)); +} + +/** + * @brief Get Stream 1 direct mode error flag. + * @rmtoll LISR DMEIF1 LL_DMA_IsActiveFlag_DME1 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME1(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF1)==(DMA_LISR_DMEIF1)); +} + +/** + * @brief Get Stream 2 direct mode error flag. + * @rmtoll LISR DMEIF2 LL_DMA_IsActiveFlag_DME2 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME2(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF2)==(DMA_LISR_DMEIF2)); +} + +/** + * @brief Get Stream 3 direct mode error flag. + * @rmtoll LISR DMEIF3 LL_DMA_IsActiveFlag_DME3 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME3(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF3)==(DMA_LISR_DMEIF3)); +} + +/** + * @brief Get Stream 4 direct mode error flag. + * @rmtoll HISR DMEIF4 LL_DMA_IsActiveFlag_DME4 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME4(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF4)==(DMA_HISR_DMEIF4)); +} + +/** + * @brief Get Stream 5 direct mode error flag. + * @rmtoll HISR DMEIF0 LL_DMA_IsActiveFlag_DME5 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME5(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF5)==(DMA_HISR_DMEIF5)); +} + +/** + * @brief Get Stream 6 direct mode error flag. + * @rmtoll HISR DMEIF6 LL_DMA_IsActiveFlag_DME6 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME6(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF6)==(DMA_HISR_DMEIF6)); +} + +/** + * @brief Get Stream 7 direct mode error flag. + * @rmtoll HISR DMEIF7 LL_DMA_IsActiveFlag_DME7 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME7(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF7)==(DMA_HISR_DMEIF7)); +} + +/** + * @brief Get Stream 0 FIFO error flag. + * @rmtoll LISR FEIF0 LL_DMA_IsActiveFlag_FE0 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE0(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF0)==(DMA_LISR_FEIF0)); +} + +/** + * @brief Get Stream 1 FIFO error flag. + * @rmtoll LISR FEIF1 LL_DMA_IsActiveFlag_FE1 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE1(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF1)==(DMA_LISR_FEIF1)); +} + +/** + * @brief Get Stream 2 FIFO error flag. + * @rmtoll LISR FEIF2 LL_DMA_IsActiveFlag_FE2 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE2(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF2)==(DMA_LISR_FEIF2)); +} + +/** + * @brief Get Stream 3 FIFO error flag. + * @rmtoll LISR FEIF3 LL_DMA_IsActiveFlag_FE3 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE3(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF3)==(DMA_LISR_FEIF3)); +} + +/** + * @brief Get Stream 4 FIFO error flag. + * @rmtoll HISR FEIF4 LL_DMA_IsActiveFlag_FE4 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE4(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF4)==(DMA_HISR_FEIF4)); +} + +/** + * @brief Get Stream 5 FIFO error flag. + * @rmtoll HISR FEIF0 LL_DMA_IsActiveFlag_FE5 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE5(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF5)==(DMA_HISR_FEIF5)); +} + +/** + * @brief Get Stream 6 FIFO error flag. + * @rmtoll HISR FEIF6 LL_DMA_IsActiveFlag_FE6 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE6(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF6)==(DMA_HISR_FEIF6)); +} + +/** + * @brief Get Stream 7 FIFO error flag. + * @rmtoll HISR FEIF7 LL_DMA_IsActiveFlag_FE7 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE7(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF7)==(DMA_HISR_FEIF7)); +} + +/** + * @brief Clear Stream 0 half transfer flag. + * @rmtoll LIFCR CHTIF0 LL_DMA_ClearFlag_HT0 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT0(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CHTIF0); +} + +/** + * @brief Clear Stream 1 half transfer flag. + * @rmtoll LIFCR CHTIF1 LL_DMA_ClearFlag_HT1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT1(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CHTIF1); +} + +/** + * @brief Clear Stream 2 half transfer flag. + * @rmtoll LIFCR CHTIF2 LL_DMA_ClearFlag_HT2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT2(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CHTIF2); +} + +/** + * @brief Clear Stream 3 half transfer flag. + * @rmtoll LIFCR CHTIF3 LL_DMA_ClearFlag_HT3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT3(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CHTIF3); +} + +/** + * @brief Clear Stream 4 half transfer flag. + * @rmtoll HIFCR CHTIF4 LL_DMA_ClearFlag_HT4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT4(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CHTIF4); +} + +/** + * @brief Clear Stream 5 half transfer flag. + * @rmtoll HIFCR CHTIF5 LL_DMA_ClearFlag_HT5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT5(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CHTIF5); +} + +/** + * @brief Clear Stream 6 half transfer flag. + * @rmtoll HIFCR CHTIF6 LL_DMA_ClearFlag_HT6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT6(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CHTIF6); +} + +/** + * @brief Clear Stream 7 half transfer flag. + * @rmtoll HIFCR CHTIF7 LL_DMA_ClearFlag_HT7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT7(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CHTIF7); +} + +/** + * @brief Clear Stream 0 transfer complete flag. + * @rmtoll LIFCR CTCIF0 LL_DMA_ClearFlag_TC0 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC0(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTCIF0); +} + +/** + * @brief Clear Stream 1 transfer complete flag. + * @rmtoll LIFCR CTCIF1 LL_DMA_ClearFlag_TC1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC1(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTCIF1); +} + +/** + * @brief Clear Stream 2 transfer complete flag. + * @rmtoll LIFCR CTCIF2 LL_DMA_ClearFlag_TC2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC2(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTCIF2); +} + +/** + * @brief Clear Stream 3 transfer complete flag. + * @rmtoll LIFCR CTCIF3 LL_DMA_ClearFlag_TC3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC3(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTCIF3); +} + +/** + * @brief Clear Stream 4 transfer complete flag. + * @rmtoll HIFCR CTCIF4 LL_DMA_ClearFlag_TC4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC4(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTCIF4); +} + +/** + * @brief Clear Stream 5 transfer complete flag. + * @rmtoll HIFCR CTCIF5 LL_DMA_ClearFlag_TC5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC5(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTCIF5); +} + +/** + * @brief Clear Stream 6 transfer complete flag. + * @rmtoll HIFCR CTCIF6 LL_DMA_ClearFlag_TC6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC6(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTCIF6); +} + +/** + * @brief Clear Stream 7 transfer complete flag. + * @rmtoll HIFCR CTCIF7 LL_DMA_ClearFlag_TC7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC7(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTCIF7); +} + +/** + * @brief Clear Stream 0 transfer error flag. + * @rmtoll LIFCR CTEIF0 LL_DMA_ClearFlag_TE0 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE0(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTEIF0); +} + +/** + * @brief Clear Stream 1 transfer error flag. + * @rmtoll LIFCR CTEIF1 LL_DMA_ClearFlag_TE1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE1(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTEIF1); +} + +/** + * @brief Clear Stream 2 transfer error flag. + * @rmtoll LIFCR CTEIF2 LL_DMA_ClearFlag_TE2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE2(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTEIF2); +} + +/** + * @brief Clear Stream 3 transfer error flag. + * @rmtoll LIFCR CTEIF3 LL_DMA_ClearFlag_TE3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE3(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTEIF3); +} + +/** + * @brief Clear Stream 4 transfer error flag. + * @rmtoll HIFCR CTEIF4 LL_DMA_ClearFlag_TE4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE4(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTEIF4); +} + +/** + * @brief Clear Stream 5 transfer error flag. + * @rmtoll HIFCR CTEIF5 LL_DMA_ClearFlag_TE5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE5(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTEIF5); +} + +/** + * @brief Clear Stream 6 transfer error flag. + * @rmtoll HIFCR CTEIF6 LL_DMA_ClearFlag_TE6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE6(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTEIF6); +} + +/** + * @brief Clear Stream 7 transfer error flag. + * @rmtoll HIFCR CTEIF7 LL_DMA_ClearFlag_TE7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE7(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTEIF7); +} + +/** + * @brief Clear Stream 0 direct mode error flag. + * @rmtoll LIFCR CDMEIF0 LL_DMA_ClearFlag_DME0 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME0(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CDMEIF0); +} + +/** + * @brief Clear Stream 1 direct mode error flag. + * @rmtoll LIFCR CDMEIF1 LL_DMA_ClearFlag_DME1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME1(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CDMEIF1); +} + +/** + * @brief Clear Stream 2 direct mode error flag. + * @rmtoll LIFCR CDMEIF2 LL_DMA_ClearFlag_DME2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME2(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CDMEIF2); +} + +/** + * @brief Clear Stream 3 direct mode error flag. + * @rmtoll LIFCR CDMEIF3 LL_DMA_ClearFlag_DME3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME3(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CDMEIF3); +} + +/** + * @brief Clear Stream 4 direct mode error flag. + * @rmtoll HIFCR CDMEIF4 LL_DMA_ClearFlag_DME4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME4(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CDMEIF4); +} + +/** + * @brief Clear Stream 5 direct mode error flag. + * @rmtoll HIFCR CDMEIF5 LL_DMA_ClearFlag_DME5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME5(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CDMEIF5); +} + +/** + * @brief Clear Stream 6 direct mode error flag. + * @rmtoll HIFCR CDMEIF6 LL_DMA_ClearFlag_DME6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME6(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CDMEIF6); +} + +/** + * @brief Clear Stream 7 direct mode error flag. + * @rmtoll HIFCR CDMEIF7 LL_DMA_ClearFlag_DME7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME7(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CDMEIF7); +} + +/** + * @brief Clear Stream 0 FIFO error flag. + * @rmtoll LIFCR CFEIF0 LL_DMA_ClearFlag_FE0 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE0(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CFEIF0); +} + +/** + * @brief Clear Stream 1 FIFO error flag. + * @rmtoll LIFCR CFEIF1 LL_DMA_ClearFlag_FE1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE1(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CFEIF1); +} + +/** + * @brief Clear Stream 2 FIFO error flag. + * @rmtoll LIFCR CFEIF2 LL_DMA_ClearFlag_FE2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE2(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CFEIF2); +} + +/** + * @brief Clear Stream 3 FIFO error flag. + * @rmtoll LIFCR CFEIF3 LL_DMA_ClearFlag_FE3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE3(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CFEIF3); +} + +/** + * @brief Clear Stream 4 FIFO error flag. + * @rmtoll HIFCR CFEIF4 LL_DMA_ClearFlag_FE4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE4(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CFEIF4); +} + +/** + * @brief Clear Stream 5 FIFO error flag. + * @rmtoll HIFCR CFEIF5 LL_DMA_ClearFlag_FE5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE5(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CFEIF5); +} + +/** + * @brief Clear Stream 6 FIFO error flag. + * @rmtoll HIFCR CFEIF6 LL_DMA_ClearFlag_FE6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE6(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CFEIF6); +} + +/** + * @brief Clear Stream 7 FIFO error flag. + * @rmtoll HIFCR CFEIF7 LL_DMA_ClearFlag_FE7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE7(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CFEIF7); +} + +/** + * @} + */ + +/** @defgroup DMA_LL_EF_IT_Management IT_Management + * @{ + */ + +/** + * @brief Enable Half transfer interrupt. + * @rmtoll CR HTIE LL_DMA_EnableIT_HT + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableIT_HT(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_HTIE); +} + +/** + * @brief Enable Transfer error interrupt. + * @rmtoll CR TEIE LL_DMA_EnableIT_TE + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableIT_TE(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TEIE); +} + +/** + * @brief Enable Transfer complete interrupt. + * @rmtoll CR TCIE LL_DMA_EnableIT_TC + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableIT_TC(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TCIE); +} + +/** + * @brief Enable Direct mode error interrupt. + * @rmtoll CR DMEIE LL_DMA_EnableIT_DME + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableIT_DME(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DMEIE); +} + +/** + * @brief Enable FIFO error interrupt. + * @rmtoll FCR FEIE LL_DMA_EnableIT_FE + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableIT_FE(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FEIE); +} + +/** + * @brief Disable Half transfer interrupt. + * @rmtoll CR HTIE LL_DMA_DisableIT_HT + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableIT_HT(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_HTIE); +} + +/** + * @brief Disable Transfer error interrupt. + * @rmtoll CR TEIE LL_DMA_DisableIT_TE + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableIT_TE(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TEIE); +} + +/** + * @brief Disable Transfer complete interrupt. + * @rmtoll CR TCIE LL_DMA_DisableIT_TC + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableIT_TC(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TCIE); +} + +/** + * @brief Disable Direct mode error interrupt. + * @rmtoll CR DMEIE LL_DMA_DisableIT_DME + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableIT_DME(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DMEIE); +} + +/** + * @brief Disable FIFO error interrupt. + * @rmtoll FCR FEIE LL_DMA_DisableIT_FE + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableIT_FE(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FEIE); +} + +/** + * @brief Check if Half transfer interrupt is enabled. + * @rmtoll CR HTIE LL_DMA_IsEnabledIT_HT + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_HT(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_HTIE) == DMA_SxCR_HTIE); +} + +/** + * @brief Check if Transfer error nterrup is enabled. + * @rmtoll CR TEIE LL_DMA_IsEnabledIT_TE + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_TE(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TEIE) == DMA_SxCR_TEIE); +} + +/** + * @brief Check if Transfer complete interrupt is enabled. + * @rmtoll CR TCIE LL_DMA_IsEnabledIT_TC + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_TC(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TCIE) == DMA_SxCR_TCIE); +} + +/** + * @brief Check if Direct mode error interrupt is enabled. + * @rmtoll CR DMEIE LL_DMA_IsEnabledIT_DME + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_DME(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DMEIE) == DMA_SxCR_DMEIE); +} + +/** + * @brief Check if FIFO error interrupt is enabled. + * @rmtoll FCR FEIE LL_DMA_IsEnabledIT_FE + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_FE(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FEIE) == DMA_SxFCR_FEIE); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup DMA_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + +uint32_t LL_DMA_Init(DMA_TypeDef *DMAx, uint32_t Stream, LL_DMA_InitTypeDef *DMA_InitStruct); +uint32_t LL_DMA_DeInit(DMA_TypeDef *DMAx, uint32_t Stream); +void LL_DMA_StructInit(LL_DMA_InitTypeDef *DMA_InitStruct); + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* DMA1 || DMA2 */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_DMA_H */ + diff --git a/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h new file mode 100644 index 0000000..65ab691 --- /dev/null +++ b/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/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h new file mode 100644 index 0000000..6bee7fd --- /dev/null +++ b/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/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_i2c.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_i2c.h new file mode 100644 index 0000000..92d4a74 --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_i2c.h @@ -0,0 +1,1890 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_i2c.h + * @author MCD Application Team + * @brief Header file of I2C LL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_I2C_H +#define __STM32F4xx_LL_I2C_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (I2C1) || defined (I2C2) || defined (I2C3) + +/** @defgroup I2C_LL I2C + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup I2C_LL_Private_Constants I2C Private Constants + * @{ + */ + +/* Defines used to perform compute and check in the macros */ +#define LL_I2C_MAX_SPEED_STANDARD 100000U +#define LL_I2C_MAX_SPEED_FAST 400000U +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup I2C_LL_Private_Macros I2C Private Macros + * @{ + */ +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ + +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup I2C_LL_ES_INIT I2C Exported Init structure + * @{ + */ +typedef struct +{ + uint32_t PeripheralMode; /*!< Specifies the peripheral mode. + This parameter can be a value of @ref I2C_LL_EC_PERIPHERAL_MODE + + This feature can be modified afterwards using unitary function @ref LL_I2C_SetMode(). */ + + uint32_t ClockSpeed; /*!< Specifies the clock frequency. + This parameter must be set to a value lower than 400kHz (in Hz) + + This feature can be modified afterwards using unitary function @ref LL_I2C_SetClockPeriod() + or @ref LL_I2C_SetDutyCycle() or @ref LL_I2C_SetClockSpeedMode() or @ref LL_I2C_ConfigSpeed(). */ + + uint32_t DutyCycle; /*!< Specifies the I2C fast mode duty cycle. + This parameter can be a value of @ref I2C_LL_EC_DUTYCYCLE + + This feature can be modified afterwards using unitary function @ref LL_I2C_SetDutyCycle(). */ + +#if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF) + uint32_t AnalogFilter; /*!< Enables or disables analog noise filter. + This parameter can be a value of @ref I2C_LL_EC_ANALOGFILTER_SELECTION + + This feature can be modified afterwards using unitary functions @ref LL_I2C_EnableAnalogFilter() or LL_I2C_DisableAnalogFilter(). */ + + uint32_t DigitalFilter; /*!< Configures the digital noise filter. + This parameter can be a number between Min_Data = 0x00 and Max_Data = 0x0F + + This feature can be modified afterwards using unitary function @ref LL_I2C_SetDigitalFilter(). */ + +#endif + uint32_t OwnAddress1; /*!< Specifies the device own address 1. + This parameter must be a value between Min_Data = 0x00 and Max_Data = 0x3FF + + This feature can be modified afterwards using unitary function @ref LL_I2C_SetOwnAddress1(). */ + + uint32_t TypeAcknowledge; /*!< Specifies the ACKnowledge or Non ACKnowledge condition after the address receive match code or next received byte. + This parameter can be a value of @ref I2C_LL_EC_I2C_ACKNOWLEDGE + + This feature can be modified afterwards using unitary function @ref LL_I2C_AcknowledgeNextData(). */ + + uint32_t OwnAddrSize; /*!< Specifies the device own address 1 size (7-bit or 10-bit). + This parameter can be a value of @ref I2C_LL_EC_OWNADDRESS1 + + This feature can be modified afterwards using unitary function @ref LL_I2C_SetOwnAddress1(). */ +} LL_I2C_InitTypeDef; +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup I2C_LL_Exported_Constants I2C Exported Constants + * @{ + */ + +/** @defgroup I2C_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_I2C_ReadReg function + * @{ + */ +#define LL_I2C_SR1_SB I2C_SR1_SB /*!< Start Bit (master mode) */ +#define LL_I2C_SR1_ADDR I2C_SR1_ADDR /*!< Address sent (master mode) or + Address matched flag (slave mode) */ +#define LL_I2C_SR1_BTF I2C_SR1_BTF /*!< Byte Transfer Finished flag */ +#define LL_I2C_SR1_ADD10 I2C_SR1_ADD10 /*!< 10-bit header sent (master mode) */ +#define LL_I2C_SR1_STOPF I2C_SR1_STOPF /*!< Stop detection flag (slave mode) */ +#define LL_I2C_SR1_RXNE I2C_SR1_RXNE /*!< Data register not empty (receivers) */ +#define LL_I2C_SR1_TXE I2C_SR1_TXE /*!< Data register empty (transmitters) */ +#define LL_I2C_SR1_BERR I2C_SR1_BERR /*!< Bus error */ +#define LL_I2C_SR1_ARLO I2C_SR1_ARLO /*!< Arbitration lost */ +#define LL_I2C_SR1_AF I2C_SR1_AF /*!< Acknowledge failure flag */ +#define LL_I2C_SR1_OVR I2C_SR1_OVR /*!< Overrun/Underrun */ +#define LL_I2C_SR1_PECERR I2C_ISR_PECERR /*!< PEC Error in reception (SMBus mode) */ +#define LL_I2C_SR1_TIMEOUT I2C_ISR_TIMEOUT /*!< Timeout detection flag (SMBus mode) */ +#define LL_I2C_SR1_SMALERT I2C_ISR_SMALERT /*!< SMBus alert (SMBus mode) */ +#define LL_I2C_SR2_MSL I2C_SR2_MSL /*!< Master/Slave flag */ +#define LL_I2C_SR2_BUSY I2C_SR2_BUSY /*!< Bus busy flag */ +#define LL_I2C_SR2_TRA I2C_SR2_TRA /*!< Transmitter/receiver direction */ +#define LL_I2C_SR2_GENCALL I2C_SR2_GENCALL /*!< General call address (Slave mode) */ +#define LL_I2C_SR2_SMBDEFAULT I2C_SR2_SMBDEFAULT /*!< SMBus Device default address (Slave mode) */ +#define LL_I2C_SR2_SMBHOST I2C_SR2_SMBHOST /*!< SMBus Host address (Slave mode) */ +#define LL_I2C_SR2_DUALF I2C_SR2_DUALF /*!< Dual flag (Slave mode) */ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_I2C_ReadReg and LL_I2C_WriteReg functions + * @{ + */ +#define LL_I2C_CR2_ITEVTEN I2C_CR2_ITEVTEN /*!< Events interrupts enable */ +#define LL_I2C_CR2_ITBUFEN I2C_CR2_ITBUFEN /*!< Buffer interrupts enable */ +#define LL_I2C_CR2_ITERREN I2C_CR2_ITERREN /*!< Error interrupts enable */ +/** + * @} + */ + +#if defined(I2C_FLTR_ANOFF) +/** @defgroup I2C_LL_EC_ANALOGFILTER_SELECTION Analog Filter Selection + * @{ + */ +#define LL_I2C_ANALOGFILTER_ENABLE 0x00000000U /*!< Analog filter is enabled. */ +#define LL_I2C_ANALOGFILTER_DISABLE I2C_FLTR_ANOFF /*!< Analog filter is disabled.*/ +/** + * @} + */ + +#endif +/** @defgroup I2C_LL_EC_OWNADDRESS1 Own Address 1 Length + * @{ + */ +#define LL_I2C_OWNADDRESS1_7BIT 0x00004000U /*!< Own address 1 is a 7-bit address. */ +#define LL_I2C_OWNADDRESS1_10BIT (uint32_t)(I2C_OAR1_ADDMODE | 0x00004000U) /*!< Own address 1 is a 10-bit address. */ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_DUTYCYCLE Fast Mode Duty Cycle + * @{ + */ +#define LL_I2C_DUTYCYCLE_2 0x00000000U /*!< I2C fast mode Tlow/Thigh = 2 */ +#define LL_I2C_DUTYCYCLE_16_9 I2C_CCR_DUTY /*!< I2C fast mode Tlow/Thigh = 16/9 */ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_CLOCK_SPEED_MODE Master Clock Speed Mode + * @{ + */ +#define LL_I2C_CLOCK_SPEED_STANDARD_MODE 0x00000000U /*!< Master clock speed range is standard mode */ +#define LL_I2C_CLOCK_SPEED_FAST_MODE I2C_CCR_FS /*!< Master clock speed range is fast mode */ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_PERIPHERAL_MODE Peripheral Mode + * @{ + */ +#define LL_I2C_MODE_I2C 0x00000000U /*!< I2C Master or Slave mode */ +#define LL_I2C_MODE_SMBUS_HOST (uint32_t)(I2C_CR1_SMBUS | I2C_CR1_SMBTYPE | I2C_CR1_ENARP) /*!< SMBus Host address acknowledge */ +#define LL_I2C_MODE_SMBUS_DEVICE I2C_CR1_SMBUS /*!< SMBus Device default mode (Default address not acknowledge) */ +#define LL_I2C_MODE_SMBUS_DEVICE_ARP (uint32_t)(I2C_CR1_SMBUS | I2C_CR1_ENARP) /*!< SMBus Device Default address acknowledge */ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_I2C_ACKNOWLEDGE Acknowledge Generation + * @{ + */ +#define LL_I2C_ACK I2C_CR1_ACK /*!< ACK is sent after current received byte. */ +#define LL_I2C_NACK 0x00000000U /*!< NACK is sent after current received byte.*/ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_DIRECTION Read Write Direction + * @{ + */ +#define LL_I2C_DIRECTION_WRITE I2C_SR2_TRA /*!< Bus is in write transfer */ +#define LL_I2C_DIRECTION_READ 0x00000000U /*!< Bus is in read transfer */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup I2C_LL_Exported_Macros I2C Exported Macros + * @{ + */ + +/** @defgroup I2C_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in I2C register + * @param __INSTANCE__ I2C Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_I2C_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in I2C register + * @param __INSTANCE__ I2C Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_I2C_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** @defgroup I2C_LL_EM_Exported_Macros_Helper Exported Macros Helper + * @{ + */ + +/** + * @brief Convert Peripheral Clock Frequency in Mhz. + * @param __PCLK__ This parameter must be a value of peripheral clock (in Hz). + * @retval Value of peripheral clock (in Mhz) + */ +#define __LL_I2C_FREQ_HZ_TO_MHZ(__PCLK__) (uint32_t)((__PCLK__)/1000000U) + +/** + * @brief Convert Peripheral Clock Frequency in Hz. + * @param __PCLK__ This parameter must be a value of peripheral clock (in Mhz). + * @retval Value of peripheral clock (in Hz) + */ +#define __LL_I2C_FREQ_MHZ_TO_HZ(__PCLK__) (uint32_t)((__PCLK__)*1000000U) + +/** + * @brief Compute I2C Clock rising time. + * @param __FREQRANGE__ This parameter must be a value of peripheral clock (in Mhz). + * @param __SPEED__ This parameter must be a value lower than 400kHz (in Hz). + * @retval Value between Min_Data=0x02 and Max_Data=0x3F + */ +#define __LL_I2C_RISE_TIME(__FREQRANGE__, __SPEED__) (uint32_t)(((__SPEED__) <= LL_I2C_MAX_SPEED_STANDARD) ? ((__FREQRANGE__) + 1U) : ((((__FREQRANGE__) * 300U) / 1000U) + 1U)) + +/** + * @brief Compute Speed clock range to a Clock Control Register (I2C_CCR_CCR) value. + * @param __PCLK__ This parameter must be a value of peripheral clock (in Hz). + * @param __SPEED__ This parameter must be a value lower than 400kHz (in Hz). + * @param __DUTYCYCLE__ This parameter can be one of the following values: + * @arg @ref LL_I2C_DUTYCYCLE_2 + * @arg @ref LL_I2C_DUTYCYCLE_16_9 + * @retval Value between Min_Data=0x004 and Max_Data=0xFFF, except in FAST DUTY mode where Min_Data=0x001. + */ +#define __LL_I2C_SPEED_TO_CCR(__PCLK__, __SPEED__, __DUTYCYCLE__) (uint32_t)(((__SPEED__) <= LL_I2C_MAX_SPEED_STANDARD)? \ + (__LL_I2C_SPEED_STANDARD_TO_CCR((__PCLK__), (__SPEED__))) : \ + (__LL_I2C_SPEED_FAST_TO_CCR((__PCLK__), (__SPEED__), (__DUTYCYCLE__)))) + +/** + * @brief Compute Speed Standard clock range to a Clock Control Register (I2C_CCR_CCR) value. + * @param __PCLK__ This parameter must be a value of peripheral clock (in Hz). + * @param __SPEED__ This parameter must be a value lower than 100kHz (in Hz). + * @retval Value between Min_Data=0x004 and Max_Data=0xFFF. + */ +#define __LL_I2C_SPEED_STANDARD_TO_CCR(__PCLK__, __SPEED__) (uint32_t)(((((__PCLK__)/((__SPEED__) << 1U)) & I2C_CCR_CCR) < 4U)? 4U:((__PCLK__) / ((__SPEED__) << 1U))) + +/** + * @brief Compute Speed Fast clock range to a Clock Control Register (I2C_CCR_CCR) value. + * @param __PCLK__ This parameter must be a value of peripheral clock (in Hz). + * @param __SPEED__ This parameter must be a value between Min_Data=100Khz and Max_Data=400Khz (in Hz). + * @param __DUTYCYCLE__ This parameter can be one of the following values: + * @arg @ref LL_I2C_DUTYCYCLE_2 + * @arg @ref LL_I2C_DUTYCYCLE_16_9 + * @retval Value between Min_Data=0x001 and Max_Data=0xFFF + */ +#define __LL_I2C_SPEED_FAST_TO_CCR(__PCLK__, __SPEED__, __DUTYCYCLE__) (uint32_t)(((__DUTYCYCLE__) == LL_I2C_DUTYCYCLE_2)? \ + (((((__PCLK__) / ((__SPEED__) * 3U)) & I2C_CCR_CCR) == 0U)? 1U:((__PCLK__) / ((__SPEED__) * 3U))) : \ + (((((__PCLK__) / ((__SPEED__) * 25U)) & I2C_CCR_CCR) == 0U)? 1U:((__PCLK__) / ((__SPEED__) * 25U)))) + +/** + * @brief Get the Least significant bits of a 10-Bits address. + * @param __ADDRESS__ This parameter must be a value of a 10-Bits slave address. + * @retval Value between Min_Data=0x00 and Max_Data=0xFF + */ +#define __LL_I2C_10BIT_ADDRESS(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)(0x00FF)))) + +/** + * @brief Convert a 10-Bits address to a 10-Bits header with Write direction. + * @param __ADDRESS__ This parameter must be a value of a 10-Bits slave address. + * @retval Value between Min_Data=0xF0 and Max_Data=0xF6 + */ +#define __LL_I2C_10BIT_HEADER_WRITE(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)(0x0300))) >> 7) | (uint16_t)(0xF0)))) + +/** + * @brief Convert a 10-Bits address to a 10-Bits header with Read direction. + * @param __ADDRESS__ This parameter must be a value of a 10-Bits slave address. + * @retval Value between Min_Data=0xF1 and Max_Data=0xF7 + */ +#define __LL_I2C_10BIT_HEADER_READ(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)(0x0300))) >> 7) | (uint16_t)(0xF1)))) + +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup I2C_LL_Exported_Functions I2C Exported Functions + * @{ + */ + +/** @defgroup I2C_LL_EF_Configuration Configuration + * @{ + */ + +/** + * @brief Enable I2C peripheral (PE = 1). + * @rmtoll CR1 PE LL_I2C_Enable + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_Enable(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_PE); +} + +/** + * @brief Disable I2C peripheral (PE = 0). + * @rmtoll CR1 PE LL_I2C_Disable + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_Disable(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_PE); +} + +/** + * @brief Check if the I2C peripheral is enabled or disabled. + * @rmtoll CR1 PE LL_I2C_IsEnabled + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabled(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR1, I2C_CR1_PE) == (I2C_CR1_PE)); +} + +#if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF) +/** + * @brief Configure Noise Filters (Analog and Digital). + * @note If the analog filter is also enabled, the digital filter is added to analog filter. + * The filters can only be programmed when the I2C is disabled (PE = 0). + * @rmtoll FLTR ANOFF LL_I2C_ConfigFilters\n + * FLTR DNF LL_I2C_ConfigFilters + * @param I2Cx I2C Instance. + * @param AnalogFilter This parameter can be one of the following values: + * @arg @ref LL_I2C_ANALOGFILTER_ENABLE + * @arg @ref LL_I2C_ANALOGFILTER_DISABLE + * @param DigitalFilter This parameter must be a value between Min_Data=0x00 (Digital filter disabled) and Max_Data=0x0F (Digital filter enabled and filtering capability up to 15*TPCLK1) + * This parameter is used to configure the digital noise filter on SDA and SCL input. The digital filter will suppress the spikes with a length of up to DNF[3:0]*TPCLK1. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ConfigFilters(I2C_TypeDef *I2Cx, uint32_t AnalogFilter, uint32_t DigitalFilter) +{ + MODIFY_REG(I2Cx->FLTR, I2C_FLTR_ANOFF | I2C_FLTR_DNF, AnalogFilter | DigitalFilter); +} +#endif +#if defined(I2C_FLTR_DNF) + +/** + * @brief Configure Digital Noise Filter. + * @note If the analog filter is also enabled, the digital filter is added to analog filter. + * This filter can only be programmed when the I2C is disabled (PE = 0). + * @rmtoll FLTR DNF LL_I2C_SetDigitalFilter + * @param I2Cx I2C Instance. + * @param DigitalFilter This parameter must be a value between Min_Data=0x00 (Digital filter disabled) and Max_Data=0x0F (Digital filter enabled and filtering capability up to 15*TPCLK1) + * This parameter is used to configure the digital noise filter on SDA and SCL input. The digital filter will suppress the spikes with a length of up to DNF[3:0]*TPCLK1. + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetDigitalFilter(I2C_TypeDef *I2Cx, uint32_t DigitalFilter) +{ + MODIFY_REG(I2Cx->FLTR, I2C_FLTR_DNF, DigitalFilter); +} + +/** + * @brief Get the current Digital Noise Filter configuration. + * @rmtoll FLTR DNF LL_I2C_GetDigitalFilter + * @param I2Cx I2C Instance. + * @retval Value between Min_Data=0x0 and Max_Data=0xF + */ +__STATIC_INLINE uint32_t LL_I2C_GetDigitalFilter(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->FLTR, I2C_FLTR_DNF)); +} +#endif +#if defined(I2C_FLTR_ANOFF) + +/** + * @brief Enable Analog Noise Filter. + * @note This filter can only be programmed when the I2C is disabled (PE = 0). + * @rmtoll FLTR ANOFF LL_I2C_EnableAnalogFilter + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableAnalogFilter(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->FLTR, I2C_FLTR_ANOFF); +} + +/** + * @brief Disable Analog Noise Filter. + * @note This filter can only be programmed when the I2C is disabled (PE = 0). + * @rmtoll FLTR ANOFF LL_I2C_DisableAnalogFilter + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableAnalogFilter(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->FLTR, I2C_FLTR_ANOFF); +} + +/** + * @brief Check if Analog Noise Filter is enabled or disabled. + * @rmtoll FLTR ANOFF LL_I2C_IsEnabledAnalogFilter + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledAnalogFilter(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->FLTR, I2C_FLTR_ANOFF) == (I2C_FLTR_ANOFF)); +} +#endif + +/** + * @brief Enable DMA transmission requests. + * @rmtoll CR2 DMAEN LL_I2C_EnableDMAReq_TX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableDMAReq_TX(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR2, I2C_CR2_DMAEN); +} + +/** + * @brief Disable DMA transmission requests. + * @rmtoll CR2 DMAEN LL_I2C_DisableDMAReq_TX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableDMAReq_TX(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR2, I2C_CR2_DMAEN); +} + +/** + * @brief Check if DMA transmission requests are enabled or disabled. + * @rmtoll CR2 DMAEN LL_I2C_IsEnabledDMAReq_TX + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledDMAReq_TX(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR2, I2C_CR2_DMAEN) == (I2C_CR2_DMAEN)); +} + +/** + * @brief Enable DMA reception requests. + * @rmtoll CR2 DMAEN LL_I2C_EnableDMAReq_RX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableDMAReq_RX(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR2, I2C_CR2_DMAEN); +} + +/** + * @brief Disable DMA reception requests. + * @rmtoll CR2 DMAEN LL_I2C_DisableDMAReq_RX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableDMAReq_RX(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR2, I2C_CR2_DMAEN); +} + +/** + * @brief Check if DMA reception requests are enabled or disabled. + * @rmtoll CR2 DMAEN LL_I2C_IsEnabledDMAReq_RX + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledDMAReq_RX(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR2, I2C_CR2_DMAEN) == (I2C_CR2_DMAEN)); +} + +/** + * @brief Get the data register address used for DMA transfer. + * @rmtoll DR DR LL_I2C_DMA_GetRegAddr + * @param I2Cx I2C Instance. + * @retval Address of data register + */ +__STATIC_INLINE uint32_t LL_I2C_DMA_GetRegAddr(I2C_TypeDef *I2Cx) +{ + return (uint32_t) & (I2Cx->DR); +} + +/** + * @brief Enable Clock stretching. + * @note This bit can only be programmed when the I2C is disabled (PE = 0). + * @rmtoll CR1 NOSTRETCH LL_I2C_EnableClockStretching + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableClockStretching(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_NOSTRETCH); +} + +/** + * @brief Disable Clock stretching. + * @note This bit can only be programmed when the I2C is disabled (PE = 0). + * @rmtoll CR1 NOSTRETCH LL_I2C_DisableClockStretching + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableClockStretching(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_NOSTRETCH); +} + +/** + * @brief Check if Clock stretching is enabled or disabled. + * @rmtoll CR1 NOSTRETCH LL_I2C_IsEnabledClockStretching + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledClockStretching(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR1, I2C_CR1_NOSTRETCH) != (I2C_CR1_NOSTRETCH)); +} + +/** + * @brief Enable General Call. + * @note When enabled the Address 0x00 is ACKed. + * @rmtoll CR1 ENGC LL_I2C_EnableGeneralCall + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableGeneralCall(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_ENGC); +} + +/** + * @brief Disable General Call. + * @note When disabled the Address 0x00 is NACKed. + * @rmtoll CR1 ENGC LL_I2C_DisableGeneralCall + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableGeneralCall(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_ENGC); +} + +/** + * @brief Check if General Call is enabled or disabled. + * @rmtoll CR1 ENGC LL_I2C_IsEnabledGeneralCall + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledGeneralCall(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR1, I2C_CR1_ENGC) == (I2C_CR1_ENGC)); +} + +/** + * @brief Set the Own Address1. + * @rmtoll OAR1 ADD0 LL_I2C_SetOwnAddress1\n + * OAR1 ADD1_7 LL_I2C_SetOwnAddress1\n + * OAR1 ADD8_9 LL_I2C_SetOwnAddress1\n + * OAR1 ADDMODE LL_I2C_SetOwnAddress1 + * @param I2Cx I2C Instance. + * @param OwnAddress1 This parameter must be a value between Min_Data=0 and Max_Data=0x3FF. + * @param OwnAddrSize This parameter can be one of the following values: + * @arg @ref LL_I2C_OWNADDRESS1_7BIT + * @arg @ref LL_I2C_OWNADDRESS1_10BIT + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetOwnAddress1(I2C_TypeDef *I2Cx, uint32_t OwnAddress1, uint32_t OwnAddrSize) +{ + MODIFY_REG(I2Cx->OAR1, I2C_OAR1_ADD0 | I2C_OAR1_ADD1_7 | I2C_OAR1_ADD8_9 | I2C_OAR1_ADDMODE, OwnAddress1 | OwnAddrSize); +} + +/** + * @brief Set the 7bits Own Address2. + * @note This action has no effect if own address2 is enabled. + * @rmtoll OAR2 ADD2 LL_I2C_SetOwnAddress2 + * @param I2Cx I2C Instance. + * @param OwnAddress2 This parameter must be a value between Min_Data=0 and Max_Data=0x7F. + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetOwnAddress2(I2C_TypeDef *I2Cx, uint32_t OwnAddress2) +{ + MODIFY_REG(I2Cx->OAR2, I2C_OAR2_ADD2, OwnAddress2); +} + +/** + * @brief Enable acknowledge on Own Address2 match address. + * @rmtoll OAR2 ENDUAL LL_I2C_EnableOwnAddress2 + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableOwnAddress2(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->OAR2, I2C_OAR2_ENDUAL); +} + +/** + * @brief Disable acknowledge on Own Address2 match address. + * @rmtoll OAR2 ENDUAL LL_I2C_DisableOwnAddress2 + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableOwnAddress2(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->OAR2, I2C_OAR2_ENDUAL); +} + +/** + * @brief Check if Own Address1 acknowledge is enabled or disabled. + * @rmtoll OAR2 ENDUAL LL_I2C_IsEnabledOwnAddress2 + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledOwnAddress2(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->OAR2, I2C_OAR2_ENDUAL) == (I2C_OAR2_ENDUAL)); +} + +/** + * @brief Configure the Peripheral clock frequency. + * @rmtoll CR2 FREQ LL_I2C_SetPeriphClock + * @param I2Cx I2C Instance. + * @param PeriphClock Peripheral Clock (in Hz) + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetPeriphClock(I2C_TypeDef *I2Cx, uint32_t PeriphClock) +{ + MODIFY_REG(I2Cx->CR2, I2C_CR2_FREQ, __LL_I2C_FREQ_HZ_TO_MHZ(PeriphClock)); +} + +/** + * @brief Get the Peripheral clock frequency. + * @rmtoll CR2 FREQ LL_I2C_GetPeriphClock + * @param I2Cx I2C Instance. + * @retval Value of Peripheral Clock (in Hz) + */ +__STATIC_INLINE uint32_t LL_I2C_GetPeriphClock(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(__LL_I2C_FREQ_MHZ_TO_HZ(READ_BIT(I2Cx->CR2, I2C_CR2_FREQ))); +} + +/** + * @brief Configure the Duty cycle (Fast mode only). + * @rmtoll CCR DUTY LL_I2C_SetDutyCycle + * @param I2Cx I2C Instance. + * @param DutyCycle This parameter can be one of the following values: + * @arg @ref LL_I2C_DUTYCYCLE_2 + * @arg @ref LL_I2C_DUTYCYCLE_16_9 + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetDutyCycle(I2C_TypeDef *I2Cx, uint32_t DutyCycle) +{ + MODIFY_REG(I2Cx->CCR, I2C_CCR_DUTY, DutyCycle); +} + +/** + * @brief Get the Duty cycle (Fast mode only). + * @rmtoll CCR DUTY LL_I2C_GetDutyCycle + * @param I2Cx I2C Instance. + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2C_DUTYCYCLE_2 + * @arg @ref LL_I2C_DUTYCYCLE_16_9 + */ +__STATIC_INLINE uint32_t LL_I2C_GetDutyCycle(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->CCR, I2C_CCR_DUTY)); +} + +/** + * @brief Configure the I2C master clock speed mode. + * @rmtoll CCR FS LL_I2C_SetClockSpeedMode + * @param I2Cx I2C Instance. + * @param ClockSpeedMode This parameter can be one of the following values: + * @arg @ref LL_I2C_CLOCK_SPEED_STANDARD_MODE + * @arg @ref LL_I2C_CLOCK_SPEED_FAST_MODE + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetClockSpeedMode(I2C_TypeDef *I2Cx, uint32_t ClockSpeedMode) +{ + MODIFY_REG(I2Cx->CCR, I2C_CCR_FS, ClockSpeedMode); +} + +/** + * @brief Get the the I2C master speed mode. + * @rmtoll CCR FS LL_I2C_GetClockSpeedMode + * @param I2Cx I2C Instance. + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2C_CLOCK_SPEED_STANDARD_MODE + * @arg @ref LL_I2C_CLOCK_SPEED_FAST_MODE + */ +__STATIC_INLINE uint32_t LL_I2C_GetClockSpeedMode(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->CCR, I2C_CCR_FS)); +} + +/** + * @brief Configure the SCL, SDA rising time. + * @note This bit can only be programmed when the I2C is disabled (PE = 0). + * @rmtoll TRISE TRISE LL_I2C_SetRiseTime + * @param I2Cx I2C Instance. + * @param RiseTime This parameter must be a value between Min_Data=0x02 and Max_Data=0x3F. + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetRiseTime(I2C_TypeDef *I2Cx, uint32_t RiseTime) +{ + MODIFY_REG(I2Cx->TRISE, I2C_TRISE_TRISE, RiseTime); +} + +/** + * @brief Get the SCL, SDA rising time. + * @rmtoll TRISE TRISE LL_I2C_GetRiseTime + * @param I2Cx I2C Instance. + * @retval Value between Min_Data=0x02 and Max_Data=0x3F + */ +__STATIC_INLINE uint32_t LL_I2C_GetRiseTime(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->TRISE, I2C_TRISE_TRISE)); +} + +/** + * @brief Configure the SCL high and low period. + * @note This bit can only be programmed when the I2C is disabled (PE = 0). + * @rmtoll CCR CCR LL_I2C_SetClockPeriod + * @param I2Cx I2C Instance. + * @param ClockPeriod This parameter must be a value between Min_Data=0x004 and Max_Data=0xFFF, except in FAST DUTY mode where Min_Data=0x001. + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetClockPeriod(I2C_TypeDef *I2Cx, uint32_t ClockPeriod) +{ + MODIFY_REG(I2Cx->CCR, I2C_CCR_CCR, ClockPeriod); +} + +/** + * @brief Get the SCL high and low period. + * @rmtoll CCR CCR LL_I2C_GetClockPeriod + * @param I2Cx I2C Instance. + * @retval Value between Min_Data=0x004 and Max_Data=0xFFF, except in FAST DUTY mode where Min_Data=0x001. + */ +__STATIC_INLINE uint32_t LL_I2C_GetClockPeriod(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->CCR, I2C_CCR_CCR)); +} + +/** + * @brief Configure the SCL speed. + * @note This bit can only be programmed when the I2C is disabled (PE = 0). + * @rmtoll CR2 FREQ LL_I2C_ConfigSpeed\n + * TRISE TRISE LL_I2C_ConfigSpeed\n + * CCR FS LL_I2C_ConfigSpeed\n + * CCR DUTY LL_I2C_ConfigSpeed\n + * CCR CCR LL_I2C_ConfigSpeed + * @param I2Cx I2C Instance. + * @param PeriphClock Peripheral Clock (in Hz) + * @param ClockSpeed This parameter must be a value lower than 400kHz (in Hz). + * @param DutyCycle This parameter can be one of the following values: + * @arg @ref LL_I2C_DUTYCYCLE_2 + * @arg @ref LL_I2C_DUTYCYCLE_16_9 + * @retval None + */ +__STATIC_INLINE void LL_I2C_ConfigSpeed(I2C_TypeDef *I2Cx, uint32_t PeriphClock, uint32_t ClockSpeed, + uint32_t DutyCycle) +{ + uint32_t freqrange = 0x0U; + uint32_t clockconfig = 0x0U; + + /* Compute frequency range */ + freqrange = __LL_I2C_FREQ_HZ_TO_MHZ(PeriphClock); + + /* Configure I2Cx: Frequency range register */ + MODIFY_REG(I2Cx->CR2, I2C_CR2_FREQ, freqrange); + + /* Configure I2Cx: Rise Time register */ + MODIFY_REG(I2Cx->TRISE, I2C_TRISE_TRISE, __LL_I2C_RISE_TIME(freqrange, ClockSpeed)); + + /* Configure Speed mode, Duty Cycle and Clock control register value */ + if (ClockSpeed > LL_I2C_MAX_SPEED_STANDARD) + { + /* Set Speed mode at fast and duty cycle for Clock Speed request in fast clock range */ + clockconfig = LL_I2C_CLOCK_SPEED_FAST_MODE | \ + __LL_I2C_SPEED_FAST_TO_CCR(PeriphClock, ClockSpeed, DutyCycle) | \ + DutyCycle; + } + else + { + /* Set Speed mode at standard for Clock Speed request in standard clock range */ + clockconfig = LL_I2C_CLOCK_SPEED_STANDARD_MODE | \ + __LL_I2C_SPEED_STANDARD_TO_CCR(PeriphClock, ClockSpeed); + } + + /* Configure I2Cx: Clock control register */ + MODIFY_REG(I2Cx->CCR, (I2C_CCR_FS | I2C_CCR_DUTY | I2C_CCR_CCR), clockconfig); +} + +/** + * @brief Configure peripheral mode. + * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR1 SMBUS LL_I2C_SetMode\n + * CR1 SMBTYPE LL_I2C_SetMode\n + * CR1 ENARP LL_I2C_SetMode + * @param I2Cx I2C Instance. + * @param PeripheralMode This parameter can be one of the following values: + * @arg @ref LL_I2C_MODE_I2C + * @arg @ref LL_I2C_MODE_SMBUS_HOST + * @arg @ref LL_I2C_MODE_SMBUS_DEVICE + * @arg @ref LL_I2C_MODE_SMBUS_DEVICE_ARP + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetMode(I2C_TypeDef *I2Cx, uint32_t PeripheralMode) +{ + MODIFY_REG(I2Cx->CR1, I2C_CR1_SMBUS | I2C_CR1_SMBTYPE | I2C_CR1_ENARP, PeripheralMode); +} + +/** + * @brief Get peripheral mode. + * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR1 SMBUS LL_I2C_GetMode\n + * CR1 SMBTYPE LL_I2C_GetMode\n + * CR1 ENARP LL_I2C_GetMode + * @param I2Cx I2C Instance. + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2C_MODE_I2C + * @arg @ref LL_I2C_MODE_SMBUS_HOST + * @arg @ref LL_I2C_MODE_SMBUS_DEVICE + * @arg @ref LL_I2C_MODE_SMBUS_DEVICE_ARP + */ +__STATIC_INLINE uint32_t LL_I2C_GetMode(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->CR1, I2C_CR1_SMBUS | I2C_CR1_SMBTYPE | I2C_CR1_ENARP)); +} + +/** + * @brief Enable SMBus alert (Host or Device mode) + * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @note SMBus Device mode: + * - SMBus Alert pin is drived low and + * Alert Response Address Header acknowledge is enabled. + * SMBus Host mode: + * - SMBus Alert pin management is supported. + * @rmtoll CR1 ALERT LL_I2C_EnableSMBusAlert + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableSMBusAlert(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_ALERT); +} + +/** + * @brief Disable SMBus alert (Host or Device mode) + * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @note SMBus Device mode: + * - SMBus Alert pin is not drived (can be used as a standard GPIO) and + * Alert Response Address Header acknowledge is disabled. + * SMBus Host mode: + * - SMBus Alert pin management is not supported. + * @rmtoll CR1 ALERT LL_I2C_DisableSMBusAlert + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableSMBusAlert(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_ALERT); +} + +/** + * @brief Check if SMBus alert (Host or Device mode) is enabled or disabled. + * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR1 ALERT LL_I2C_IsEnabledSMBusAlert + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledSMBusAlert(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR1, I2C_CR1_ALERT) == (I2C_CR1_ALERT)); +} + +/** + * @brief Enable SMBus Packet Error Calculation (PEC). + * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR1 ENPEC LL_I2C_EnableSMBusPEC + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableSMBusPEC(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_ENPEC); +} + +/** + * @brief Disable SMBus Packet Error Calculation (PEC). + * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR1 ENPEC LL_I2C_DisableSMBusPEC + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableSMBusPEC(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_ENPEC); +} + +/** + * @brief Check if SMBus Packet Error Calculation (PEC) is enabled or disabled. + * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR1 ENPEC LL_I2C_IsEnabledSMBusPEC + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledSMBusPEC(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR1, I2C_CR1_ENPEC) == (I2C_CR1_ENPEC)); +} + +/** + * @} + */ + +/** @defgroup I2C_LL_EF_IT_Management IT_Management + * @{ + */ + +/** + * @brief Enable TXE interrupt. + * @rmtoll CR2 ITEVTEN LL_I2C_EnableIT_TX\n + * CR2 ITBUFEN LL_I2C_EnableIT_TX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableIT_TX(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN); +} + +/** + * @brief Disable TXE interrupt. + * @rmtoll CR2 ITEVTEN LL_I2C_DisableIT_TX\n + * CR2 ITBUFEN LL_I2C_DisableIT_TX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableIT_TX(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN); +} + +/** + * @brief Check if the TXE Interrupt is enabled or disabled. + * @rmtoll CR2 ITEVTEN LL_I2C_IsEnabledIT_TX\n + * CR2 ITBUFEN LL_I2C_IsEnabledIT_TX + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_TX(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN) == (I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN)); +} + +/** + * @brief Enable RXNE interrupt. + * @rmtoll CR2 ITEVTEN LL_I2C_EnableIT_RX\n + * CR2 ITBUFEN LL_I2C_EnableIT_RX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableIT_RX(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN); +} + +/** + * @brief Disable RXNE interrupt. + * @rmtoll CR2 ITEVTEN LL_I2C_DisableIT_RX\n + * CR2 ITBUFEN LL_I2C_DisableIT_RX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableIT_RX(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN); +} + +/** + * @brief Check if the RXNE Interrupt is enabled or disabled. + * @rmtoll CR2 ITEVTEN LL_I2C_IsEnabledIT_RX\n + * CR2 ITBUFEN LL_I2C_IsEnabledIT_RX + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_RX(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN) == (I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN)); +} + +/** + * @brief Enable Events interrupts. + * @note Any of these events will generate interrupt : + * Start Bit (SB) + * Address sent, Address matched (ADDR) + * 10-bit header sent (ADD10) + * Stop detection (STOPF) + * Byte transfer finished (BTF) + * + * @note Any of these events will generate interrupt if Buffer interrupts are enabled too(using unitary function @ref LL_I2C_EnableIT_BUF()) : + * Receive buffer not empty (RXNE) + * Transmit buffer empty (TXE) + * @rmtoll CR2 ITEVTEN LL_I2C_EnableIT_EVT + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableIT_EVT(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN); +} + +/** + * @brief Disable Events interrupts. + * @note Any of these events will generate interrupt : + * Start Bit (SB) + * Address sent, Address matched (ADDR) + * 10-bit header sent (ADD10) + * Stop detection (STOPF) + * Byte transfer finished (BTF) + * Receive buffer not empty (RXNE) + * Transmit buffer empty (TXE) + * @rmtoll CR2 ITEVTEN LL_I2C_DisableIT_EVT + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableIT_EVT(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN); +} + +/** + * @brief Check if Events interrupts are enabled or disabled. + * @rmtoll CR2 ITEVTEN LL_I2C_IsEnabledIT_EVT + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_EVT(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN) == (I2C_CR2_ITEVTEN)); +} + +/** + * @brief Enable Buffer interrupts. + * @note Any of these Buffer events will generate interrupt if Events interrupts are enabled too(using unitary function @ref LL_I2C_EnableIT_EVT()) : + * Receive buffer not empty (RXNE) + * Transmit buffer empty (TXE) + * @rmtoll CR2 ITBUFEN LL_I2C_EnableIT_BUF + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableIT_BUF(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR2, I2C_CR2_ITBUFEN); +} + +/** + * @brief Disable Buffer interrupts. + * @note Any of these Buffer events will generate interrupt : + * Receive buffer not empty (RXNE) + * Transmit buffer empty (TXE) + * @rmtoll CR2 ITBUFEN LL_I2C_DisableIT_BUF + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableIT_BUF(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITBUFEN); +} + +/** + * @brief Check if Buffer interrupts are enabled or disabled. + * @rmtoll CR2 ITBUFEN LL_I2C_IsEnabledIT_BUF + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_BUF(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR2, I2C_CR2_ITBUFEN) == (I2C_CR2_ITBUFEN)); +} + +/** + * @brief Enable Error interrupts. + * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @note Any of these errors will generate interrupt : + * Bus Error detection (BERR) + * Arbitration Loss (ARLO) + * Acknowledge Failure(AF) + * Overrun/Underrun (OVR) + * SMBus Timeout detection (TIMEOUT) + * SMBus PEC error detection (PECERR) + * SMBus Alert pin event detection (SMBALERT) + * @rmtoll CR2 ITERREN LL_I2C_EnableIT_ERR + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableIT_ERR(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR2, I2C_CR2_ITERREN); +} + +/** + * @brief Disable Error interrupts. + * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @note Any of these errors will generate interrupt : + * Bus Error detection (BERR) + * Arbitration Loss (ARLO) + * Acknowledge Failure(AF) + * Overrun/Underrun (OVR) + * SMBus Timeout detection (TIMEOUT) + * SMBus PEC error detection (PECERR) + * SMBus Alert pin event detection (SMBALERT) + * @rmtoll CR2 ITERREN LL_I2C_DisableIT_ERR + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableIT_ERR(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITERREN); +} + +/** + * @brief Check if Error interrupts are enabled or disabled. + * @rmtoll CR2 ITERREN LL_I2C_IsEnabledIT_ERR + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_ERR(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR2, I2C_CR2_ITERREN) == (I2C_CR2_ITERREN)); +} + +/** + * @} + */ + +/** @defgroup I2C_LL_EF_FLAG_management FLAG_management + * @{ + */ + +/** + * @brief Indicate the status of Transmit data register empty flag. + * @note RESET: When next data is written in Transmit data register. + * SET: When Transmit data register is empty. + * @rmtoll SR1 TXE LL_I2C_IsActiveFlag_TXE + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_TXE(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_TXE) == (I2C_SR1_TXE)); +} + +/** + * @brief Indicate the status of Byte Transfer Finished flag. + * RESET: When Data byte transfer not done. + * SET: When Data byte transfer succeeded. + * @rmtoll SR1 BTF LL_I2C_IsActiveFlag_BTF + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_BTF(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_BTF) == (I2C_SR1_BTF)); +} + +/** + * @brief Indicate the status of Receive data register not empty flag. + * @note RESET: When Receive data register is read. + * SET: When the received data is copied in Receive data register. + * @rmtoll SR1 RXNE LL_I2C_IsActiveFlag_RXNE + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_RXNE(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_RXNE) == (I2C_SR1_RXNE)); +} + +/** + * @brief Indicate the status of Start Bit (master mode). + * @note RESET: When No Start condition. + * SET: When Start condition is generated. + * @rmtoll SR1 SB LL_I2C_IsActiveFlag_SB + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_SB(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_SB) == (I2C_SR1_SB)); +} + +/** + * @brief Indicate the status of Address sent (master mode) or Address matched flag (slave mode). + * @note RESET: Clear default value. + * SET: When the address is fully sent (master mode) or when the received slave address matched with one of the enabled slave address (slave mode). + * @rmtoll SR1 ADDR LL_I2C_IsActiveFlag_ADDR + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_ADDR(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_ADDR) == (I2C_SR1_ADDR)); +} + +/** + * @brief Indicate the status of 10-bit header sent (master mode). + * @note RESET: When no ADD10 event occurred. + * SET: When the master has sent the first address byte (header). + * @rmtoll SR1 ADD10 LL_I2C_IsActiveFlag_ADD10 + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_ADD10(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_ADD10) == (I2C_SR1_ADD10)); +} + +/** + * @brief Indicate the status of Acknowledge failure flag. + * @note RESET: No acknowledge failure. + * SET: When an acknowledge failure is received after a byte transmission. + * @rmtoll SR1 AF LL_I2C_IsActiveFlag_AF + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_AF(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_AF) == (I2C_SR1_AF)); +} + +/** + * @brief Indicate the status of Stop detection flag (slave mode). + * @note RESET: Clear default value. + * SET: When a Stop condition is detected. + * @rmtoll SR1 STOPF LL_I2C_IsActiveFlag_STOP + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_STOP(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_STOPF) == (I2C_SR1_STOPF)); +} + +/** + * @brief Indicate the status of Bus error flag. + * @note RESET: Clear default value. + * SET: When a misplaced Start or Stop condition is detected. + * @rmtoll SR1 BERR LL_I2C_IsActiveFlag_BERR + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_BERR(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_BERR) == (I2C_SR1_BERR)); +} + +/** + * @brief Indicate the status of Arbitration lost flag. + * @note RESET: Clear default value. + * SET: When arbitration lost. + * @rmtoll SR1 ARLO LL_I2C_IsActiveFlag_ARLO + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_ARLO(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_ARLO) == (I2C_SR1_ARLO)); +} + +/** + * @brief Indicate the status of Overrun/Underrun flag. + * @note RESET: Clear default value. + * SET: When an overrun/underrun error occurs (Clock Stretching Disabled). + * @rmtoll SR1 OVR LL_I2C_IsActiveFlag_OVR + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_OVR(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_OVR) == (I2C_SR1_OVR)); +} + +/** + * @brief Indicate the status of SMBus PEC error flag in reception. + * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll SR1 PECERR LL_I2C_IsActiveSMBusFlag_PECERR + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_PECERR(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_PECERR) == (I2C_SR1_PECERR)); +} + +/** + * @brief Indicate the status of SMBus Timeout detection flag. + * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll SR1 TIMEOUT LL_I2C_IsActiveSMBusFlag_TIMEOUT + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_TIMEOUT(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_TIMEOUT) == (I2C_SR1_TIMEOUT)); +} + +/** + * @brief Indicate the status of SMBus alert flag. + * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll SR1 SMBALERT LL_I2C_IsActiveSMBusFlag_ALERT + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_ALERT(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_SMBALERT) == (I2C_SR1_SMBALERT)); +} + +/** + * @brief Indicate the status of Bus Busy flag. + * @note RESET: Clear default value. + * SET: When a Start condition is detected. + * @rmtoll SR2 BUSY LL_I2C_IsActiveFlag_BUSY + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_BUSY(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR2, I2C_SR2_BUSY) == (I2C_SR2_BUSY)); +} + +/** + * @brief Indicate the status of Dual flag. + * @note RESET: Received address matched with OAR1. + * SET: Received address matched with OAR2. + * @rmtoll SR2 DUALF LL_I2C_IsActiveFlag_DUAL + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_DUAL(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR2, I2C_SR2_DUALF) == (I2C_SR2_DUALF)); +} + +/** + * @brief Indicate the status of SMBus Host address reception (Slave mode). + * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @note RESET: No SMBus Host address + * SET: SMBus Host address received. + * @note This status is cleared by hardware after a STOP condition or repeated START condition. + * @rmtoll SR2 SMBHOST LL_I2C_IsActiveSMBusFlag_SMBHOST + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_SMBHOST(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR2, I2C_SR2_SMBHOST) == (I2C_SR2_SMBHOST)); +} + +/** + * @brief Indicate the status of SMBus Device default address reception (Slave mode). + * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @note RESET: No SMBus Device default address + * SET: SMBus Device default address received. + * @note This status is cleared by hardware after a STOP condition or repeated START condition. + * @rmtoll SR2 SMBDEFAULT LL_I2C_IsActiveSMBusFlag_SMBDEFAULT + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_SMBDEFAULT(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR2, I2C_SR2_SMBDEFAULT) == (I2C_SR2_SMBDEFAULT)); +} + +/** + * @brief Indicate the status of General call address reception (Slave mode). + * @note RESET: No General call address + * SET: General call address received. + * @note This status is cleared by hardware after a STOP condition or repeated START condition. + * @rmtoll SR2 GENCALL LL_I2C_IsActiveFlag_GENCALL + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_GENCALL(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR2, I2C_SR2_GENCALL) == (I2C_SR2_GENCALL)); +} + +/** + * @brief Indicate the status of Master/Slave flag. + * @note RESET: Slave Mode. + * SET: Master Mode. + * @rmtoll SR2 MSL LL_I2C_IsActiveFlag_MSL + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_MSL(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR2, I2C_SR2_MSL) == (I2C_SR2_MSL)); +} + +/** + * @brief Clear Address Matched flag. + * @note Clearing this flag is done by a read access to the I2Cx_SR1 + * register followed by a read access to the I2Cx_SR2 register. + * @rmtoll SR1 ADDR LL_I2C_ClearFlag_ADDR + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearFlag_ADDR(I2C_TypeDef *I2Cx) +{ + __IO uint32_t tmpreg; + tmpreg = I2Cx->SR1; + (void) tmpreg; + tmpreg = I2Cx->SR2; + (void) tmpreg; +} + +/** + * @brief Clear Acknowledge failure flag. + * @rmtoll SR1 AF LL_I2C_ClearFlag_AF + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearFlag_AF(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->SR1, I2C_SR1_AF); +} + +/** + * @brief Clear Stop detection flag. + * @note Clearing this flag is done by a read access to the I2Cx_SR1 + * register followed by a write access to I2Cx_CR1 register. + * @rmtoll SR1 STOPF LL_I2C_ClearFlag_STOP\n + * CR1 PE LL_I2C_ClearFlag_STOP + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearFlag_STOP(I2C_TypeDef *I2Cx) +{ + __IO uint32_t tmpreg; + tmpreg = I2Cx->SR1; + (void) tmpreg; + SET_BIT(I2Cx->CR1, I2C_CR1_PE); +} + +/** + * @brief Clear Bus error flag. + * @rmtoll SR1 BERR LL_I2C_ClearFlag_BERR + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearFlag_BERR(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->SR1, I2C_SR1_BERR); +} + +/** + * @brief Clear Arbitration lost flag. + * @rmtoll SR1 ARLO LL_I2C_ClearFlag_ARLO + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearFlag_ARLO(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->SR1, I2C_SR1_ARLO); +} + +/** + * @brief Clear Overrun/Underrun flag. + * @rmtoll SR1 OVR LL_I2C_ClearFlag_OVR + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearFlag_OVR(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->SR1, I2C_SR1_OVR); +} + +/** + * @brief Clear SMBus PEC error flag. + * @rmtoll SR1 PECERR LL_I2C_ClearSMBusFlag_PECERR + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearSMBusFlag_PECERR(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->SR1, I2C_SR1_PECERR); +} + +/** + * @brief Clear SMBus Timeout detection flag. + * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll SR1 TIMEOUT LL_I2C_ClearSMBusFlag_TIMEOUT + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearSMBusFlag_TIMEOUT(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->SR1, I2C_SR1_TIMEOUT); +} + +/** + * @brief Clear SMBus Alert flag. + * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll SR1 SMBALERT LL_I2C_ClearSMBusFlag_ALERT + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearSMBusFlag_ALERT(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->SR1, I2C_SR1_SMBALERT); +} + +/** + * @} + */ + +/** @defgroup I2C_LL_EF_Data_Management Data_Management + * @{ + */ + +/** + * @brief Enable Reset of I2C peripheral. + * @rmtoll CR1 SWRST LL_I2C_EnableReset + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableReset(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_SWRST); +} + +/** + * @brief Disable Reset of I2C peripheral. + * @rmtoll CR1 SWRST LL_I2C_DisableReset + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableReset(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_SWRST); +} + +/** + * @brief Check if the I2C peripheral is under reset state or not. + * @rmtoll CR1 SWRST LL_I2C_IsResetEnabled + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsResetEnabled(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR1, I2C_CR1_SWRST) == (I2C_CR1_SWRST)); +} + +/** + * @brief Prepare the generation of a ACKnowledge or Non ACKnowledge condition after the address receive match code or next received byte. + * @note Usage in Slave or Master mode. + * @rmtoll CR1 ACK LL_I2C_AcknowledgeNextData + * @param I2Cx I2C Instance. + * @param TypeAcknowledge This parameter can be one of the following values: + * @arg @ref LL_I2C_ACK + * @arg @ref LL_I2C_NACK + * @retval None + */ +__STATIC_INLINE void LL_I2C_AcknowledgeNextData(I2C_TypeDef *I2Cx, uint32_t TypeAcknowledge) +{ + MODIFY_REG(I2Cx->CR1, I2C_CR1_ACK, TypeAcknowledge); +} + +/** + * @brief Generate a START or RESTART condition + * @note The START bit can be set even if bus is BUSY or I2C is in slave mode. + * This action has no effect when RELOAD is set. + * @rmtoll CR1 START LL_I2C_GenerateStartCondition + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_GenerateStartCondition(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_START); +} + +/** + * @brief Generate a STOP condition after the current byte transfer (master mode). + * @rmtoll CR1 STOP LL_I2C_GenerateStopCondition + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_GenerateStopCondition(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_STOP); +} + +/** + * @brief Enable bit POS (master/host mode). + * @note In that case, the ACK bit controls the (N)ACK of the next byte received or the PEC bit indicates that the next byte in shift register is a PEC. + * @rmtoll CR1 POS LL_I2C_EnableBitPOS + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableBitPOS(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_POS); +} + +/** + * @brief Disable bit POS (master/host mode). + * @note In that case, the ACK bit controls the (N)ACK of the current byte received or the PEC bit indicates that the current byte in shift register is a PEC. + * @rmtoll CR1 POS LL_I2C_DisableBitPOS + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableBitPOS(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_POS); +} + +/** + * @brief Check if bit POS is enabled or disabled. + * @rmtoll CR1 POS LL_I2C_IsEnabledBitPOS + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledBitPOS(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR1, I2C_CR1_POS) == (I2C_CR1_POS)); +} + +/** + * @brief Indicate the value of transfer direction. + * @note RESET: Bus is in read transfer (peripheral point of view). + * SET: Bus is in write transfer (peripheral point of view). + * @rmtoll SR2 TRA LL_I2C_GetTransferDirection + * @param I2Cx I2C Instance. + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2C_DIRECTION_WRITE + * @arg @ref LL_I2C_DIRECTION_READ + */ +__STATIC_INLINE uint32_t LL_I2C_GetTransferDirection(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SR2, I2C_SR2_TRA)); +} + +/** + * @brief Enable DMA last transfer. + * @note This action mean that next DMA EOT is the last transfer. + * @rmtoll CR2 LAST LL_I2C_EnableLastDMA + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableLastDMA(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR2, I2C_CR2_LAST); +} + +/** + * @brief Disable DMA last transfer. + * @note This action mean that next DMA EOT is not the last transfer. + * @rmtoll CR2 LAST LL_I2C_DisableLastDMA + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableLastDMA(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR2, I2C_CR2_LAST); +} + +/** + * @brief Check if DMA last transfer is enabled or disabled. + * @rmtoll CR2 LAST LL_I2C_IsEnabledLastDMA + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledLastDMA(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR2, I2C_CR2_LAST) == (I2C_CR2_LAST)); +} + +/** + * @brief Enable transfer or internal comparison of the SMBus Packet Error byte (transmission or reception mode). + * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @note This feature is cleared by hardware when the PEC byte is transferred or compared, + * or by a START or STOP condition, it is also cleared by software. + * @rmtoll CR1 PEC LL_I2C_EnableSMBusPECCompare + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableSMBusPECCompare(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_PEC); +} + +/** + * @brief Disable transfer or internal comparison of the SMBus Packet Error byte (transmission or reception mode). + * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR1 PEC LL_I2C_DisableSMBusPECCompare + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableSMBusPECCompare(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_PEC); +} + +/** + * @brief Check if the SMBus Packet Error byte transfer or internal comparison is requested or not. + * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR1 PEC LL_I2C_IsEnabledSMBusPECCompare + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledSMBusPECCompare(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR1, I2C_CR1_PEC) == (I2C_CR1_PEC)); +} + +/** + * @brief Get the SMBus Packet Error byte calculated. + * @note Macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll SR2 PEC LL_I2C_GetSMBusPEC + * @param I2Cx I2C Instance. + * @retval Value between Min_Data=0x00 and Max_Data=0xFF + */ +__STATIC_INLINE uint32_t LL_I2C_GetSMBusPEC(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SR2, I2C_SR2_PEC) >> I2C_SR2_PEC_Pos); +} + +/** + * @brief Read Receive Data register. + * @rmtoll DR DR LL_I2C_ReceiveData8 + * @param I2Cx I2C Instance. + * @retval Value between Min_Data=0x0 and Max_Data=0xFF + */ +__STATIC_INLINE uint8_t LL_I2C_ReceiveData8(I2C_TypeDef *I2Cx) +{ + return (uint8_t)(READ_BIT(I2Cx->DR, I2C_DR_DR)); +} + +/** + * @brief Write in Transmit Data Register . + * @rmtoll DR DR LL_I2C_TransmitData8 + * @param I2Cx I2C Instance. + * @param Data Value between Min_Data=0x0 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_I2C_TransmitData8(I2C_TypeDef *I2Cx, uint8_t Data) +{ + MODIFY_REG(I2Cx->DR, I2C_DR_DR, Data); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup I2C_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + +uint32_t LL_I2C_Init(I2C_TypeDef *I2Cx, LL_I2C_InitTypeDef *I2C_InitStruct); +uint32_t LL_I2C_DeInit(I2C_TypeDef *I2Cx); +void LL_I2C_StructInit(LL_I2C_InitTypeDef *I2C_InitStruct); + + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* I2C1 || I2C2 || I2C3 */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_I2C_H */ + diff --git a/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h new file mode 100644 index 0000000..ea23dc5 --- /dev/null +++ b/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/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h new file mode 100644 index 0000000..0a6a5b9 --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h @@ -0,0 +1,7101 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_rcc.h + * @author MCD Application Team + * @brief Header file of RCC LL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_RCC_H +#define __STM32F4xx_LL_RCC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined(RCC) + +/** @defgroup RCC_LL RCC + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @defgroup RCC_LL_Private_Variables RCC Private Variables + * @{ + */ + +#if defined(RCC_PLLSAI_SUPPORT) && defined(LTDC) +static const uint8_t aRCC_PLLSAIDIVRPrescTable[4] = {2, 4, 8, 16}; +#endif /* RCC_PLLSAI_SUPPORT && LTDC */ + +/** + * @} + */ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup RCC_LL_Private_Macros RCC Private Macros + * @{ + */ +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup RCC_LL_Exported_Types RCC Exported Types + * @{ + */ + +/** @defgroup LL_ES_CLOCK_FREQ Clocks Frequency Structure + * @{ + */ + +/** + * @brief RCC Clocks Frequency Structure + */ +typedef struct +{ + uint32_t SYSCLK_Frequency; /*!< SYSCLK clock frequency */ + uint32_t HCLK_Frequency; /*!< HCLK clock frequency */ + uint32_t PCLK1_Frequency; /*!< PCLK1 clock frequency */ + uint32_t PCLK2_Frequency; /*!< PCLK2 clock frequency */ +} LL_RCC_ClocksTypeDef; + +/** + * @} + */ + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup RCC_LL_Exported_Constants RCC Exported Constants + * @{ + */ + +/** @defgroup RCC_LL_EC_OSC_VALUES Oscillator Values adaptation + * @brief Defines used to adapt values of different oscillators + * @note These values could be modified in the user environment according to + * HW set-up. + * @{ + */ +#if !defined (HSE_VALUE) +#define HSE_VALUE 25000000U /*!< Value of the HSE oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) +#define HSI_VALUE 16000000U /*!< Value of the HSI oscillator in Hz */ +#endif /* HSI_VALUE */ + +#if !defined (LSE_VALUE) +#define LSE_VALUE 32768U /*!< Value of the LSE oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSI_VALUE) +#define LSI_VALUE 32000U /*!< Value of the LSI oscillator in Hz */ +#endif /* LSI_VALUE */ + +#if !defined (EXTERNAL_CLOCK_VALUE) +#define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the I2S_CKIN external oscillator in Hz */ +#endif /* EXTERNAL_CLOCK_VALUE */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_CLEAR_FLAG Clear Flags Defines + * @brief Flags defines which can be used with LL_RCC_WriteReg function + * @{ + */ +#define LL_RCC_CIR_LSIRDYC RCC_CIR_LSIRDYC /*!< LSI Ready Interrupt Clear */ +#define LL_RCC_CIR_LSERDYC RCC_CIR_LSERDYC /*!< LSE Ready Interrupt Clear */ +#define LL_RCC_CIR_HSIRDYC RCC_CIR_HSIRDYC /*!< HSI Ready Interrupt Clear */ +#define LL_RCC_CIR_HSERDYC RCC_CIR_HSERDYC /*!< HSE Ready Interrupt Clear */ +#define LL_RCC_CIR_PLLRDYC RCC_CIR_PLLRDYC /*!< PLL Ready Interrupt Clear */ +#if defined(RCC_PLLI2S_SUPPORT) +#define LL_RCC_CIR_PLLI2SRDYC RCC_CIR_PLLI2SRDYC /*!< PLLI2S Ready Interrupt Clear */ +#endif /* RCC_PLLI2S_SUPPORT */ +#if defined(RCC_PLLSAI_SUPPORT) +#define LL_RCC_CIR_PLLSAIRDYC RCC_CIR_PLLSAIRDYC /*!< PLLSAI Ready Interrupt Clear */ +#endif /* RCC_PLLSAI_SUPPORT */ +#define LL_RCC_CIR_CSSC RCC_CIR_CSSC /*!< Clock Security System Interrupt Clear */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_RCC_ReadReg function + * @{ + */ +#define LL_RCC_CIR_LSIRDYF RCC_CIR_LSIRDYF /*!< LSI Ready Interrupt flag */ +#define LL_RCC_CIR_LSERDYF RCC_CIR_LSERDYF /*!< LSE Ready Interrupt flag */ +#define LL_RCC_CIR_HSIRDYF RCC_CIR_HSIRDYF /*!< HSI Ready Interrupt flag */ +#define LL_RCC_CIR_HSERDYF RCC_CIR_HSERDYF /*!< HSE Ready Interrupt flag */ +#define LL_RCC_CIR_PLLRDYF RCC_CIR_PLLRDYF /*!< PLL Ready Interrupt flag */ +#if defined(RCC_PLLI2S_SUPPORT) +#define LL_RCC_CIR_PLLI2SRDYF RCC_CIR_PLLI2SRDYF /*!< PLLI2S Ready Interrupt flag */ +#endif /* RCC_PLLI2S_SUPPORT */ +#if defined(RCC_PLLSAI_SUPPORT) +#define LL_RCC_CIR_PLLSAIRDYF RCC_CIR_PLLSAIRDYF /*!< PLLSAI Ready Interrupt flag */ +#endif /* RCC_PLLSAI_SUPPORT */ +#define LL_RCC_CIR_CSSF RCC_CIR_CSSF /*!< Clock Security System Interrupt flag */ +#define LL_RCC_CSR_LPWRRSTF RCC_CSR_LPWRRSTF /*!< Low-Power reset flag */ +#define LL_RCC_CSR_PINRSTF RCC_CSR_PINRSTF /*!< PIN reset flag */ +#define LL_RCC_CSR_PORRSTF RCC_CSR_PORRSTF /*!< POR/PDR reset flag */ +#define LL_RCC_CSR_SFTRSTF RCC_CSR_SFTRSTF /*!< Software Reset flag */ +#define LL_RCC_CSR_IWDGRSTF RCC_CSR_IWDGRSTF /*!< Independent Watchdog reset flag */ +#define LL_RCC_CSR_WWDGRSTF RCC_CSR_WWDGRSTF /*!< Window watchdog reset flag */ +#if defined(RCC_CSR_BORRSTF) +#define LL_RCC_CSR_BORRSTF RCC_CSR_BORRSTF /*!< BOR reset flag */ +#endif /* RCC_CSR_BORRSTF */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_RCC_ReadReg and LL_RCC_WriteReg functions + * @{ + */ +#define LL_RCC_CIR_LSIRDYIE RCC_CIR_LSIRDYIE /*!< LSI Ready Interrupt Enable */ +#define LL_RCC_CIR_LSERDYIE RCC_CIR_LSERDYIE /*!< LSE Ready Interrupt Enable */ +#define LL_RCC_CIR_HSIRDYIE RCC_CIR_HSIRDYIE /*!< HSI Ready Interrupt Enable */ +#define LL_RCC_CIR_HSERDYIE RCC_CIR_HSERDYIE /*!< HSE Ready Interrupt Enable */ +#define LL_RCC_CIR_PLLRDYIE RCC_CIR_PLLRDYIE /*!< PLL Ready Interrupt Enable */ +#if defined(RCC_PLLI2S_SUPPORT) +#define LL_RCC_CIR_PLLI2SRDYIE RCC_CIR_PLLI2SRDYIE /*!< PLLI2S Ready Interrupt Enable */ +#endif /* RCC_PLLI2S_SUPPORT */ +#if defined(RCC_PLLSAI_SUPPORT) +#define LL_RCC_CIR_PLLSAIRDYIE RCC_CIR_PLLSAIRDYIE /*!< PLLSAI Ready Interrupt Enable */ +#endif /* RCC_PLLSAI_SUPPORT */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_SYS_CLKSOURCE System clock switch + * @{ + */ +#define LL_RCC_SYS_CLKSOURCE_HSI RCC_CFGR_SW_HSI /*!< HSI selection as system clock */ +#define LL_RCC_SYS_CLKSOURCE_HSE RCC_CFGR_SW_HSE /*!< HSE selection as system clock */ +#define LL_RCC_SYS_CLKSOURCE_PLL RCC_CFGR_SW_PLL /*!< PLL selection as system clock */ +#if defined(RCC_CFGR_SW_PLLR) +#define LL_RCC_SYS_CLKSOURCE_PLLR RCC_CFGR_SW_PLLR /*!< PLLR selection as system clock */ +#endif /* RCC_CFGR_SW_PLLR */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_SYS_CLKSOURCE_STATUS System clock switch status + * @{ + */ +#define LL_RCC_SYS_CLKSOURCE_STATUS_HSI RCC_CFGR_SWS_HSI /*!< HSI used as system clock */ +#define LL_RCC_SYS_CLKSOURCE_STATUS_HSE RCC_CFGR_SWS_HSE /*!< HSE used as system clock */ +#define LL_RCC_SYS_CLKSOURCE_STATUS_PLL RCC_CFGR_SWS_PLL /*!< PLL used as system clock */ +#if defined(RCC_PLLR_SYSCLK_SUPPORT) +#define LL_RCC_SYS_CLKSOURCE_STATUS_PLLR RCC_CFGR_SWS_PLLR /*!< PLLR used as system clock */ +#endif /* RCC_PLLR_SYSCLK_SUPPORT */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_SYSCLK_DIV AHB prescaler + * @{ + */ +#define LL_RCC_SYSCLK_DIV_1 RCC_CFGR_HPRE_DIV1 /*!< SYSCLK not divided */ +#define LL_RCC_SYSCLK_DIV_2 RCC_CFGR_HPRE_DIV2 /*!< SYSCLK divided by 2 */ +#define LL_RCC_SYSCLK_DIV_4 RCC_CFGR_HPRE_DIV4 /*!< SYSCLK divided by 4 */ +#define LL_RCC_SYSCLK_DIV_8 RCC_CFGR_HPRE_DIV8 /*!< SYSCLK divided by 8 */ +#define LL_RCC_SYSCLK_DIV_16 RCC_CFGR_HPRE_DIV16 /*!< SYSCLK divided by 16 */ +#define LL_RCC_SYSCLK_DIV_64 RCC_CFGR_HPRE_DIV64 /*!< SYSCLK divided by 64 */ +#define LL_RCC_SYSCLK_DIV_128 RCC_CFGR_HPRE_DIV128 /*!< SYSCLK divided by 128 */ +#define LL_RCC_SYSCLK_DIV_256 RCC_CFGR_HPRE_DIV256 /*!< SYSCLK divided by 256 */ +#define LL_RCC_SYSCLK_DIV_512 RCC_CFGR_HPRE_DIV512 /*!< SYSCLK divided by 512 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_APB1_DIV APB low-speed prescaler (APB1) + * @{ + */ +#define LL_RCC_APB1_DIV_1 RCC_CFGR_PPRE1_DIV1 /*!< HCLK not divided */ +#define LL_RCC_APB1_DIV_2 RCC_CFGR_PPRE1_DIV2 /*!< HCLK divided by 2 */ +#define LL_RCC_APB1_DIV_4 RCC_CFGR_PPRE1_DIV4 /*!< HCLK divided by 4 */ +#define LL_RCC_APB1_DIV_8 RCC_CFGR_PPRE1_DIV8 /*!< HCLK divided by 8 */ +#define LL_RCC_APB1_DIV_16 RCC_CFGR_PPRE1_DIV16 /*!< HCLK divided by 16 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_APB2_DIV APB high-speed prescaler (APB2) + * @{ + */ +#define LL_RCC_APB2_DIV_1 RCC_CFGR_PPRE2_DIV1 /*!< HCLK not divided */ +#define LL_RCC_APB2_DIV_2 RCC_CFGR_PPRE2_DIV2 /*!< HCLK divided by 2 */ +#define LL_RCC_APB2_DIV_4 RCC_CFGR_PPRE2_DIV4 /*!< HCLK divided by 4 */ +#define LL_RCC_APB2_DIV_8 RCC_CFGR_PPRE2_DIV8 /*!< HCLK divided by 8 */ +#define LL_RCC_APB2_DIV_16 RCC_CFGR_PPRE2_DIV16 /*!< HCLK divided by 16 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_MCOxSOURCE MCO source selection + * @{ + */ +#define LL_RCC_MCO1SOURCE_HSI (uint32_t)(RCC_CFGR_MCO1|0x00000000U) /*!< HSI selection as MCO1 source */ +#define LL_RCC_MCO1SOURCE_LSE (uint32_t)(RCC_CFGR_MCO1|(RCC_CFGR_MCO1_0 >> 16U)) /*!< LSE selection as MCO1 source */ +#define LL_RCC_MCO1SOURCE_HSE (uint32_t)(RCC_CFGR_MCO1|(RCC_CFGR_MCO1_1 >> 16U)) /*!< HSE selection as MCO1 source */ +#define LL_RCC_MCO1SOURCE_PLLCLK (uint32_t)(RCC_CFGR_MCO1|((RCC_CFGR_MCO1_1|RCC_CFGR_MCO1_0) >> 16U)) /*!< PLLCLK selection as MCO1 source */ +#if defined(RCC_CFGR_MCO2) +#define LL_RCC_MCO2SOURCE_SYSCLK (uint32_t)(RCC_CFGR_MCO2|0x00000000U) /*!< SYSCLK selection as MCO2 source */ +#define LL_RCC_MCO2SOURCE_PLLI2S (uint32_t)(RCC_CFGR_MCO2|(RCC_CFGR_MCO2_0 >> 16U)) /*!< PLLI2S selection as MCO2 source */ +#define LL_RCC_MCO2SOURCE_HSE (uint32_t)(RCC_CFGR_MCO2|(RCC_CFGR_MCO2_1 >> 16U)) /*!< HSE selection as MCO2 source */ +#define LL_RCC_MCO2SOURCE_PLLCLK (uint32_t)(RCC_CFGR_MCO2|((RCC_CFGR_MCO2_1|RCC_CFGR_MCO2_0) >> 16U)) /*!< PLLCLK selection as MCO2 source */ +#endif /* RCC_CFGR_MCO2 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_MCOx_DIV MCO prescaler + * @{ + */ +#define LL_RCC_MCO1_DIV_1 (uint32_t)(RCC_CFGR_MCO1PRE|0x00000000U) /*!< MCO1 not divided */ +#define LL_RCC_MCO1_DIV_2 (uint32_t)(RCC_CFGR_MCO1PRE|(RCC_CFGR_MCO1PRE_2 >> 16U)) /*!< MCO1 divided by 2 */ +#define LL_RCC_MCO1_DIV_3 (uint32_t)(RCC_CFGR_MCO1PRE|((RCC_CFGR_MCO1PRE_2|RCC_CFGR_MCO1PRE_0) >> 16U)) /*!< MCO1 divided by 3 */ +#define LL_RCC_MCO1_DIV_4 (uint32_t)(RCC_CFGR_MCO1PRE|((RCC_CFGR_MCO1PRE_2|RCC_CFGR_MCO1PRE_1) >> 16U)) /*!< MCO1 divided by 4 */ +#define LL_RCC_MCO1_DIV_5 (uint32_t)(RCC_CFGR_MCO1PRE|(RCC_CFGR_MCO1PRE >> 16U)) /*!< MCO1 divided by 5 */ +#if defined(RCC_CFGR_MCO2PRE) +#define LL_RCC_MCO2_DIV_1 (uint32_t)(RCC_CFGR_MCO2PRE|0x00000000U) /*!< MCO2 not divided */ +#define LL_RCC_MCO2_DIV_2 (uint32_t)(RCC_CFGR_MCO2PRE|(RCC_CFGR_MCO2PRE_2 >> 16U)) /*!< MCO2 divided by 2 */ +#define LL_RCC_MCO2_DIV_3 (uint32_t)(RCC_CFGR_MCO2PRE|((RCC_CFGR_MCO2PRE_2|RCC_CFGR_MCO2PRE_0) >> 16U)) /*!< MCO2 divided by 3 */ +#define LL_RCC_MCO2_DIV_4 (uint32_t)(RCC_CFGR_MCO2PRE|((RCC_CFGR_MCO2PRE_2|RCC_CFGR_MCO2PRE_1) >> 16U)) /*!< MCO2 divided by 4 */ +#define LL_RCC_MCO2_DIV_5 (uint32_t)(RCC_CFGR_MCO2PRE|(RCC_CFGR_MCO2PRE >> 16U)) /*!< MCO2 divided by 5 */ +#endif /* RCC_CFGR_MCO2PRE */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_RTC_HSEDIV HSE prescaler for RTC clock + * @{ + */ +#define LL_RCC_RTC_NOCLOCK 0x00000000U /*!< HSE not divided */ +#define LL_RCC_RTC_HSE_DIV_2 RCC_CFGR_RTCPRE_1 /*!< HSE clock divided by 2 */ +#define LL_RCC_RTC_HSE_DIV_3 (RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 3 */ +#define LL_RCC_RTC_HSE_DIV_4 RCC_CFGR_RTCPRE_2 /*!< HSE clock divided by 4 */ +#define LL_RCC_RTC_HSE_DIV_5 (RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 5 */ +#define LL_RCC_RTC_HSE_DIV_6 (RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 6 */ +#define LL_RCC_RTC_HSE_DIV_7 (RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 7 */ +#define LL_RCC_RTC_HSE_DIV_8 RCC_CFGR_RTCPRE_3 /*!< HSE clock divided by 8 */ +#define LL_RCC_RTC_HSE_DIV_9 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 9 */ +#define LL_RCC_RTC_HSE_DIV_10 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 10 */ +#define LL_RCC_RTC_HSE_DIV_11 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 11 */ +#define LL_RCC_RTC_HSE_DIV_12 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2) /*!< HSE clock divided by 12 */ +#define LL_RCC_RTC_HSE_DIV_13 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 13 */ +#define LL_RCC_RTC_HSE_DIV_14 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 14 */ +#define LL_RCC_RTC_HSE_DIV_15 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 15 */ +#define LL_RCC_RTC_HSE_DIV_16 RCC_CFGR_RTCPRE_4 /*!< HSE clock divided by 16 */ +#define LL_RCC_RTC_HSE_DIV_17 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 17 */ +#define LL_RCC_RTC_HSE_DIV_18 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 18 */ +#define LL_RCC_RTC_HSE_DIV_19 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 19 */ +#define LL_RCC_RTC_HSE_DIV_20 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2) /*!< HSE clock divided by 20 */ +#define LL_RCC_RTC_HSE_DIV_21 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 21 */ +#define LL_RCC_RTC_HSE_DIV_22 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 22 */ +#define LL_RCC_RTC_HSE_DIV_23 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 23 */ +#define LL_RCC_RTC_HSE_DIV_24 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3) /*!< HSE clock divided by 24 */ +#define LL_RCC_RTC_HSE_DIV_25 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 25 */ +#define LL_RCC_RTC_HSE_DIV_26 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 26 */ +#define LL_RCC_RTC_HSE_DIV_27 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 27 */ +#define LL_RCC_RTC_HSE_DIV_28 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2) /*!< HSE clock divided by 28 */ +#define LL_RCC_RTC_HSE_DIV_29 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 29 */ +#define LL_RCC_RTC_HSE_DIV_30 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 30 */ +#define LL_RCC_RTC_HSE_DIV_31 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 31 */ +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup RCC_LL_EC_PERIPH_FREQUENCY Peripheral clock frequency + * @{ + */ +#define LL_RCC_PERIPH_FREQUENCY_NO 0x00000000U /*!< No clock enabled for the peripheral */ +#define LL_RCC_PERIPH_FREQUENCY_NA 0xFFFFFFFFU /*!< Frequency cannot be provided as external clock */ +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +#if defined(FMPI2C1) +/** @defgroup RCC_LL_EC_FMPI2C1_CLKSOURCE Peripheral FMPI2C clock source selection + * @{ + */ +#define LL_RCC_FMPI2C1_CLKSOURCE_PCLK1 0x00000000U /*!< PCLK1 clock used as FMPI2C1 clock source */ +#define LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK RCC_DCKCFGR2_FMPI2C1SEL_0 /*!< SYSCLK clock used as FMPI2C1 clock source */ +#define LL_RCC_FMPI2C1_CLKSOURCE_HSI RCC_DCKCFGR2_FMPI2C1SEL_1 /*!< HSI clock used as FMPI2C1 clock source */ +/** + * @} + */ +#endif /* FMPI2C1 */ + +#if defined(LPTIM1) +/** @defgroup RCC_LL_EC_LPTIM1_CLKSOURCE Peripheral LPTIM clock source selection + * @{ + */ +#define LL_RCC_LPTIM1_CLKSOURCE_PCLK1 0x00000000U /*!< PCLK1 clock used as LPTIM1 clock */ +#define LL_RCC_LPTIM1_CLKSOURCE_HSI RCC_DCKCFGR2_LPTIM1SEL_0 /*!< LSI oscillator clock used as LPTIM1 clock */ +#define LL_RCC_LPTIM1_CLKSOURCE_LSI RCC_DCKCFGR2_LPTIM1SEL_1 /*!< HSI oscillator clock used as LPTIM1 clock */ +#define LL_RCC_LPTIM1_CLKSOURCE_LSE (uint32_t)(RCC_DCKCFGR2_LPTIM1SEL_1 | RCC_DCKCFGR2_LPTIM1SEL_0) /*!< LSE oscillator clock used as LPTIM1 clock */ +/** + * @} + */ +#endif /* LPTIM1 */ + +#if defined(SAI1) +/** @defgroup RCC_LL_EC_SAIx_CLKSOURCE Peripheral SAI clock source selection + * @{ + */ +#if defined(RCC_DCKCFGR_SAI1SRC) +#define LL_RCC_SAI1_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI1SRC | 0x00000000U) /*!< PLLSAI clock used as SAI1 clock source */ +#define LL_RCC_SAI1_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1SRC | (RCC_DCKCFGR_SAI1SRC_0 >> 16)) /*!< PLLI2S clock used as SAI1 clock source */ +#define LL_RCC_SAI1_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI1SRC | (RCC_DCKCFGR_SAI1SRC_1 >> 16)) /*!< PLL clock used as SAI1 clock source */ +#define LL_RCC_SAI1_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1SRC | (RCC_DCKCFGR_SAI1SRC >> 16)) /*!< External pin clock used as SAI1 clock source */ +#endif /* RCC_DCKCFGR_SAI1SRC */ +#if defined(RCC_DCKCFGR_SAI2SRC) +#define LL_RCC_SAI2_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI2SRC | 0x00000000U) /*!< PLLSAI clock used as SAI2 clock source */ +#define LL_RCC_SAI2_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI2SRC | (RCC_DCKCFGR_SAI2SRC_0 >> 16)) /*!< PLLI2S clock used as SAI2 clock source */ +#define LL_RCC_SAI2_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI2SRC | (RCC_DCKCFGR_SAI2SRC_1 >> 16)) /*!< PLL clock used as SAI2 clock source */ +#define LL_RCC_SAI2_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_SAI2SRC | (RCC_DCKCFGR_SAI2SRC >> 16)) /*!< PLL Main clock used as SAI2 clock source */ +#endif /* RCC_DCKCFGR_SAI2SRC */ +#if defined(RCC_DCKCFGR_SAI1ASRC) +#if defined(RCC_SAI1A_PLLSOURCE_SUPPORT) +#define LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1ASRC | 0x00000000U) /*!< PLLI2S clock used as SAI1 block A clock source */ +#define LL_RCC_SAI1_A_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_0 >> 16)) /*!< External pin used as SAI1 block A clock source */ +#define LL_RCC_SAI1_A_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_1 >> 16)) /*!< PLL clock used as SAI1 block A clock source */ +#define LL_RCC_SAI1_A_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC >> 16)) /*!< PLL Main clock used as SAI1 block A clock source */ +#else +#define LL_RCC_SAI1_A_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI1ASRC | 0x00000000U) /*!< PLLSAI clock used as SAI1 block A clock source */ +#define LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_0 >> 16)) /*!< PLLI2S clock used as SAI1 block A clock source */ +#define LL_RCC_SAI1_A_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_1 >> 16)) /*!< External pin clock used as SAI1 block A clock source */ +#endif /* RCC_SAI1A_PLLSOURCE_SUPPORT */ +#endif /* RCC_DCKCFGR_SAI1ASRC */ +#if defined(RCC_DCKCFGR_SAI1BSRC) +#if defined(RCC_SAI1B_PLLSOURCE_SUPPORT) +#define LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1BSRC | 0x00000000U) /*!< PLLI2S clock used as SAI1 block B clock source */ +#define LL_RCC_SAI1_B_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_0 >> 16)) /*!< External pin used as SAI1 block B clock source */ +#define LL_RCC_SAI1_B_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_1 >> 16)) /*!< PLL clock used as SAI1 block B clock source */ +#define LL_RCC_SAI1_B_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC >> 16)) /*!< PLL Main clock used as SAI1 block B clock source */ +#else +#define LL_RCC_SAI1_B_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI1BSRC | 0x00000000U) /*!< PLLSAI clock used as SAI1 block B clock source */ +#define LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_0 >> 16)) /*!< PLLI2S clock used as SAI1 block B clock source */ +#define LL_RCC_SAI1_B_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_1 >> 16)) /*!< External pin clock used as SAI1 block B clock source */ +#endif /* RCC_SAI1B_PLLSOURCE_SUPPORT */ +#endif /* RCC_DCKCFGR_SAI1BSRC */ +/** + * @} + */ +#endif /* SAI1 */ + +#if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL) +/** @defgroup RCC_LL_EC_SDIOx_CLKSOURCE Peripheral SDIO clock source selection + * @{ + */ +#define LL_RCC_SDIO_CLKSOURCE_PLL48CLK 0x00000000U /*!< PLL 48M domain clock used as SDIO clock */ +#if defined(RCC_DCKCFGR_SDIOSEL) +#define LL_RCC_SDIO_CLKSOURCE_SYSCLK RCC_DCKCFGR_SDIOSEL /*!< System clock clock used as SDIO clock */ +#else +#define LL_RCC_SDIO_CLKSOURCE_SYSCLK RCC_DCKCFGR2_SDIOSEL /*!< System clock clock used as SDIO clock */ +#endif /* RCC_DCKCFGR_SDIOSEL */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */ + +#if defined(DSI) +/** @defgroup RCC_LL_EC_DSI_CLKSOURCE Peripheral DSI clock source selection + * @{ + */ +#define LL_RCC_DSI_CLKSOURCE_PHY 0x00000000U /*!< DSI-PHY clock used as DSI byte lane clock source */ +#define LL_RCC_DSI_CLKSOURCE_PLL RCC_DCKCFGR_DSISEL /*!< PLL clock used as DSI byte lane clock source */ +/** + * @} + */ +#endif /* DSI */ + +#if defined(CEC) +/** @defgroup RCC_LL_EC_CEC_CLKSOURCE Peripheral CEC clock source selection + * @{ + */ +#define LL_RCC_CEC_CLKSOURCE_HSI_DIV488 0x00000000U /*!< HSI oscillator clock divided by 488 used as CEC clock */ +#define LL_RCC_CEC_CLKSOURCE_LSE RCC_DCKCFGR2_CECSEL /*!< LSE oscillator clock used as CEC clock */ +/** + * @} + */ +#endif /* CEC */ + +/** @defgroup RCC_LL_EC_I2S1_CLKSOURCE Peripheral I2S clock source selection + * @{ + */ +#if defined(RCC_CFGR_I2SSRC) +#define LL_RCC_I2S1_CLKSOURCE_PLLI2S 0x00000000U /*!< I2S oscillator clock used as I2S1 clock */ +#define LL_RCC_I2S1_CLKSOURCE_PIN RCC_CFGR_I2SSRC /*!< External pin clock used as I2S1 clock */ +#endif /* RCC_CFGR_I2SSRC */ +#if defined(RCC_DCKCFGR_I2SSRC) +#define LL_RCC_I2S1_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_I2SSRC | 0x00000000U) /*!< PLL clock used as I2S1 clock source */ +#define LL_RCC_I2S1_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_I2SSRC | (RCC_DCKCFGR_I2SSRC_0 >> 16)) /*!< External pin used as I2S1 clock source */ +#define LL_RCC_I2S1_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_I2SSRC | (RCC_DCKCFGR_I2SSRC_1 >> 16)) /*!< PLL Main clock used as I2S1 clock source */ +#endif /* RCC_DCKCFGR_I2SSRC */ +#if defined(RCC_DCKCFGR_I2S1SRC) +#define LL_RCC_I2S1_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_I2S1SRC | 0x00000000U) /*!< PLLI2S clock used as I2S1 clock source */ +#define LL_RCC_I2S1_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_I2S1SRC | (RCC_DCKCFGR_I2S1SRC_0 >> 16)) /*!< External pin used as I2S1 clock source */ +#define LL_RCC_I2S1_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_I2S1SRC | (RCC_DCKCFGR_I2S1SRC_1 >> 16)) /*!< PLL clock used as I2S1 clock source */ +#define LL_RCC_I2S1_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_I2S1SRC | (RCC_DCKCFGR_I2S1SRC >> 16)) /*!< PLL Main clock used as I2S1 clock source */ +#endif /* RCC_DCKCFGR_I2S1SRC */ +#if defined(RCC_DCKCFGR_I2S2SRC) +#define LL_RCC_I2S2_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_I2S2SRC | 0x00000000U) /*!< PLLI2S clock used as I2S2 clock source */ +#define LL_RCC_I2S2_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_I2S2SRC | (RCC_DCKCFGR_I2S2SRC_0 >> 16)) /*!< External pin used as I2S2 clock source */ +#define LL_RCC_I2S2_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_I2S2SRC | (RCC_DCKCFGR_I2S2SRC_1 >> 16)) /*!< PLL clock used as I2S2 clock source */ +#define LL_RCC_I2S2_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_I2S2SRC | (RCC_DCKCFGR_I2S2SRC >> 16)) /*!< PLL Main clock used as I2S2 clock source */ +#endif /* RCC_DCKCFGR_I2S2SRC */ +/** + * @} + */ + +#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) +/** @defgroup RCC_LL_EC_CK48M_CLKSOURCE Peripheral 48Mhz domain clock source selection + * @{ + */ +#if defined(RCC_DCKCFGR_CK48MSEL) +#define LL_RCC_CK48M_CLKSOURCE_PLL 0x00000000U /*!< PLL oscillator clock used as 48Mhz domain clock */ +#define LL_RCC_CK48M_CLKSOURCE_PLLSAI RCC_DCKCFGR_CK48MSEL /*!< PLLSAI oscillator clock used as 48Mhz domain clock */ +#endif /* RCC_DCKCFGR_CK48MSEL */ +#if defined(RCC_DCKCFGR2_CK48MSEL) +#define LL_RCC_CK48M_CLKSOURCE_PLL 0x00000000U /*!< PLL oscillator clock used as 48Mhz domain clock */ +#if defined(RCC_PLLSAI_SUPPORT) +#define LL_RCC_CK48M_CLKSOURCE_PLLSAI RCC_DCKCFGR2_CK48MSEL /*!< PLLSAI oscillator clock used as 48Mhz domain clock */ +#endif /* RCC_PLLSAI_SUPPORT */ +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) +#define LL_RCC_CK48M_CLKSOURCE_PLLI2S RCC_DCKCFGR2_CK48MSEL /*!< PLLI2S oscillator clock used as 48Mhz domain clock */ +#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ +#endif /* RCC_DCKCFGR2_CK48MSEL */ +/** + * @} + */ + +#if defined(RNG) +/** @defgroup RCC_LL_EC_RNG_CLKSOURCE Peripheral RNG clock source selection + * @{ + */ +#define LL_RCC_RNG_CLKSOURCE_PLL LL_RCC_CK48M_CLKSOURCE_PLL /*!< PLL clock used as RNG clock source */ +#if defined(RCC_PLLSAI_SUPPORT) +#define LL_RCC_RNG_CLKSOURCE_PLLSAI LL_RCC_CK48M_CLKSOURCE_PLLSAI /*!< PLLSAI clock used as RNG clock source */ +#endif /* RCC_PLLSAI_SUPPORT */ +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) +#define LL_RCC_RNG_CLKSOURCE_PLLI2S LL_RCC_CK48M_CLKSOURCE_PLLI2S /*!< PLLI2S clock used as RNG clock source */ +#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ +/** + * @} + */ +#endif /* RNG */ + +#if defined(USB_OTG_FS) || defined(USB_OTG_HS) +/** @defgroup RCC_LL_EC_USB_CLKSOURCE Peripheral USB clock source selection + * @{ + */ +#define LL_RCC_USB_CLKSOURCE_PLL LL_RCC_CK48M_CLKSOURCE_PLL /*!< PLL clock used as USB clock source */ +#if defined(RCC_PLLSAI_SUPPORT) +#define LL_RCC_USB_CLKSOURCE_PLLSAI LL_RCC_CK48M_CLKSOURCE_PLLSAI /*!< PLLSAI clock used as USB clock source */ +#endif /* RCC_PLLSAI_SUPPORT */ +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) +#define LL_RCC_USB_CLKSOURCE_PLLI2S LL_RCC_CK48M_CLKSOURCE_PLLI2S /*!< PLLI2S clock used as USB clock source */ +#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ +/** + * @} + */ +#endif /* USB_OTG_FS || USB_OTG_HS */ + +#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ + +#if defined(DFSDM1_Channel0) || defined(DFSDM2_Channel0) +/** @defgroup RCC_LL_EC_DFSDM1_AUDIO_CLKSOURCE Peripheral DFSDM Audio clock source selection + * @{ + */ +#define LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1 (uint32_t)(RCC_DCKCFGR_CKDFSDM1ASEL | 0x00000000U) /*!< I2S1 clock used as DFSDM1 Audio clock source */ +#define LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2 (uint32_t)(RCC_DCKCFGR_CKDFSDM1ASEL | (RCC_DCKCFGR_CKDFSDM1ASEL << 16)) /*!< I2S2 clock used as DFSDM1 Audio clock source */ +#if defined(DFSDM2_Channel0) +#define LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1 (uint32_t)(RCC_DCKCFGR_CKDFSDM2ASEL | 0x00000000U) /*!< I2S1 clock used as DFSDM2 Audio clock source */ +#define LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2 (uint32_t)(RCC_DCKCFGR_CKDFSDM2ASEL | (RCC_DCKCFGR_CKDFSDM2ASEL << 16)) /*!< I2S2 clock used as DFSDM2 Audio clock source */ +#endif /* DFSDM2_Channel0 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_DFSDM1_CLKSOURCE Peripheral DFSDM clock source selection + * @{ + */ +#define LL_RCC_DFSDM1_CLKSOURCE_PCLK2 0x00000000U /*!< PCLK2 clock used as DFSDM1 clock */ +#define LL_RCC_DFSDM1_CLKSOURCE_SYSCLK RCC_DCKCFGR_CKDFSDM1SEL /*!< System clock used as DFSDM1 clock */ +#if defined(DFSDM2_Channel0) +#define LL_RCC_DFSDM2_CLKSOURCE_PCLK2 0x00000000U /*!< PCLK2 clock used as DFSDM2 clock */ +#define LL_RCC_DFSDM2_CLKSOURCE_SYSCLK RCC_DCKCFGR_CKDFSDM1SEL /*!< System clock used as DFSDM2 clock */ +#endif /* DFSDM2_Channel0 */ +/** + * @} + */ +#endif /* DFSDM1_Channel0 || DFSDM2_Channel0 */ + +#if defined(FMPI2C1) +/** @defgroup RCC_LL_EC_FMPI2C1 Peripheral FMPI2C get clock source + * @{ + */ +#define LL_RCC_FMPI2C1_CLKSOURCE RCC_DCKCFGR2_FMPI2C1SEL /*!< FMPI2C1 Clock source selection */ +/** + * @} + */ +#endif /* FMPI2C1 */ + +#if defined(SPDIFRX) +/** @defgroup RCC_LL_EC_SPDIFRX_CLKSOURCE Peripheral SPDIFRX clock source selection + * @{ + */ +#define LL_RCC_SPDIFRX1_CLKSOURCE_PLL 0x00000000U /*!< PLL clock used as SPDIFRX clock source */ +#define LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S RCC_DCKCFGR2_SPDIFRXSEL /*!< PLLI2S clock used as SPDIFRX clock source */ +/** + * @} + */ +#endif /* SPDIFRX */ + +#if defined(LPTIM1) +/** @defgroup RCC_LL_EC_LPTIM1 Peripheral LPTIM get clock source + * @{ + */ +#define LL_RCC_LPTIM1_CLKSOURCE RCC_DCKCFGR2_LPTIM1SEL /*!< LPTIM1 Clock source selection */ +/** + * @} + */ +#endif /* LPTIM1 */ + +#if defined(SAI1) +/** @defgroup RCC_LL_EC_SAIx Peripheral SAI get clock source + * @{ + */ +#if defined(RCC_DCKCFGR_SAI1ASRC) +#define LL_RCC_SAI1_A_CLKSOURCE RCC_DCKCFGR_SAI1ASRC /*!< SAI1 block A Clock source selection */ +#endif /* RCC_DCKCFGR_SAI1ASRC */ +#if defined(RCC_DCKCFGR_SAI1BSRC) +#define LL_RCC_SAI1_B_CLKSOURCE RCC_DCKCFGR_SAI1BSRC /*!< SAI1 block B Clock source selection */ +#endif /* RCC_DCKCFGR_SAI1BSRC */ +#if defined(RCC_DCKCFGR_SAI1SRC) +#define LL_RCC_SAI1_CLKSOURCE RCC_DCKCFGR_SAI1SRC /*!< SAI1 Clock source selection */ +#endif /* RCC_DCKCFGR_SAI1SRC */ +#if defined(RCC_DCKCFGR_SAI2SRC) +#define LL_RCC_SAI2_CLKSOURCE RCC_DCKCFGR_SAI2SRC /*!< SAI2 Clock source selection */ +#endif /* RCC_DCKCFGR_SAI2SRC */ +/** + * @} + */ +#endif /* SAI1 */ + +#if defined(SDIO) +/** @defgroup RCC_LL_EC_SDIOx Peripheral SDIO get clock source + * @{ + */ +#if defined(RCC_DCKCFGR_SDIOSEL) +#define LL_RCC_SDIO_CLKSOURCE RCC_DCKCFGR_SDIOSEL /*!< SDIO Clock source selection */ +#elif defined(RCC_DCKCFGR2_SDIOSEL) +#define LL_RCC_SDIO_CLKSOURCE RCC_DCKCFGR2_SDIOSEL /*!< SDIO Clock source selection */ +#else +#define LL_RCC_SDIO_CLKSOURCE RCC_PLLCFGR_PLLQ /*!< SDIO Clock source selection */ +#endif /* RCC_DCKCFGR_SDIOSEL */ +/** + * @} + */ +#endif /* SDIO */ + +#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) +/** @defgroup RCC_LL_EC_CK48M Peripheral CK48M get clock source + * @{ + */ +#if defined(RCC_DCKCFGR_CK48MSEL) +#define LL_RCC_CK48M_CLKSOURCE RCC_DCKCFGR_CK48MSEL /*!< CK48M Domain clock source selection */ +#endif /* RCC_DCKCFGR_CK48MSEL */ +#if defined(RCC_DCKCFGR2_CK48MSEL) +#define LL_RCC_CK48M_CLKSOURCE RCC_DCKCFGR2_CK48MSEL /*!< CK48M Domain clock source selection */ +#endif /* RCC_DCKCFGR_CK48MSEL */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ + +#if defined(RNG) +/** @defgroup RCC_LL_EC_RNG Peripheral RNG get clock source + * @{ + */ +#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) +#define LL_RCC_RNG_CLKSOURCE LL_RCC_CK48M_CLKSOURCE /*!< RNG Clock source selection */ +#else +#define LL_RCC_RNG_CLKSOURCE RCC_PLLCFGR_PLLQ /*!< RNG Clock source selection */ +#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ +/** + * @} + */ +#endif /* RNG */ + +#if defined(USB_OTG_FS) || defined(USB_OTG_HS) +/** @defgroup RCC_LL_EC_USB Peripheral USB get clock source + * @{ + */ +#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) +#define LL_RCC_USB_CLKSOURCE LL_RCC_CK48M_CLKSOURCE /*!< USB Clock source selection */ +#else +#define LL_RCC_USB_CLKSOURCE RCC_PLLCFGR_PLLQ /*!< USB Clock source selection */ +#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ +/** + * @} + */ +#endif /* USB_OTG_FS || USB_OTG_HS */ + +#if defined(CEC) +/** @defgroup RCC_LL_EC_CEC Peripheral CEC get clock source + * @{ + */ +#define LL_RCC_CEC_CLKSOURCE RCC_DCKCFGR2_CECSEL /*!< CEC Clock source selection */ +/** + * @} + */ +#endif /* CEC */ + +/** @defgroup RCC_LL_EC_I2S1 Peripheral I2S get clock source + * @{ + */ +#if defined(RCC_CFGR_I2SSRC) +#define LL_RCC_I2S1_CLKSOURCE RCC_CFGR_I2SSRC /*!< I2S1 Clock source selection */ +#endif /* RCC_CFGR_I2SSRC */ +#if defined(RCC_DCKCFGR_I2SSRC) +#define LL_RCC_I2S1_CLKSOURCE RCC_DCKCFGR_I2SSRC /*!< I2S1 Clock source selection */ +#endif /* RCC_DCKCFGR_I2SSRC */ +#if defined(RCC_DCKCFGR_I2S1SRC) +#define LL_RCC_I2S1_CLKSOURCE RCC_DCKCFGR_I2S1SRC /*!< I2S1 Clock source selection */ +#endif /* RCC_DCKCFGR_I2S1SRC */ +#if defined(RCC_DCKCFGR_I2S2SRC) +#define LL_RCC_I2S2_CLKSOURCE RCC_DCKCFGR_I2S2SRC /*!< I2S2 Clock source selection */ +#endif /* RCC_DCKCFGR_I2S2SRC */ +/** + * @} + */ + +#if defined(DFSDM1_Channel0) || defined(DFSDM2_Channel0) +/** @defgroup RCC_LL_EC_DFSDM_AUDIO Peripheral DFSDM Audio get clock source + * @{ + */ +#define LL_RCC_DFSDM1_AUDIO_CLKSOURCE RCC_DCKCFGR_CKDFSDM1ASEL /*!< DFSDM1 Audio Clock source selection */ +#if defined(DFSDM2_Channel0) +#define LL_RCC_DFSDM2_AUDIO_CLKSOURCE RCC_DCKCFGR_CKDFSDM2ASEL /*!< DFSDM2 Audio Clock source selection */ +#endif /* DFSDM2_Channel0 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_DFSDM Peripheral DFSDM get clock source + * @{ + */ +#define LL_RCC_DFSDM1_CLKSOURCE RCC_DCKCFGR_CKDFSDM1SEL /*!< DFSDM1 Clock source selection */ +#if defined(DFSDM2_Channel0) +#define LL_RCC_DFSDM2_CLKSOURCE RCC_DCKCFGR_CKDFSDM1SEL /*!< DFSDM2 Clock source selection */ +#endif /* DFSDM2_Channel0 */ +/** + * @} + */ +#endif /* DFSDM1_Channel0 || DFSDM2_Channel0 */ + +#if defined(SPDIFRX) +/** @defgroup RCC_LL_EC_SPDIFRX Peripheral SPDIFRX get clock source + * @{ + */ +#define LL_RCC_SPDIFRX1_CLKSOURCE RCC_DCKCFGR2_SPDIFRXSEL /*!< SPDIFRX Clock source selection */ +/** + * @} + */ +#endif /* SPDIFRX */ + +#if defined(DSI) +/** @defgroup RCC_LL_EC_DSI Peripheral DSI get clock source + * @{ + */ +#define LL_RCC_DSI_CLKSOURCE RCC_DCKCFGR_DSISEL /*!< DSI Clock source selection */ +/** + * @} + */ +#endif /* DSI */ + +#if defined(LTDC) +/** @defgroup RCC_LL_EC_LTDC Peripheral LTDC get clock source + * @{ + */ +#define LL_RCC_LTDC_CLKSOURCE RCC_DCKCFGR_PLLSAIDIVR /*!< LTDC Clock source selection */ +/** + * @} + */ +#endif /* LTDC */ + + +/** @defgroup RCC_LL_EC_RTC_CLKSOURCE RTC clock source selection + * @{ + */ +#define LL_RCC_RTC_CLKSOURCE_NONE 0x00000000U /*!< No clock used as RTC clock */ +#define LL_RCC_RTC_CLKSOURCE_LSE RCC_BDCR_RTCSEL_0 /*!< LSE oscillator clock used as RTC clock */ +#define LL_RCC_RTC_CLKSOURCE_LSI RCC_BDCR_RTCSEL_1 /*!< LSI oscillator clock used as RTC clock */ +#define LL_RCC_RTC_CLKSOURCE_HSE RCC_BDCR_RTCSEL /*!< HSE oscillator clock divided by HSE prescaler used as RTC clock */ +/** + * @} + */ + +#if defined(RCC_DCKCFGR_TIMPRE) +/** @defgroup RCC_LL_EC_TIM_CLKPRESCALER Timers clocks prescalers selection + * @{ + */ +#define LL_RCC_TIM_PRESCALER_TWICE 0x00000000U /*!< Timers clock to twice PCLK */ +#define LL_RCC_TIM_PRESCALER_FOUR_TIMES RCC_DCKCFGR_TIMPRE /*!< Timers clock to four time PCLK */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_TIMPRE */ + +/** @defgroup RCC_LL_EC_PLLSOURCE PLL, PLLI2S and PLLSAI entry clock source + * @{ + */ +#define LL_RCC_PLLSOURCE_HSI RCC_PLLCFGR_PLLSRC_HSI /*!< HSI16 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE RCC_PLLCFGR_PLLSRC_HSE /*!< HSE clock selected as PLL entry clock source */ +#if defined(RCC_PLLI2SCFGR_PLLI2SSRC) +#define LL_RCC_PLLI2SSOURCE_PIN (RCC_PLLI2SCFGR_PLLI2SSRC | 0x80U) /*!< I2S External pin input clock selected as PLLI2S entry clock source */ +#endif /* RCC_PLLI2SCFGR_PLLI2SSRC */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_PLLM_DIV PLL, PLLI2S and PLLSAI division factor + * @{ + */ +#define LL_RCC_PLLM_DIV_2 (RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 2 */ +#define LL_RCC_PLLM_DIV_3 (RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 3 */ +#define LL_RCC_PLLM_DIV_4 (RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 4 */ +#define LL_RCC_PLLM_DIV_5 (RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 5 */ +#define LL_RCC_PLLM_DIV_6 (RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 6 */ +#define LL_RCC_PLLM_DIV_7 (RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 7 */ +#define LL_RCC_PLLM_DIV_8 (RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 8 */ +#define LL_RCC_PLLM_DIV_9 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 9 */ +#define LL_RCC_PLLM_DIV_10 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 10 */ +#define LL_RCC_PLLM_DIV_11 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 11 */ +#define LL_RCC_PLLM_DIV_12 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 12 */ +#define LL_RCC_PLLM_DIV_13 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 13 */ +#define LL_RCC_PLLM_DIV_14 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 14 */ +#define LL_RCC_PLLM_DIV_15 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 15 */ +#define LL_RCC_PLLM_DIV_16 (RCC_PLLCFGR_PLLM_4) /*!< PLL, PLLI2S and PLLSAI division factor by 16 */ +#define LL_RCC_PLLM_DIV_17 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 17 */ +#define LL_RCC_PLLM_DIV_18 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 18 */ +#define LL_RCC_PLLM_DIV_19 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 19 */ +#define LL_RCC_PLLM_DIV_20 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 20 */ +#define LL_RCC_PLLM_DIV_21 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 21 */ +#define LL_RCC_PLLM_DIV_22 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 22 */ +#define LL_RCC_PLLM_DIV_23 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 23 */ +#define LL_RCC_PLLM_DIV_24 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 24 */ +#define LL_RCC_PLLM_DIV_25 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 25 */ +#define LL_RCC_PLLM_DIV_26 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 26 */ +#define LL_RCC_PLLM_DIV_27 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 27 */ +#define LL_RCC_PLLM_DIV_28 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 28 */ +#define LL_RCC_PLLM_DIV_29 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 29 */ +#define LL_RCC_PLLM_DIV_30 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 30 */ +#define LL_RCC_PLLM_DIV_31 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 31 */ +#define LL_RCC_PLLM_DIV_32 (RCC_PLLCFGR_PLLM_5) /*!< PLL, PLLI2S and PLLSAI division factor by 32 */ +#define LL_RCC_PLLM_DIV_33 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 33 */ +#define LL_RCC_PLLM_DIV_34 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 34 */ +#define LL_RCC_PLLM_DIV_35 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 35 */ +#define LL_RCC_PLLM_DIV_36 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 36 */ +#define LL_RCC_PLLM_DIV_37 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 37 */ +#define LL_RCC_PLLM_DIV_38 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 38 */ +#define LL_RCC_PLLM_DIV_39 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 39 */ +#define LL_RCC_PLLM_DIV_40 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 40 */ +#define LL_RCC_PLLM_DIV_41 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 41 */ +#define LL_RCC_PLLM_DIV_42 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 42 */ +#define LL_RCC_PLLM_DIV_43 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 43 */ +#define LL_RCC_PLLM_DIV_44 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 44 */ +#define LL_RCC_PLLM_DIV_45 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 45 */ +#define LL_RCC_PLLM_DIV_46 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 46 */ +#define LL_RCC_PLLM_DIV_47 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 47 */ +#define LL_RCC_PLLM_DIV_48 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4) /*!< PLL, PLLI2S and PLLSAI division factor by 48 */ +#define LL_RCC_PLLM_DIV_49 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 49 */ +#define LL_RCC_PLLM_DIV_50 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 50 */ +#define LL_RCC_PLLM_DIV_51 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 51 */ +#define LL_RCC_PLLM_DIV_52 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 52 */ +#define LL_RCC_PLLM_DIV_53 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 53 */ +#define LL_RCC_PLLM_DIV_54 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 54 */ +#define LL_RCC_PLLM_DIV_55 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 55 */ +#define LL_RCC_PLLM_DIV_56 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 56 */ +#define LL_RCC_PLLM_DIV_57 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 57 */ +#define LL_RCC_PLLM_DIV_58 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 58 */ +#define LL_RCC_PLLM_DIV_59 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 59 */ +#define LL_RCC_PLLM_DIV_60 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 60 */ +#define LL_RCC_PLLM_DIV_61 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 61 */ +#define LL_RCC_PLLM_DIV_62 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 62 */ +#define LL_RCC_PLLM_DIV_63 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 63 */ +/** + * @} + */ + +#if defined(RCC_PLLCFGR_PLLR) +/** @defgroup RCC_LL_EC_PLLR_DIV PLL division factor (PLLR) + * @{ + */ +#define LL_RCC_PLLR_DIV_2 (RCC_PLLCFGR_PLLR_1) /*!< Main PLL division factor for PLLCLK (system clock) by 2 */ +#define LL_RCC_PLLR_DIV_3 (RCC_PLLCFGR_PLLR_1|RCC_PLLCFGR_PLLR_0) /*!< Main PLL division factor for PLLCLK (system clock) by 3 */ +#define LL_RCC_PLLR_DIV_4 (RCC_PLLCFGR_PLLR_2) /*!< Main PLL division factor for PLLCLK (system clock) by 4 */ +#define LL_RCC_PLLR_DIV_5 (RCC_PLLCFGR_PLLR_2|RCC_PLLCFGR_PLLR_0) /*!< Main PLL division factor for PLLCLK (system clock) by 5 */ +#define LL_RCC_PLLR_DIV_6 (RCC_PLLCFGR_PLLR_2|RCC_PLLCFGR_PLLR_1) /*!< Main PLL division factor for PLLCLK (system clock) by 6 */ +#define LL_RCC_PLLR_DIV_7 (RCC_PLLCFGR_PLLR) /*!< Main PLL division factor for PLLCLK (system clock) by 7 */ +/** + * @} + */ +#endif /* RCC_PLLCFGR_PLLR */ + +#if defined(RCC_DCKCFGR_PLLDIVR) +/** @defgroup RCC_LL_EC_PLLDIVR PLLDIVR division factor (PLLDIVR) + * @{ + */ +#define LL_RCC_PLLDIVR_DIV_1 (RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 1 */ +#define LL_RCC_PLLDIVR_DIV_2 (RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 2 */ +#define LL_RCC_PLLDIVR_DIV_3 (RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 3 */ +#define LL_RCC_PLLDIVR_DIV_4 (RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 4 */ +#define LL_RCC_PLLDIVR_DIV_5 (RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 5 */ +#define LL_RCC_PLLDIVR_DIV_6 (RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 6 */ +#define LL_RCC_PLLDIVR_DIV_7 (RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 7 */ +#define LL_RCC_PLLDIVR_DIV_8 (RCC_DCKCFGR_PLLDIVR_3) /*!< PLL division factor for PLLDIVR output by 8 */ +#define LL_RCC_PLLDIVR_DIV_9 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 9 */ +#define LL_RCC_PLLDIVR_DIV_10 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 10 */ +#define LL_RCC_PLLDIVR_DIV_11 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 11 */ +#define LL_RCC_PLLDIVR_DIV_12 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 12 */ +#define LL_RCC_PLLDIVR_DIV_13 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 13 */ +#define LL_RCC_PLLDIVR_DIV_14 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 14 */ +#define LL_RCC_PLLDIVR_DIV_15 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 15 */ +#define LL_RCC_PLLDIVR_DIV_16 (RCC_DCKCFGR_PLLDIVR_4) /*!< PLL division factor for PLLDIVR output by 16 */ +#define LL_RCC_PLLDIVR_DIV_17 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 17 */ +#define LL_RCC_PLLDIVR_DIV_18 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 18 */ +#define LL_RCC_PLLDIVR_DIV_19 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 19 */ +#define LL_RCC_PLLDIVR_DIV_20 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 20 */ +#define LL_RCC_PLLDIVR_DIV_21 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 21 */ +#define LL_RCC_PLLDIVR_DIV_22 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 22 */ +#define LL_RCC_PLLDIVR_DIV_23 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 23 */ +#define LL_RCC_PLLDIVR_DIV_24 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3) /*!< PLL division factor for PLLDIVR output by 24 */ +#define LL_RCC_PLLDIVR_DIV_25 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 25 */ +#define LL_RCC_PLLDIVR_DIV_26 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 26 */ +#define LL_RCC_PLLDIVR_DIV_27 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 27 */ +#define LL_RCC_PLLDIVR_DIV_28 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 28 */ +#define LL_RCC_PLLDIVR_DIV_29 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 29 */ +#define LL_RCC_PLLDIVR_DIV_30 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 30 */ +#define LL_RCC_PLLDIVR_DIV_31 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 31 */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_PLLDIVR */ + +/** @defgroup RCC_LL_EC_PLLP_DIV PLL division factor (PLLP) + * @{ + */ +#define LL_RCC_PLLP_DIV_2 0x00000000U /*!< Main PLL division factor for PLLP output by 2 */ +#define LL_RCC_PLLP_DIV_4 RCC_PLLCFGR_PLLP_0 /*!< Main PLL division factor for PLLP output by 4 */ +#define LL_RCC_PLLP_DIV_6 RCC_PLLCFGR_PLLP_1 /*!< Main PLL division factor for PLLP output by 6 */ +#define LL_RCC_PLLP_DIV_8 (RCC_PLLCFGR_PLLP_1 | RCC_PLLCFGR_PLLP_0) /*!< Main PLL division factor for PLLP output by 8 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_PLLQ_DIV PLL division factor (PLLQ) + * @{ + */ +#define LL_RCC_PLLQ_DIV_2 RCC_PLLCFGR_PLLQ_1 /*!< Main PLL division factor for PLLQ output by 2 */ +#define LL_RCC_PLLQ_DIV_3 (RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 3 */ +#define LL_RCC_PLLQ_DIV_4 RCC_PLLCFGR_PLLQ_2 /*!< Main PLL division factor for PLLQ output by 4 */ +#define LL_RCC_PLLQ_DIV_5 (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 5 */ +#define LL_RCC_PLLQ_DIV_6 (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1) /*!< Main PLL division factor for PLLQ output by 6 */ +#define LL_RCC_PLLQ_DIV_7 (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 7 */ +#define LL_RCC_PLLQ_DIV_8 RCC_PLLCFGR_PLLQ_3 /*!< Main PLL division factor for PLLQ output by 8 */ +#define LL_RCC_PLLQ_DIV_9 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 9 */ +#define LL_RCC_PLLQ_DIV_10 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_1) /*!< Main PLL division factor for PLLQ output by 10 */ +#define LL_RCC_PLLQ_DIV_11 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 11 */ +#define LL_RCC_PLLQ_DIV_12 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2) /*!< Main PLL division factor for PLLQ output by 12 */ +#define LL_RCC_PLLQ_DIV_13 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 13 */ +#define LL_RCC_PLLQ_DIV_14 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1) /*!< Main PLL division factor for PLLQ output by 14 */ +#define LL_RCC_PLLQ_DIV_15 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 15 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_PLL_SPRE_SEL PLL Spread Spectrum Selection + * @{ + */ +#define LL_RCC_SPREAD_SELECT_CENTER 0x00000000U /*!< PLL center spread spectrum selection */ +#define LL_RCC_SPREAD_SELECT_DOWN RCC_SSCGR_SPREADSEL /*!< PLL down spread spectrum selection */ +/** + * @} + */ + +#if defined(RCC_PLLI2S_SUPPORT) +/** @defgroup RCC_LL_EC_PLLI2SM PLLI2SM division factor (PLLI2SM) + * @{ + */ +#if defined(RCC_PLLI2SCFGR_PLLI2SM) +#define LL_RCC_PLLI2SM_DIV_2 (RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 2 */ +#define LL_RCC_PLLI2SM_DIV_3 (RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 3 */ +#define LL_RCC_PLLI2SM_DIV_4 (RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 4 */ +#define LL_RCC_PLLI2SM_DIV_5 (RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 5 */ +#define LL_RCC_PLLI2SM_DIV_6 (RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 6 */ +#define LL_RCC_PLLI2SM_DIV_7 (RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 7 */ +#define LL_RCC_PLLI2SM_DIV_8 (RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 8 */ +#define LL_RCC_PLLI2SM_DIV_9 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 9 */ +#define LL_RCC_PLLI2SM_DIV_10 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 10 */ +#define LL_RCC_PLLI2SM_DIV_11 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 11 */ +#define LL_RCC_PLLI2SM_DIV_12 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 12 */ +#define LL_RCC_PLLI2SM_DIV_13 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 13 */ +#define LL_RCC_PLLI2SM_DIV_14 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 14 */ +#define LL_RCC_PLLI2SM_DIV_15 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 15 */ +#define LL_RCC_PLLI2SM_DIV_16 (RCC_PLLI2SCFGR_PLLI2SM_4) /*!< PLLI2S division factor for PLLI2SM output by 16 */ +#define LL_RCC_PLLI2SM_DIV_17 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 17 */ +#define LL_RCC_PLLI2SM_DIV_18 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 18 */ +#define LL_RCC_PLLI2SM_DIV_19 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 19 */ +#define LL_RCC_PLLI2SM_DIV_20 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 20 */ +#define LL_RCC_PLLI2SM_DIV_21 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 21 */ +#define LL_RCC_PLLI2SM_DIV_22 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 22 */ +#define LL_RCC_PLLI2SM_DIV_23 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 23 */ +#define LL_RCC_PLLI2SM_DIV_24 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 24 */ +#define LL_RCC_PLLI2SM_DIV_25 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 25 */ +#define LL_RCC_PLLI2SM_DIV_26 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 26 */ +#define LL_RCC_PLLI2SM_DIV_27 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 27 */ +#define LL_RCC_PLLI2SM_DIV_28 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 28 */ +#define LL_RCC_PLLI2SM_DIV_29 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 29 */ +#define LL_RCC_PLLI2SM_DIV_30 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 30 */ +#define LL_RCC_PLLI2SM_DIV_31 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 31 */ +#define LL_RCC_PLLI2SM_DIV_32 (RCC_PLLI2SCFGR_PLLI2SM_5) /*!< PLLI2S division factor for PLLI2SM output by 32 */ +#define LL_RCC_PLLI2SM_DIV_33 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 33 */ +#define LL_RCC_PLLI2SM_DIV_34 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 34 */ +#define LL_RCC_PLLI2SM_DIV_35 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 35 */ +#define LL_RCC_PLLI2SM_DIV_36 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 36 */ +#define LL_RCC_PLLI2SM_DIV_37 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 37 */ +#define LL_RCC_PLLI2SM_DIV_38 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 38 */ +#define LL_RCC_PLLI2SM_DIV_39 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 39 */ +#define LL_RCC_PLLI2SM_DIV_40 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 40 */ +#define LL_RCC_PLLI2SM_DIV_41 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 41 */ +#define LL_RCC_PLLI2SM_DIV_42 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 42 */ +#define LL_RCC_PLLI2SM_DIV_43 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 43 */ +#define LL_RCC_PLLI2SM_DIV_44 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 44 */ +#define LL_RCC_PLLI2SM_DIV_45 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 45 */ +#define LL_RCC_PLLI2SM_DIV_46 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 46 */ +#define LL_RCC_PLLI2SM_DIV_47 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 47 */ +#define LL_RCC_PLLI2SM_DIV_48 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4) /*!< PLLI2S division factor for PLLI2SM output by 48 */ +#define LL_RCC_PLLI2SM_DIV_49 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 49 */ +#define LL_RCC_PLLI2SM_DIV_50 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 50 */ +#define LL_RCC_PLLI2SM_DIV_51 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 51 */ +#define LL_RCC_PLLI2SM_DIV_52 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 52 */ +#define LL_RCC_PLLI2SM_DIV_53 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 53 */ +#define LL_RCC_PLLI2SM_DIV_54 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 54 */ +#define LL_RCC_PLLI2SM_DIV_55 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 55 */ +#define LL_RCC_PLLI2SM_DIV_56 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 56 */ +#define LL_RCC_PLLI2SM_DIV_57 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 57 */ +#define LL_RCC_PLLI2SM_DIV_58 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 58 */ +#define LL_RCC_PLLI2SM_DIV_59 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 59 */ +#define LL_RCC_PLLI2SM_DIV_60 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 60 */ +#define LL_RCC_PLLI2SM_DIV_61 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 61 */ +#define LL_RCC_PLLI2SM_DIV_62 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 62 */ +#define LL_RCC_PLLI2SM_DIV_63 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 63 */ +#else +#define LL_RCC_PLLI2SM_DIV_2 LL_RCC_PLLM_DIV_2 /*!< PLLI2S division factor for PLLI2SM output by 2 */ +#define LL_RCC_PLLI2SM_DIV_3 LL_RCC_PLLM_DIV_3 /*!< PLLI2S division factor for PLLI2SM output by 3 */ +#define LL_RCC_PLLI2SM_DIV_4 LL_RCC_PLLM_DIV_4 /*!< PLLI2S division factor for PLLI2SM output by 4 */ +#define LL_RCC_PLLI2SM_DIV_5 LL_RCC_PLLM_DIV_5 /*!< PLLI2S division factor for PLLI2SM output by 5 */ +#define LL_RCC_PLLI2SM_DIV_6 LL_RCC_PLLM_DIV_6 /*!< PLLI2S division factor for PLLI2SM output by 6 */ +#define LL_RCC_PLLI2SM_DIV_7 LL_RCC_PLLM_DIV_7 /*!< PLLI2S division factor for PLLI2SM output by 7 */ +#define LL_RCC_PLLI2SM_DIV_8 LL_RCC_PLLM_DIV_8 /*!< PLLI2S division factor for PLLI2SM output by 8 */ +#define LL_RCC_PLLI2SM_DIV_9 LL_RCC_PLLM_DIV_9 /*!< PLLI2S division factor for PLLI2SM output by 9 */ +#define LL_RCC_PLLI2SM_DIV_10 LL_RCC_PLLM_DIV_10 /*!< PLLI2S division factor for PLLI2SM output by 10 */ +#define LL_RCC_PLLI2SM_DIV_11 LL_RCC_PLLM_DIV_11 /*!< PLLI2S division factor for PLLI2SM output by 11 */ +#define LL_RCC_PLLI2SM_DIV_12 LL_RCC_PLLM_DIV_12 /*!< PLLI2S division factor for PLLI2SM output by 12 */ +#define LL_RCC_PLLI2SM_DIV_13 LL_RCC_PLLM_DIV_13 /*!< PLLI2S division factor for PLLI2SM output by 13 */ +#define LL_RCC_PLLI2SM_DIV_14 LL_RCC_PLLM_DIV_14 /*!< PLLI2S division factor for PLLI2SM output by 14 */ +#define LL_RCC_PLLI2SM_DIV_15 LL_RCC_PLLM_DIV_15 /*!< PLLI2S division factor for PLLI2SM output by 15 */ +#define LL_RCC_PLLI2SM_DIV_16 LL_RCC_PLLM_DIV_16 /*!< PLLI2S division factor for PLLI2SM output by 16 */ +#define LL_RCC_PLLI2SM_DIV_17 LL_RCC_PLLM_DIV_17 /*!< PLLI2S division factor for PLLI2SM output by 17 */ +#define LL_RCC_PLLI2SM_DIV_18 LL_RCC_PLLM_DIV_18 /*!< PLLI2S division factor for PLLI2SM output by 18 */ +#define LL_RCC_PLLI2SM_DIV_19 LL_RCC_PLLM_DIV_19 /*!< PLLI2S division factor for PLLI2SM output by 19 */ +#define LL_RCC_PLLI2SM_DIV_20 LL_RCC_PLLM_DIV_20 /*!< PLLI2S division factor for PLLI2SM output by 20 */ +#define LL_RCC_PLLI2SM_DIV_21 LL_RCC_PLLM_DIV_21 /*!< PLLI2S division factor for PLLI2SM output by 21 */ +#define LL_RCC_PLLI2SM_DIV_22 LL_RCC_PLLM_DIV_22 /*!< PLLI2S division factor for PLLI2SM output by 22 */ +#define LL_RCC_PLLI2SM_DIV_23 LL_RCC_PLLM_DIV_23 /*!< PLLI2S division factor for PLLI2SM output by 23 */ +#define LL_RCC_PLLI2SM_DIV_24 LL_RCC_PLLM_DIV_24 /*!< PLLI2S division factor for PLLI2SM output by 24 */ +#define LL_RCC_PLLI2SM_DIV_25 LL_RCC_PLLM_DIV_25 /*!< PLLI2S division factor for PLLI2SM output by 25 */ +#define LL_RCC_PLLI2SM_DIV_26 LL_RCC_PLLM_DIV_26 /*!< PLLI2S division factor for PLLI2SM output by 26 */ +#define LL_RCC_PLLI2SM_DIV_27 LL_RCC_PLLM_DIV_27 /*!< PLLI2S division factor for PLLI2SM output by 27 */ +#define LL_RCC_PLLI2SM_DIV_28 LL_RCC_PLLM_DIV_28 /*!< PLLI2S division factor for PLLI2SM output by 28 */ +#define LL_RCC_PLLI2SM_DIV_29 LL_RCC_PLLM_DIV_29 /*!< PLLI2S division factor for PLLI2SM output by 29 */ +#define LL_RCC_PLLI2SM_DIV_30 LL_RCC_PLLM_DIV_30 /*!< PLLI2S division factor for PLLI2SM output by 30 */ +#define LL_RCC_PLLI2SM_DIV_31 LL_RCC_PLLM_DIV_31 /*!< PLLI2S division factor for PLLI2SM output by 31 */ +#define LL_RCC_PLLI2SM_DIV_32 LL_RCC_PLLM_DIV_32 /*!< PLLI2S division factor for PLLI2SM output by 32 */ +#define LL_RCC_PLLI2SM_DIV_33 LL_RCC_PLLM_DIV_33 /*!< PLLI2S division factor for PLLI2SM output by 33 */ +#define LL_RCC_PLLI2SM_DIV_34 LL_RCC_PLLM_DIV_34 /*!< PLLI2S division factor for PLLI2SM output by 34 */ +#define LL_RCC_PLLI2SM_DIV_35 LL_RCC_PLLM_DIV_35 /*!< PLLI2S division factor for PLLI2SM output by 35 */ +#define LL_RCC_PLLI2SM_DIV_36 LL_RCC_PLLM_DIV_36 /*!< PLLI2S division factor for PLLI2SM output by 36 */ +#define LL_RCC_PLLI2SM_DIV_37 LL_RCC_PLLM_DIV_37 /*!< PLLI2S division factor for PLLI2SM output by 37 */ +#define LL_RCC_PLLI2SM_DIV_38 LL_RCC_PLLM_DIV_38 /*!< PLLI2S division factor for PLLI2SM output by 38 */ +#define LL_RCC_PLLI2SM_DIV_39 LL_RCC_PLLM_DIV_39 /*!< PLLI2S division factor for PLLI2SM output by 39 */ +#define LL_RCC_PLLI2SM_DIV_40 LL_RCC_PLLM_DIV_40 /*!< PLLI2S division factor for PLLI2SM output by 40 */ +#define LL_RCC_PLLI2SM_DIV_41 LL_RCC_PLLM_DIV_41 /*!< PLLI2S division factor for PLLI2SM output by 41 */ +#define LL_RCC_PLLI2SM_DIV_42 LL_RCC_PLLM_DIV_42 /*!< PLLI2S division factor for PLLI2SM output by 42 */ +#define LL_RCC_PLLI2SM_DIV_43 LL_RCC_PLLM_DIV_43 /*!< PLLI2S division factor for PLLI2SM output by 43 */ +#define LL_RCC_PLLI2SM_DIV_44 LL_RCC_PLLM_DIV_44 /*!< PLLI2S division factor for PLLI2SM output by 44 */ +#define LL_RCC_PLLI2SM_DIV_45 LL_RCC_PLLM_DIV_45 /*!< PLLI2S division factor for PLLI2SM output by 45 */ +#define LL_RCC_PLLI2SM_DIV_46 LL_RCC_PLLM_DIV_46 /*!< PLLI2S division factor for PLLI2SM output by 46 */ +#define LL_RCC_PLLI2SM_DIV_47 LL_RCC_PLLM_DIV_47 /*!< PLLI2S division factor for PLLI2SM output by 47 */ +#define LL_RCC_PLLI2SM_DIV_48 LL_RCC_PLLM_DIV_48 /*!< PLLI2S division factor for PLLI2SM output by 48 */ +#define LL_RCC_PLLI2SM_DIV_49 LL_RCC_PLLM_DIV_49 /*!< PLLI2S division factor for PLLI2SM output by 49 */ +#define LL_RCC_PLLI2SM_DIV_50 LL_RCC_PLLM_DIV_50 /*!< PLLI2S division factor for PLLI2SM output by 50 */ +#define LL_RCC_PLLI2SM_DIV_51 LL_RCC_PLLM_DIV_51 /*!< PLLI2S division factor for PLLI2SM output by 51 */ +#define LL_RCC_PLLI2SM_DIV_52 LL_RCC_PLLM_DIV_52 /*!< PLLI2S division factor for PLLI2SM output by 52 */ +#define LL_RCC_PLLI2SM_DIV_53 LL_RCC_PLLM_DIV_53 /*!< PLLI2S division factor for PLLI2SM output by 53 */ +#define LL_RCC_PLLI2SM_DIV_54 LL_RCC_PLLM_DIV_54 /*!< PLLI2S division factor for PLLI2SM output by 54 */ +#define LL_RCC_PLLI2SM_DIV_55 LL_RCC_PLLM_DIV_55 /*!< PLLI2S division factor for PLLI2SM output by 55 */ +#define LL_RCC_PLLI2SM_DIV_56 LL_RCC_PLLM_DIV_56 /*!< PLLI2S division factor for PLLI2SM output by 56 */ +#define LL_RCC_PLLI2SM_DIV_57 LL_RCC_PLLM_DIV_57 /*!< PLLI2S division factor for PLLI2SM output by 57 */ +#define LL_RCC_PLLI2SM_DIV_58 LL_RCC_PLLM_DIV_58 /*!< PLLI2S division factor for PLLI2SM output by 58 */ +#define LL_RCC_PLLI2SM_DIV_59 LL_RCC_PLLM_DIV_59 /*!< PLLI2S division factor for PLLI2SM output by 59 */ +#define LL_RCC_PLLI2SM_DIV_60 LL_RCC_PLLM_DIV_60 /*!< PLLI2S division factor for PLLI2SM output by 60 */ +#define LL_RCC_PLLI2SM_DIV_61 LL_RCC_PLLM_DIV_61 /*!< PLLI2S division factor for PLLI2SM output by 61 */ +#define LL_RCC_PLLI2SM_DIV_62 LL_RCC_PLLM_DIV_62 /*!< PLLI2S division factor for PLLI2SM output by 62 */ +#define LL_RCC_PLLI2SM_DIV_63 LL_RCC_PLLM_DIV_63 /*!< PLLI2S division factor for PLLI2SM output by 63 */ +#endif /* RCC_PLLI2SCFGR_PLLI2SM */ +/** + * @} + */ + +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) +/** @defgroup RCC_LL_EC_PLLI2SQ PLLI2SQ division factor (PLLI2SQ) + * @{ + */ +#define LL_RCC_PLLI2SQ_DIV_2 RCC_PLLI2SCFGR_PLLI2SQ_1 /*!< PLLI2S division factor for PLLI2SQ output by 2 */ +#define LL_RCC_PLLI2SQ_DIV_3 (RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 3 */ +#define LL_RCC_PLLI2SQ_DIV_4 RCC_PLLI2SCFGR_PLLI2SQ_2 /*!< PLLI2S division factor for PLLI2SQ output by 4 */ +#define LL_RCC_PLLI2SQ_DIV_5 (RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 5 */ +#define LL_RCC_PLLI2SQ_DIV_6 (RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1) /*!< PLLI2S division factor for PLLI2SQ output by 6 */ +#define LL_RCC_PLLI2SQ_DIV_7 (RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 7 */ +#define LL_RCC_PLLI2SQ_DIV_8 RCC_PLLI2SCFGR_PLLI2SQ_3 /*!< PLLI2S division factor for PLLI2SQ output by 8 */ +#define LL_RCC_PLLI2SQ_DIV_9 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 9 */ +#define LL_RCC_PLLI2SQ_DIV_10 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_1) /*!< PLLI2S division factor for PLLI2SQ output by 10 */ +#define LL_RCC_PLLI2SQ_DIV_11 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 11 */ +#define LL_RCC_PLLI2SQ_DIV_12 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2) /*!< PLLI2S division factor for PLLI2SQ output by 12 */ +#define LL_RCC_PLLI2SQ_DIV_13 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 13 */ +#define LL_RCC_PLLI2SQ_DIV_14 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1) /*!< PLLI2S division factor for PLLI2SQ output by 14 */ +#define LL_RCC_PLLI2SQ_DIV_15 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 15 */ +/** + * @} + */ +#endif /* RCC_PLLI2SCFGR_PLLI2SQ */ + +#if defined(RCC_DCKCFGR_PLLI2SDIVQ) +/** @defgroup RCC_LL_EC_PLLI2SDIVQ PLLI2SDIVQ division factor (PLLI2SDIVQ) + * @{ + */ +#define LL_RCC_PLLI2SDIVQ_DIV_1 0x00000000U /*!< PLLI2S division factor for PLLI2SDIVQ output by 1 */ +#define LL_RCC_PLLI2SDIVQ_DIV_2 RCC_DCKCFGR_PLLI2SDIVQ_0 /*!< PLLI2S division factor for PLLI2SDIVQ output by 2 */ +#define LL_RCC_PLLI2SDIVQ_DIV_3 RCC_DCKCFGR_PLLI2SDIVQ_1 /*!< PLLI2S division factor for PLLI2SDIVQ output by 3 */ +#define LL_RCC_PLLI2SDIVQ_DIV_4 (RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 4 */ +#define LL_RCC_PLLI2SDIVQ_DIV_5 RCC_DCKCFGR_PLLI2SDIVQ_2 /*!< PLLI2S division factor for PLLI2SDIVQ output by 5 */ +#define LL_RCC_PLLI2SDIVQ_DIV_6 (RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 6 */ +#define LL_RCC_PLLI2SDIVQ_DIV_7 (RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 7 */ +#define LL_RCC_PLLI2SDIVQ_DIV_8 (RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 8 */ +#define LL_RCC_PLLI2SDIVQ_DIV_9 RCC_DCKCFGR_PLLI2SDIVQ_3 /*!< PLLI2S division factor for PLLI2SDIVQ output by 9 */ +#define LL_RCC_PLLI2SDIVQ_DIV_10 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 10 */ +#define LL_RCC_PLLI2SDIVQ_DIV_11 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 11 */ +#define LL_RCC_PLLI2SDIVQ_DIV_12 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 12 */ +#define LL_RCC_PLLI2SDIVQ_DIV_13 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2) /*!< PLLI2S division factor for PLLI2SDIVQ output by 13 */ +#define LL_RCC_PLLI2SDIVQ_DIV_14 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 14 */ +#define LL_RCC_PLLI2SDIVQ_DIV_15 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 15 */ +#define LL_RCC_PLLI2SDIVQ_DIV_16 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 16 */ +#define LL_RCC_PLLI2SDIVQ_DIV_17 RCC_DCKCFGR_PLLI2SDIVQ_4 /*!< PLLI2S division factor for PLLI2SDIVQ output by 17 */ +#define LL_RCC_PLLI2SDIVQ_DIV_18 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 18 */ +#define LL_RCC_PLLI2SDIVQ_DIV_19 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 19 */ +#define LL_RCC_PLLI2SDIVQ_DIV_20 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 20 */ +#define LL_RCC_PLLI2SDIVQ_DIV_21 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2) /*!< PLLI2S division factor for PLLI2SDIVQ output by 21 */ +#define LL_RCC_PLLI2SDIVQ_DIV_22 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 22 */ +#define LL_RCC_PLLI2SDIVQ_DIV_23 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 23 */ +#define LL_RCC_PLLI2SDIVQ_DIV_24 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 24 */ +#define LL_RCC_PLLI2SDIVQ_DIV_25 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3) /*!< PLLI2S division factor for PLLI2SDIVQ output by 25 */ +#define LL_RCC_PLLI2SDIVQ_DIV_26 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 26 */ +#define LL_RCC_PLLI2SDIVQ_DIV_27 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 27 */ +#define LL_RCC_PLLI2SDIVQ_DIV_28 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 28 */ +#define LL_RCC_PLLI2SDIVQ_DIV_29 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2) /*!< PLLI2S division factor for PLLI2SDIVQ output by 29 */ +#define LL_RCC_PLLI2SDIVQ_DIV_30 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 30 */ +#define LL_RCC_PLLI2SDIVQ_DIV_31 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 31 */ +#define LL_RCC_PLLI2SDIVQ_DIV_32 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 32 */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ + +#if defined(RCC_DCKCFGR_PLLI2SDIVR) +/** @defgroup RCC_LL_EC_PLLI2SDIVR PLLI2SDIVR division factor (PLLI2SDIVR) + * @{ + */ +#define LL_RCC_PLLI2SDIVR_DIV_1 (RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 1 */ +#define LL_RCC_PLLI2SDIVR_DIV_2 (RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 2 */ +#define LL_RCC_PLLI2SDIVR_DIV_3 (RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 3 */ +#define LL_RCC_PLLI2SDIVR_DIV_4 (RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 4 */ +#define LL_RCC_PLLI2SDIVR_DIV_5 (RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 5 */ +#define LL_RCC_PLLI2SDIVR_DIV_6 (RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 6 */ +#define LL_RCC_PLLI2SDIVR_DIV_7 (RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 7 */ +#define LL_RCC_PLLI2SDIVR_DIV_8 (RCC_DCKCFGR_PLLI2SDIVR_3) /*!< PLLI2S division factor for PLLI2SDIVR output by 8 */ +#define LL_RCC_PLLI2SDIVR_DIV_9 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 9 */ +#define LL_RCC_PLLI2SDIVR_DIV_10 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 10 */ +#define LL_RCC_PLLI2SDIVR_DIV_11 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 11 */ +#define LL_RCC_PLLI2SDIVR_DIV_12 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 12 */ +#define LL_RCC_PLLI2SDIVR_DIV_13 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 13 */ +#define LL_RCC_PLLI2SDIVR_DIV_14 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 14 */ +#define LL_RCC_PLLI2SDIVR_DIV_15 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 15 */ +#define LL_RCC_PLLI2SDIVR_DIV_16 (RCC_DCKCFGR_PLLI2SDIVR_4) /*!< PLLI2S division factor for PLLI2SDIVR output by 16 */ +#define LL_RCC_PLLI2SDIVR_DIV_17 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 17 */ +#define LL_RCC_PLLI2SDIVR_DIV_18 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 18 */ +#define LL_RCC_PLLI2SDIVR_DIV_19 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 19 */ +#define LL_RCC_PLLI2SDIVR_DIV_20 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 20 */ +#define LL_RCC_PLLI2SDIVR_DIV_21 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 21 */ +#define LL_RCC_PLLI2SDIVR_DIV_22 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 22 */ +#define LL_RCC_PLLI2SDIVR_DIV_23 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 23 */ +#define LL_RCC_PLLI2SDIVR_DIV_24 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3) /*!< PLLI2S division factor for PLLI2SDIVR output by 24 */ +#define LL_RCC_PLLI2SDIVR_DIV_25 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 25 */ +#define LL_RCC_PLLI2SDIVR_DIV_26 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 26 */ +#define LL_RCC_PLLI2SDIVR_DIV_27 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 27 */ +#define LL_RCC_PLLI2SDIVR_DIV_28 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 28 */ +#define LL_RCC_PLLI2SDIVR_DIV_29 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 29 */ +#define LL_RCC_PLLI2SDIVR_DIV_30 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 30 */ +#define LL_RCC_PLLI2SDIVR_DIV_31 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 31 */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_PLLI2SDIVR */ + +/** @defgroup RCC_LL_EC_PLLI2SR PLLI2SR division factor (PLLI2SR) + * @{ + */ +#define LL_RCC_PLLI2SR_DIV_2 RCC_PLLI2SCFGR_PLLI2SR_1 /*!< PLLI2S division factor for PLLI2SR output by 2 */ +#define LL_RCC_PLLI2SR_DIV_3 (RCC_PLLI2SCFGR_PLLI2SR_1 | RCC_PLLI2SCFGR_PLLI2SR_0) /*!< PLLI2S division factor for PLLI2SR output by 3 */ +#define LL_RCC_PLLI2SR_DIV_4 RCC_PLLI2SCFGR_PLLI2SR_2 /*!< PLLI2S division factor for PLLI2SR output by 4 */ +#define LL_RCC_PLLI2SR_DIV_5 (RCC_PLLI2SCFGR_PLLI2SR_2 | RCC_PLLI2SCFGR_PLLI2SR_0) /*!< PLLI2S division factor for PLLI2SR output by 5 */ +#define LL_RCC_PLLI2SR_DIV_6 (RCC_PLLI2SCFGR_PLLI2SR_2 | RCC_PLLI2SCFGR_PLLI2SR_1) /*!< PLLI2S division factor for PLLI2SR output by 6 */ +#define LL_RCC_PLLI2SR_DIV_7 (RCC_PLLI2SCFGR_PLLI2SR_2 | RCC_PLLI2SCFGR_PLLI2SR_1 | RCC_PLLI2SCFGR_PLLI2SR_0) /*!< PLLI2S division factor for PLLI2SR output by 7 */ +/** + * @} + */ + +#if defined(RCC_PLLI2SCFGR_PLLI2SP) +/** @defgroup RCC_LL_EC_PLLI2SP PLLI2SP division factor (PLLI2SP) + * @{ + */ +#define LL_RCC_PLLI2SP_DIV_2 0x00000000U /*!< PLLI2S division factor for PLLI2SP output by 2 */ +#define LL_RCC_PLLI2SP_DIV_4 RCC_PLLI2SCFGR_PLLI2SP_0 /*!< PLLI2S division factor for PLLI2SP output by 4 */ +#define LL_RCC_PLLI2SP_DIV_6 RCC_PLLI2SCFGR_PLLI2SP_1 /*!< PLLI2S division factor for PLLI2SP output by 6 */ +#define LL_RCC_PLLI2SP_DIV_8 (RCC_PLLI2SCFGR_PLLI2SP_1 | RCC_PLLI2SCFGR_PLLI2SP_0) /*!< PLLI2S division factor for PLLI2SP output by 8 */ +/** + * @} + */ +#endif /* RCC_PLLI2SCFGR_PLLI2SP */ +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** @defgroup RCC_LL_EC_PLLSAIM PLLSAIM division factor (PLLSAIM or PLLM) + * @{ + */ +#if defined(RCC_PLLSAICFGR_PLLSAIM) +#define LL_RCC_PLLSAIM_DIV_2 (RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 2 */ +#define LL_RCC_PLLSAIM_DIV_3 (RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 3 */ +#define LL_RCC_PLLSAIM_DIV_4 (RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 4 */ +#define LL_RCC_PLLSAIM_DIV_5 (RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 5 */ +#define LL_RCC_PLLSAIM_DIV_6 (RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 6 */ +#define LL_RCC_PLLSAIM_DIV_7 (RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 7 */ +#define LL_RCC_PLLSAIM_DIV_8 (RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 8 */ +#define LL_RCC_PLLSAIM_DIV_9 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 9 */ +#define LL_RCC_PLLSAIM_DIV_10 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 10 */ +#define LL_RCC_PLLSAIM_DIV_11 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 11 */ +#define LL_RCC_PLLSAIM_DIV_12 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 12 */ +#define LL_RCC_PLLSAIM_DIV_13 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 13 */ +#define LL_RCC_PLLSAIM_DIV_14 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 14 */ +#define LL_RCC_PLLSAIM_DIV_15 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 15 */ +#define LL_RCC_PLLSAIM_DIV_16 (RCC_PLLSAICFGR_PLLSAIM_4) /*!< PLLSAI division factor for PLLSAIM output by 16 */ +#define LL_RCC_PLLSAIM_DIV_17 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 17 */ +#define LL_RCC_PLLSAIM_DIV_18 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 18 */ +#define LL_RCC_PLLSAIM_DIV_19 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 19 */ +#define LL_RCC_PLLSAIM_DIV_20 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 20 */ +#define LL_RCC_PLLSAIM_DIV_21 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 21 */ +#define LL_RCC_PLLSAIM_DIV_22 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 22 */ +#define LL_RCC_PLLSAIM_DIV_23 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 23 */ +#define LL_RCC_PLLSAIM_DIV_24 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 24 */ +#define LL_RCC_PLLSAIM_DIV_25 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 25 */ +#define LL_RCC_PLLSAIM_DIV_26 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 26 */ +#define LL_RCC_PLLSAIM_DIV_27 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 27 */ +#define LL_RCC_PLLSAIM_DIV_28 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 28 */ +#define LL_RCC_PLLSAIM_DIV_29 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 29 */ +#define LL_RCC_PLLSAIM_DIV_30 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 30 */ +#define LL_RCC_PLLSAIM_DIV_31 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 31 */ +#define LL_RCC_PLLSAIM_DIV_32 (RCC_PLLSAICFGR_PLLSAIM_5) /*!< PLLSAI division factor for PLLSAIM output by 32 */ +#define LL_RCC_PLLSAIM_DIV_33 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 33 */ +#define LL_RCC_PLLSAIM_DIV_34 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 34 */ +#define LL_RCC_PLLSAIM_DIV_35 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 35 */ +#define LL_RCC_PLLSAIM_DIV_36 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 36 */ +#define LL_RCC_PLLSAIM_DIV_37 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 37 */ +#define LL_RCC_PLLSAIM_DIV_38 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 38 */ +#define LL_RCC_PLLSAIM_DIV_39 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 39 */ +#define LL_RCC_PLLSAIM_DIV_40 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 40 */ +#define LL_RCC_PLLSAIM_DIV_41 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 41 */ +#define LL_RCC_PLLSAIM_DIV_42 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 42 */ +#define LL_RCC_PLLSAIM_DIV_43 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 43 */ +#define LL_RCC_PLLSAIM_DIV_44 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 44 */ +#define LL_RCC_PLLSAIM_DIV_45 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 45 */ +#define LL_RCC_PLLSAIM_DIV_46 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 46 */ +#define LL_RCC_PLLSAIM_DIV_47 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 47 */ +#define LL_RCC_PLLSAIM_DIV_48 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4) /*!< PLLSAI division factor for PLLSAIM output by 48 */ +#define LL_RCC_PLLSAIM_DIV_49 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 49 */ +#define LL_RCC_PLLSAIM_DIV_50 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 50 */ +#define LL_RCC_PLLSAIM_DIV_51 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 51 */ +#define LL_RCC_PLLSAIM_DIV_52 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 52 */ +#define LL_RCC_PLLSAIM_DIV_53 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 53 */ +#define LL_RCC_PLLSAIM_DIV_54 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 54 */ +#define LL_RCC_PLLSAIM_DIV_55 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 55 */ +#define LL_RCC_PLLSAIM_DIV_56 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 56 */ +#define LL_RCC_PLLSAIM_DIV_57 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 57 */ +#define LL_RCC_PLLSAIM_DIV_58 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 58 */ +#define LL_RCC_PLLSAIM_DIV_59 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 59 */ +#define LL_RCC_PLLSAIM_DIV_60 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 60 */ +#define LL_RCC_PLLSAIM_DIV_61 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 61 */ +#define LL_RCC_PLLSAIM_DIV_62 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 62 */ +#define LL_RCC_PLLSAIM_DIV_63 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 63 */ +#else +#define LL_RCC_PLLSAIM_DIV_2 LL_RCC_PLLM_DIV_2 /*!< PLLSAI division factor for PLLSAIM output by 2 */ +#define LL_RCC_PLLSAIM_DIV_3 LL_RCC_PLLM_DIV_3 /*!< PLLSAI division factor for PLLSAIM output by 3 */ +#define LL_RCC_PLLSAIM_DIV_4 LL_RCC_PLLM_DIV_4 /*!< PLLSAI division factor for PLLSAIM output by 4 */ +#define LL_RCC_PLLSAIM_DIV_5 LL_RCC_PLLM_DIV_5 /*!< PLLSAI division factor for PLLSAIM output by 5 */ +#define LL_RCC_PLLSAIM_DIV_6 LL_RCC_PLLM_DIV_6 /*!< PLLSAI division factor for PLLSAIM output by 6 */ +#define LL_RCC_PLLSAIM_DIV_7 LL_RCC_PLLM_DIV_7 /*!< PLLSAI division factor for PLLSAIM output by 7 */ +#define LL_RCC_PLLSAIM_DIV_8 LL_RCC_PLLM_DIV_8 /*!< PLLSAI division factor for PLLSAIM output by 8 */ +#define LL_RCC_PLLSAIM_DIV_9 LL_RCC_PLLM_DIV_9 /*!< PLLSAI division factor for PLLSAIM output by 9 */ +#define LL_RCC_PLLSAIM_DIV_10 LL_RCC_PLLM_DIV_10 /*!< PLLSAI division factor for PLLSAIM output by 10 */ +#define LL_RCC_PLLSAIM_DIV_11 LL_RCC_PLLM_DIV_11 /*!< PLLSAI division factor for PLLSAIM output by 11 */ +#define LL_RCC_PLLSAIM_DIV_12 LL_RCC_PLLM_DIV_12 /*!< PLLSAI division factor for PLLSAIM output by 12 */ +#define LL_RCC_PLLSAIM_DIV_13 LL_RCC_PLLM_DIV_13 /*!< PLLSAI division factor for PLLSAIM output by 13 */ +#define LL_RCC_PLLSAIM_DIV_14 LL_RCC_PLLM_DIV_14 /*!< PLLSAI division factor for PLLSAIM output by 14 */ +#define LL_RCC_PLLSAIM_DIV_15 LL_RCC_PLLM_DIV_15 /*!< PLLSAI division factor for PLLSAIM output by 15 */ +#define LL_RCC_PLLSAIM_DIV_16 LL_RCC_PLLM_DIV_16 /*!< PLLSAI division factor for PLLSAIM output by 16 */ +#define LL_RCC_PLLSAIM_DIV_17 LL_RCC_PLLM_DIV_17 /*!< PLLSAI division factor for PLLSAIM output by 17 */ +#define LL_RCC_PLLSAIM_DIV_18 LL_RCC_PLLM_DIV_18 /*!< PLLSAI division factor for PLLSAIM output by 18 */ +#define LL_RCC_PLLSAIM_DIV_19 LL_RCC_PLLM_DIV_19 /*!< PLLSAI division factor for PLLSAIM output by 19 */ +#define LL_RCC_PLLSAIM_DIV_20 LL_RCC_PLLM_DIV_20 /*!< PLLSAI division factor for PLLSAIM output by 20 */ +#define LL_RCC_PLLSAIM_DIV_21 LL_RCC_PLLM_DIV_21 /*!< PLLSAI division factor for PLLSAIM output by 21 */ +#define LL_RCC_PLLSAIM_DIV_22 LL_RCC_PLLM_DIV_22 /*!< PLLSAI division factor for PLLSAIM output by 22 */ +#define LL_RCC_PLLSAIM_DIV_23 LL_RCC_PLLM_DIV_23 /*!< PLLSAI division factor for PLLSAIM output by 23 */ +#define LL_RCC_PLLSAIM_DIV_24 LL_RCC_PLLM_DIV_24 /*!< PLLSAI division factor for PLLSAIM output by 24 */ +#define LL_RCC_PLLSAIM_DIV_25 LL_RCC_PLLM_DIV_25 /*!< PLLSAI division factor for PLLSAIM output by 25 */ +#define LL_RCC_PLLSAIM_DIV_26 LL_RCC_PLLM_DIV_26 /*!< PLLSAI division factor for PLLSAIM output by 26 */ +#define LL_RCC_PLLSAIM_DIV_27 LL_RCC_PLLM_DIV_27 /*!< PLLSAI division factor for PLLSAIM output by 27 */ +#define LL_RCC_PLLSAIM_DIV_28 LL_RCC_PLLM_DIV_28 /*!< PLLSAI division factor for PLLSAIM output by 28 */ +#define LL_RCC_PLLSAIM_DIV_29 LL_RCC_PLLM_DIV_29 /*!< PLLSAI division factor for PLLSAIM output by 29 */ +#define LL_RCC_PLLSAIM_DIV_30 LL_RCC_PLLM_DIV_30 /*!< PLLSAI division factor for PLLSAIM output by 30 */ +#define LL_RCC_PLLSAIM_DIV_31 LL_RCC_PLLM_DIV_31 /*!< PLLSAI division factor for PLLSAIM output by 31 */ +#define LL_RCC_PLLSAIM_DIV_32 LL_RCC_PLLM_DIV_32 /*!< PLLSAI division factor for PLLSAIM output by 32 */ +#define LL_RCC_PLLSAIM_DIV_33 LL_RCC_PLLM_DIV_33 /*!< PLLSAI division factor for PLLSAIM output by 33 */ +#define LL_RCC_PLLSAIM_DIV_34 LL_RCC_PLLM_DIV_34 /*!< PLLSAI division factor for PLLSAIM output by 34 */ +#define LL_RCC_PLLSAIM_DIV_35 LL_RCC_PLLM_DIV_35 /*!< PLLSAI division factor for PLLSAIM output by 35 */ +#define LL_RCC_PLLSAIM_DIV_36 LL_RCC_PLLM_DIV_36 /*!< PLLSAI division factor for PLLSAIM output by 36 */ +#define LL_RCC_PLLSAIM_DIV_37 LL_RCC_PLLM_DIV_37 /*!< PLLSAI division factor for PLLSAIM output by 37 */ +#define LL_RCC_PLLSAIM_DIV_38 LL_RCC_PLLM_DIV_38 /*!< PLLSAI division factor for PLLSAIM output by 38 */ +#define LL_RCC_PLLSAIM_DIV_39 LL_RCC_PLLM_DIV_39 /*!< PLLSAI division factor for PLLSAIM output by 39 */ +#define LL_RCC_PLLSAIM_DIV_40 LL_RCC_PLLM_DIV_40 /*!< PLLSAI division factor for PLLSAIM output by 40 */ +#define LL_RCC_PLLSAIM_DIV_41 LL_RCC_PLLM_DIV_41 /*!< PLLSAI division factor for PLLSAIM output by 41 */ +#define LL_RCC_PLLSAIM_DIV_42 LL_RCC_PLLM_DIV_42 /*!< PLLSAI division factor for PLLSAIM output by 42 */ +#define LL_RCC_PLLSAIM_DIV_43 LL_RCC_PLLM_DIV_43 /*!< PLLSAI division factor for PLLSAIM output by 43 */ +#define LL_RCC_PLLSAIM_DIV_44 LL_RCC_PLLM_DIV_44 /*!< PLLSAI division factor for PLLSAIM output by 44 */ +#define LL_RCC_PLLSAIM_DIV_45 LL_RCC_PLLM_DIV_45 /*!< PLLSAI division factor for PLLSAIM output by 45 */ +#define LL_RCC_PLLSAIM_DIV_46 LL_RCC_PLLM_DIV_46 /*!< PLLSAI division factor for PLLSAIM output by 46 */ +#define LL_RCC_PLLSAIM_DIV_47 LL_RCC_PLLM_DIV_47 /*!< PLLSAI division factor for PLLSAIM output by 47 */ +#define LL_RCC_PLLSAIM_DIV_48 LL_RCC_PLLM_DIV_48 /*!< PLLSAI division factor for PLLSAIM output by 48 */ +#define LL_RCC_PLLSAIM_DIV_49 LL_RCC_PLLM_DIV_49 /*!< PLLSAI division factor for PLLSAIM output by 49 */ +#define LL_RCC_PLLSAIM_DIV_50 LL_RCC_PLLM_DIV_50 /*!< PLLSAI division factor for PLLSAIM output by 50 */ +#define LL_RCC_PLLSAIM_DIV_51 LL_RCC_PLLM_DIV_51 /*!< PLLSAI division factor for PLLSAIM output by 51 */ +#define LL_RCC_PLLSAIM_DIV_52 LL_RCC_PLLM_DIV_52 /*!< PLLSAI division factor for PLLSAIM output by 52 */ +#define LL_RCC_PLLSAIM_DIV_53 LL_RCC_PLLM_DIV_53 /*!< PLLSAI division factor for PLLSAIM output by 53 */ +#define LL_RCC_PLLSAIM_DIV_54 LL_RCC_PLLM_DIV_54 /*!< PLLSAI division factor for PLLSAIM output by 54 */ +#define LL_RCC_PLLSAIM_DIV_55 LL_RCC_PLLM_DIV_55 /*!< PLLSAI division factor for PLLSAIM output by 55 */ +#define LL_RCC_PLLSAIM_DIV_56 LL_RCC_PLLM_DIV_56 /*!< PLLSAI division factor for PLLSAIM output by 56 */ +#define LL_RCC_PLLSAIM_DIV_57 LL_RCC_PLLM_DIV_57 /*!< PLLSAI division factor for PLLSAIM output by 57 */ +#define LL_RCC_PLLSAIM_DIV_58 LL_RCC_PLLM_DIV_58 /*!< PLLSAI division factor for PLLSAIM output by 58 */ +#define LL_RCC_PLLSAIM_DIV_59 LL_RCC_PLLM_DIV_59 /*!< PLLSAI division factor for PLLSAIM output by 59 */ +#define LL_RCC_PLLSAIM_DIV_60 LL_RCC_PLLM_DIV_60 /*!< PLLSAI division factor for PLLSAIM output by 60 */ +#define LL_RCC_PLLSAIM_DIV_61 LL_RCC_PLLM_DIV_61 /*!< PLLSAI division factor for PLLSAIM output by 61 */ +#define LL_RCC_PLLSAIM_DIV_62 LL_RCC_PLLM_DIV_62 /*!< PLLSAI division factor for PLLSAIM output by 62 */ +#define LL_RCC_PLLSAIM_DIV_63 LL_RCC_PLLM_DIV_63 /*!< PLLSAI division factor for PLLSAIM output by 63 */ +#endif /* RCC_PLLSAICFGR_PLLSAIM */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_PLLSAIQ PLLSAIQ division factor (PLLSAIQ) + * @{ + */ +#define LL_RCC_PLLSAIQ_DIV_2 RCC_PLLSAICFGR_PLLSAIQ_1 /*!< PLLSAI division factor for PLLSAIQ output by 2 */ +#define LL_RCC_PLLSAIQ_DIV_3 (RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 3 */ +#define LL_RCC_PLLSAIQ_DIV_4 RCC_PLLSAICFGR_PLLSAIQ_2 /*!< PLLSAI division factor for PLLSAIQ output by 4 */ +#define LL_RCC_PLLSAIQ_DIV_5 (RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 5 */ +#define LL_RCC_PLLSAIQ_DIV_6 (RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1) /*!< PLLSAI division factor for PLLSAIQ output by 6 */ +#define LL_RCC_PLLSAIQ_DIV_7 (RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 7 */ +#define LL_RCC_PLLSAIQ_DIV_8 RCC_PLLSAICFGR_PLLSAIQ_3 /*!< PLLSAI division factor for PLLSAIQ output by 8 */ +#define LL_RCC_PLLSAIQ_DIV_9 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 9 */ +#define LL_RCC_PLLSAIQ_DIV_10 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_1) /*!< PLLSAI division factor for PLLSAIQ output by 10 */ +#define LL_RCC_PLLSAIQ_DIV_11 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 11 */ +#define LL_RCC_PLLSAIQ_DIV_12 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2) /*!< PLLSAI division factor for PLLSAIQ output by 12 */ +#define LL_RCC_PLLSAIQ_DIV_13 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 13 */ +#define LL_RCC_PLLSAIQ_DIV_14 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1) /*!< PLLSAI division factor for PLLSAIQ output by 14 */ +#define LL_RCC_PLLSAIQ_DIV_15 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 15 */ +/** + * @} + */ + +#if defined(RCC_DCKCFGR_PLLSAIDIVQ) +/** @defgroup RCC_LL_EC_PLLSAIDIVQ PLLSAIDIVQ division factor (PLLSAIDIVQ) + * @{ + */ +#define LL_RCC_PLLSAIDIVQ_DIV_1 0x00000000U /*!< PLLSAI division factor for PLLSAIDIVQ output by 1 */ +#define LL_RCC_PLLSAIDIVQ_DIV_2 RCC_DCKCFGR_PLLSAIDIVQ_0 /*!< PLLSAI division factor for PLLSAIDIVQ output by 2 */ +#define LL_RCC_PLLSAIDIVQ_DIV_3 RCC_DCKCFGR_PLLSAIDIVQ_1 /*!< PLLSAI division factor for PLLSAIDIVQ output by 3 */ +#define LL_RCC_PLLSAIDIVQ_DIV_4 (RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 4 */ +#define LL_RCC_PLLSAIDIVQ_DIV_5 RCC_DCKCFGR_PLLSAIDIVQ_2 /*!< PLLSAI division factor for PLLSAIDIVQ output by 5 */ +#define LL_RCC_PLLSAIDIVQ_DIV_6 (RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 6 */ +#define LL_RCC_PLLSAIDIVQ_DIV_7 (RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 7 */ +#define LL_RCC_PLLSAIDIVQ_DIV_8 (RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 8 */ +#define LL_RCC_PLLSAIDIVQ_DIV_9 RCC_DCKCFGR_PLLSAIDIVQ_3 /*!< PLLSAI division factor for PLLSAIDIVQ output by 9 */ +#define LL_RCC_PLLSAIDIVQ_DIV_10 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 10 */ +#define LL_RCC_PLLSAIDIVQ_DIV_11 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 11 */ +#define LL_RCC_PLLSAIDIVQ_DIV_12 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 12 */ +#define LL_RCC_PLLSAIDIVQ_DIV_13 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2) /*!< PLLSAI division factor for PLLSAIDIVQ output by 13 */ +#define LL_RCC_PLLSAIDIVQ_DIV_14 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 14 */ +#define LL_RCC_PLLSAIDIVQ_DIV_15 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 15 */ +#define LL_RCC_PLLSAIDIVQ_DIV_16 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 16 */ +#define LL_RCC_PLLSAIDIVQ_DIV_17 RCC_DCKCFGR_PLLSAIDIVQ_4 /*!< PLLSAI division factor for PLLSAIDIVQ output by 17 */ +#define LL_RCC_PLLSAIDIVQ_DIV_18 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 18 */ +#define LL_RCC_PLLSAIDIVQ_DIV_19 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 19 */ +#define LL_RCC_PLLSAIDIVQ_DIV_20 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 20 */ +#define LL_RCC_PLLSAIDIVQ_DIV_21 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2) /*!< PLLSAI division factor for PLLSAIDIVQ output by 21 */ +#define LL_RCC_PLLSAIDIVQ_DIV_22 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 22 */ +#define LL_RCC_PLLSAIDIVQ_DIV_23 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 23 */ +#define LL_RCC_PLLSAIDIVQ_DIV_24 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 24 */ +#define LL_RCC_PLLSAIDIVQ_DIV_25 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3) /*!< PLLSAI division factor for PLLSAIDIVQ output by 25 */ +#define LL_RCC_PLLSAIDIVQ_DIV_26 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 26 */ +#define LL_RCC_PLLSAIDIVQ_DIV_27 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 27 */ +#define LL_RCC_PLLSAIDIVQ_DIV_28 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 28 */ +#define LL_RCC_PLLSAIDIVQ_DIV_29 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2) /*!< PLLSAI division factor for PLLSAIDIVQ output by 29 */ +#define LL_RCC_PLLSAIDIVQ_DIV_30 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 30 */ +#define LL_RCC_PLLSAIDIVQ_DIV_31 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 31 */ +#define LL_RCC_PLLSAIDIVQ_DIV_32 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 32 */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_PLLSAIDIVQ */ + +#if defined(RCC_PLLSAICFGR_PLLSAIR) +/** @defgroup RCC_LL_EC_PLLSAIR PLLSAIR division factor (PLLSAIR) + * @{ + */ +#define LL_RCC_PLLSAIR_DIV_2 RCC_PLLSAICFGR_PLLSAIR_1 /*!< PLLSAI division factor for PLLSAIR output by 2 */ +#define LL_RCC_PLLSAIR_DIV_3 (RCC_PLLSAICFGR_PLLSAIR_1 | RCC_PLLSAICFGR_PLLSAIR_0) /*!< PLLSAI division factor for PLLSAIR output by 3 */ +#define LL_RCC_PLLSAIR_DIV_4 RCC_PLLSAICFGR_PLLSAIR_2 /*!< PLLSAI division factor for PLLSAIR output by 4 */ +#define LL_RCC_PLLSAIR_DIV_5 (RCC_PLLSAICFGR_PLLSAIR_2 | RCC_PLLSAICFGR_PLLSAIR_0) /*!< PLLSAI division factor for PLLSAIR output by 5 */ +#define LL_RCC_PLLSAIR_DIV_6 (RCC_PLLSAICFGR_PLLSAIR_2 | RCC_PLLSAICFGR_PLLSAIR_1) /*!< PLLSAI division factor for PLLSAIR output by 6 */ +#define LL_RCC_PLLSAIR_DIV_7 (RCC_PLLSAICFGR_PLLSAIR_2 | RCC_PLLSAICFGR_PLLSAIR_1 | RCC_PLLSAICFGR_PLLSAIR_0) /*!< PLLSAI division factor for PLLSAIR output by 7 */ +/** + * @} + */ +#endif /* RCC_PLLSAICFGR_PLLSAIR */ + +#if defined(RCC_DCKCFGR_PLLSAIDIVR) +/** @defgroup RCC_LL_EC_PLLSAIDIVR PLLSAIDIVR division factor (PLLSAIDIVR) + * @{ + */ +#define LL_RCC_PLLSAIDIVR_DIV_2 0x00000000U /*!< PLLSAI division factor for PLLSAIDIVR output by 2 */ +#define LL_RCC_PLLSAIDIVR_DIV_4 RCC_DCKCFGR_PLLSAIDIVR_0 /*!< PLLSAI division factor for PLLSAIDIVR output by 4 */ +#define LL_RCC_PLLSAIDIVR_DIV_8 RCC_DCKCFGR_PLLSAIDIVR_1 /*!< PLLSAI division factor for PLLSAIDIVR output by 8 */ +#define LL_RCC_PLLSAIDIVR_DIV_16 (RCC_DCKCFGR_PLLSAIDIVR_1 | RCC_DCKCFGR_PLLSAIDIVR_0) /*!< PLLSAI division factor for PLLSAIDIVR output by 16 */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_PLLSAIDIVR */ + +#if defined(RCC_PLLSAICFGR_PLLSAIP) +/** @defgroup RCC_LL_EC_PLLSAIP PLLSAIP division factor (PLLSAIP) + * @{ + */ +#define LL_RCC_PLLSAIP_DIV_2 0x00000000U /*!< PLLSAI division factor for PLLSAIP output by 2 */ +#define LL_RCC_PLLSAIP_DIV_4 RCC_PLLSAICFGR_PLLSAIP_0 /*!< PLLSAI division factor for PLLSAIP output by 4 */ +#define LL_RCC_PLLSAIP_DIV_6 RCC_PLLSAICFGR_PLLSAIP_1 /*!< PLLSAI division factor for PLLSAIP output by 6 */ +#define LL_RCC_PLLSAIP_DIV_8 (RCC_PLLSAICFGR_PLLSAIP_1 | RCC_PLLSAICFGR_PLLSAIP_0) /*!< PLLSAI division factor for PLLSAIP output by 8 */ +/** + * @} + */ +#endif /* RCC_PLLSAICFGR_PLLSAIP */ +#endif /* RCC_PLLSAI_SUPPORT */ +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup RCC_LL_Exported_Macros RCC Exported Macros + * @{ + */ + +/** @defgroup RCC_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in RCC register + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_RCC_WriteReg(__REG__, __VALUE__) WRITE_REG(RCC->__REG__, (__VALUE__)) + +/** + * @brief Read a value in RCC register + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_RCC_ReadReg(__REG__) READ_REG(RCC->__REG__) +/** + * @} + */ + +/** @defgroup RCC_LL_EM_CALC_FREQ Calculate frequencies + * @{ + */ + +/** + * @brief Helper macro to calculate the PLLCLK frequency on system domain + * @note ex: @ref __LL_RCC_CALC_PLLCLK_FREQ (HSE_VALUE,@ref LL_RCC_PLL_GetDivider (), + * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetP ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param __PLLN__ Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param __PLLP__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLP_DIV_2 + * @arg @ref LL_RCC_PLLP_DIV_4 + * @arg @ref LL_RCC_PLLP_DIV_6 + * @arg @ref LL_RCC_PLLP_DIV_8 + * @retval PLL clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLCLK_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLP__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((((__PLLP__) >> RCC_PLLCFGR_PLLP_Pos ) + 1U) * 2U)) + +#if defined(RCC_PLLR_SYSCLK_SUPPORT) +/** + * @brief Helper macro to calculate the PLLRCLK frequency on system domain + * @note ex: @ref __LL_RCC_CALC_PLLRCLK_FREQ (HSE_VALUE,@ref LL_RCC_PLL_GetDivider (), + * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param __PLLN__ Between 50 and 432 + * @param __PLLR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @retval PLL clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLRCLK_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) + +#endif /* RCC_PLLR_SYSCLK_SUPPORT */ + +/** + * @brief Helper macro to calculate the PLLCLK frequency used on 48M domain + * @note ex: @ref __LL_RCC_CALC_PLLCLK_48M_FREQ (HSE_VALUE,@ref LL_RCC_PLL_GetDivider (), + * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetQ ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param __PLLN__ Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param __PLLQ__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLQ_DIV_2 + * @arg @ref LL_RCC_PLLQ_DIV_3 + * @arg @ref LL_RCC_PLLQ_DIV_4 + * @arg @ref LL_RCC_PLLQ_DIV_5 + * @arg @ref LL_RCC_PLLQ_DIV_6 + * @arg @ref LL_RCC_PLLQ_DIV_7 + * @arg @ref LL_RCC_PLLQ_DIV_8 + * @arg @ref LL_RCC_PLLQ_DIV_9 + * @arg @ref LL_RCC_PLLQ_DIV_10 + * @arg @ref LL_RCC_PLLQ_DIV_11 + * @arg @ref LL_RCC_PLLQ_DIV_12 + * @arg @ref LL_RCC_PLLQ_DIV_13 + * @arg @ref LL_RCC_PLLQ_DIV_14 + * @arg @ref LL_RCC_PLLQ_DIV_15 + * @retval PLL clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLCLK_48M_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLQ__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((__PLLQ__) >> RCC_PLLCFGR_PLLQ_Pos )) + +#if defined(DSI) +/** + * @brief Helper macro to calculate the PLLCLK frequency used on DSI + * @note ex: @ref __LL_RCC_CALC_PLLCLK_DSI_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), + * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param __PLLN__ Between 50 and 432 + * @param __PLLR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @retval PLL clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLCLK_DSI_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) +#endif /* DSI */ + +#if defined(RCC_PLLR_I2S_CLKSOURCE_SUPPORT) +/** + * @brief Helper macro to calculate the PLLCLK frequency used on I2S + * @note ex: @ref __LL_RCC_CALC_PLLCLK_I2S_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), + * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param __PLLN__ Between 50 and 432 + * @param __PLLR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @retval PLL clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLCLK_I2S_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) +#endif /* RCC_PLLR_I2S_CLKSOURCE_SUPPORT */ + +#if defined(SPDIFRX) +/** + * @brief Helper macro to calculate the PLLCLK frequency used on SPDIFRX + * @note ex: @ref __LL_RCC_CALC_PLLCLK_SPDIFRX_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), + * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param __PLLN__ Between 50 and 432 + * @param __PLLR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @retval PLL clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLCLK_SPDIFRX_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) +#endif /* SPDIFRX */ + +#if defined(RCC_PLLCFGR_PLLR) +#if defined(SAI1) +/** + * @brief Helper macro to calculate the PLLCLK frequency used on SAI + * @note ex: @ref __LL_RCC_CALC_PLLCLK_SAI_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), + * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR (), @ref LL_RCC_PLL_GetDIVR ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param __PLLN__ Between 50 and 432 + * @param __PLLR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @param __PLLDIVR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLDIVR_DIV_1 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_2 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_3 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_4 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_5 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_6 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_7 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_8 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_9 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_10 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_11 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_12 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_13 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_14 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_15 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_16 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_17 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_18 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_19 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_20 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_21 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_22 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_23 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_24 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_25 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_26 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_27 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_28 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_29 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_30 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_31 (*) + * + * (*) value not defined in all devices. + * @retval PLL clock frequency (in Hz) + */ +#if defined(RCC_DCKCFGR_PLLDIVR) +#define __LL_RCC_CALC_PLLCLK_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__, __PLLDIVR__) (((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) / ((__PLLDIVR__) >> RCC_DCKCFGR_PLLDIVR_Pos )) +#else +#define __LL_RCC_CALC_PLLCLK_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) +#endif /* RCC_DCKCFGR_PLLDIVR */ +#endif /* SAI1 */ +#endif /* RCC_PLLCFGR_PLLR */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** + * @brief Helper macro to calculate the PLLSAI frequency used for SAI domain + * @note ex: @ref __LL_RCC_CALC_PLLSAI_SAI_FREQ (HSE_VALUE,@ref LL_RCC_PLLSAI_GetDivider (), + * @ref LL_RCC_PLLSAI_GetN (), @ref LL_RCC_PLLSAI_GetQ (), @ref LL_RCC_PLLSAI_GetDIVQ ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIM_DIV_2 + * @arg @ref LL_RCC_PLLSAIM_DIV_3 + * @arg @ref LL_RCC_PLLSAIM_DIV_4 + * @arg @ref LL_RCC_PLLSAIM_DIV_5 + * @arg @ref LL_RCC_PLLSAIM_DIV_6 + * @arg @ref LL_RCC_PLLSAIM_DIV_7 + * @arg @ref LL_RCC_PLLSAIM_DIV_8 + * @arg @ref LL_RCC_PLLSAIM_DIV_9 + * @arg @ref LL_RCC_PLLSAIM_DIV_10 + * @arg @ref LL_RCC_PLLSAIM_DIV_11 + * @arg @ref LL_RCC_PLLSAIM_DIV_12 + * @arg @ref LL_RCC_PLLSAIM_DIV_13 + * @arg @ref LL_RCC_PLLSAIM_DIV_14 + * @arg @ref LL_RCC_PLLSAIM_DIV_15 + * @arg @ref LL_RCC_PLLSAIM_DIV_16 + * @arg @ref LL_RCC_PLLSAIM_DIV_17 + * @arg @ref LL_RCC_PLLSAIM_DIV_18 + * @arg @ref LL_RCC_PLLSAIM_DIV_19 + * @arg @ref LL_RCC_PLLSAIM_DIV_20 + * @arg @ref LL_RCC_PLLSAIM_DIV_21 + * @arg @ref LL_RCC_PLLSAIM_DIV_22 + * @arg @ref LL_RCC_PLLSAIM_DIV_23 + * @arg @ref LL_RCC_PLLSAIM_DIV_24 + * @arg @ref LL_RCC_PLLSAIM_DIV_25 + * @arg @ref LL_RCC_PLLSAIM_DIV_26 + * @arg @ref LL_RCC_PLLSAIM_DIV_27 + * @arg @ref LL_RCC_PLLSAIM_DIV_28 + * @arg @ref LL_RCC_PLLSAIM_DIV_29 + * @arg @ref LL_RCC_PLLSAIM_DIV_30 + * @arg @ref LL_RCC_PLLSAIM_DIV_31 + * @arg @ref LL_RCC_PLLSAIM_DIV_32 + * @arg @ref LL_RCC_PLLSAIM_DIV_33 + * @arg @ref LL_RCC_PLLSAIM_DIV_34 + * @arg @ref LL_RCC_PLLSAIM_DIV_35 + * @arg @ref LL_RCC_PLLSAIM_DIV_36 + * @arg @ref LL_RCC_PLLSAIM_DIV_37 + * @arg @ref LL_RCC_PLLSAIM_DIV_38 + * @arg @ref LL_RCC_PLLSAIM_DIV_39 + * @arg @ref LL_RCC_PLLSAIM_DIV_40 + * @arg @ref LL_RCC_PLLSAIM_DIV_41 + * @arg @ref LL_RCC_PLLSAIM_DIV_42 + * @arg @ref LL_RCC_PLLSAIM_DIV_43 + * @arg @ref LL_RCC_PLLSAIM_DIV_44 + * @arg @ref LL_RCC_PLLSAIM_DIV_45 + * @arg @ref LL_RCC_PLLSAIM_DIV_46 + * @arg @ref LL_RCC_PLLSAIM_DIV_47 + * @arg @ref LL_RCC_PLLSAIM_DIV_48 + * @arg @ref LL_RCC_PLLSAIM_DIV_49 + * @arg @ref LL_RCC_PLLSAIM_DIV_50 + * @arg @ref LL_RCC_PLLSAIM_DIV_51 + * @arg @ref LL_RCC_PLLSAIM_DIV_52 + * @arg @ref LL_RCC_PLLSAIM_DIV_53 + * @arg @ref LL_RCC_PLLSAIM_DIV_54 + * @arg @ref LL_RCC_PLLSAIM_DIV_55 + * @arg @ref LL_RCC_PLLSAIM_DIV_56 + * @arg @ref LL_RCC_PLLSAIM_DIV_57 + * @arg @ref LL_RCC_PLLSAIM_DIV_58 + * @arg @ref LL_RCC_PLLSAIM_DIV_59 + * @arg @ref LL_RCC_PLLSAIM_DIV_60 + * @arg @ref LL_RCC_PLLSAIM_DIV_61 + * @arg @ref LL_RCC_PLLSAIM_DIV_62 + * @arg @ref LL_RCC_PLLSAIM_DIV_63 + * @param __PLLSAIN__ Between 49/50(*) and 432 + * + * (*) value not defined in all devices. + * @param __PLLSAIQ__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIQ_DIV_2 + * @arg @ref LL_RCC_PLLSAIQ_DIV_3 + * @arg @ref LL_RCC_PLLSAIQ_DIV_4 + * @arg @ref LL_RCC_PLLSAIQ_DIV_5 + * @arg @ref LL_RCC_PLLSAIQ_DIV_6 + * @arg @ref LL_RCC_PLLSAIQ_DIV_7 + * @arg @ref LL_RCC_PLLSAIQ_DIV_8 + * @arg @ref LL_RCC_PLLSAIQ_DIV_9 + * @arg @ref LL_RCC_PLLSAIQ_DIV_10 + * @arg @ref LL_RCC_PLLSAIQ_DIV_11 + * @arg @ref LL_RCC_PLLSAIQ_DIV_12 + * @arg @ref LL_RCC_PLLSAIQ_DIV_13 + * @arg @ref LL_RCC_PLLSAIQ_DIV_14 + * @arg @ref LL_RCC_PLLSAIQ_DIV_15 + * @param __PLLSAIDIVQ__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_1 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_2 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_3 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_4 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_5 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_6 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_7 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_8 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_9 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_10 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_11 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_12 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_13 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_14 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_15 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_16 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_17 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_18 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_19 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_20 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_21 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_22 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_23 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_24 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_25 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_26 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_27 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_28 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_29 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_30 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_31 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_32 + * @retval PLLSAI clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLSAI_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLSAIN__, __PLLSAIQ__, __PLLSAIDIVQ__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLSAIN__) / \ + (((__PLLSAIQ__) >> RCC_PLLSAICFGR_PLLSAIQ_Pos) * (((__PLLSAIDIVQ__) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos) + 1U))) + +#if defined(RCC_PLLSAICFGR_PLLSAIP) +/** + * @brief Helper macro to calculate the PLLSAI frequency used on 48Mhz domain + * @note ex: @ref __LL_RCC_CALC_PLLSAI_48M_FREQ (HSE_VALUE,@ref LL_RCC_PLLSAI_GetDivider (), + * @ref LL_RCC_PLLSAI_GetN (), @ref LL_RCC_PLLSAI_GetP ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIM_DIV_2 + * @arg @ref LL_RCC_PLLSAIM_DIV_3 + * @arg @ref LL_RCC_PLLSAIM_DIV_4 + * @arg @ref LL_RCC_PLLSAIM_DIV_5 + * @arg @ref LL_RCC_PLLSAIM_DIV_6 + * @arg @ref LL_RCC_PLLSAIM_DIV_7 + * @arg @ref LL_RCC_PLLSAIM_DIV_8 + * @arg @ref LL_RCC_PLLSAIM_DIV_9 + * @arg @ref LL_RCC_PLLSAIM_DIV_10 + * @arg @ref LL_RCC_PLLSAIM_DIV_11 + * @arg @ref LL_RCC_PLLSAIM_DIV_12 + * @arg @ref LL_RCC_PLLSAIM_DIV_13 + * @arg @ref LL_RCC_PLLSAIM_DIV_14 + * @arg @ref LL_RCC_PLLSAIM_DIV_15 + * @arg @ref LL_RCC_PLLSAIM_DIV_16 + * @arg @ref LL_RCC_PLLSAIM_DIV_17 + * @arg @ref LL_RCC_PLLSAIM_DIV_18 + * @arg @ref LL_RCC_PLLSAIM_DIV_19 + * @arg @ref LL_RCC_PLLSAIM_DIV_20 + * @arg @ref LL_RCC_PLLSAIM_DIV_21 + * @arg @ref LL_RCC_PLLSAIM_DIV_22 + * @arg @ref LL_RCC_PLLSAIM_DIV_23 + * @arg @ref LL_RCC_PLLSAIM_DIV_24 + * @arg @ref LL_RCC_PLLSAIM_DIV_25 + * @arg @ref LL_RCC_PLLSAIM_DIV_26 + * @arg @ref LL_RCC_PLLSAIM_DIV_27 + * @arg @ref LL_RCC_PLLSAIM_DIV_28 + * @arg @ref LL_RCC_PLLSAIM_DIV_29 + * @arg @ref LL_RCC_PLLSAIM_DIV_30 + * @arg @ref LL_RCC_PLLSAIM_DIV_31 + * @arg @ref LL_RCC_PLLSAIM_DIV_32 + * @arg @ref LL_RCC_PLLSAIM_DIV_33 + * @arg @ref LL_RCC_PLLSAIM_DIV_34 + * @arg @ref LL_RCC_PLLSAIM_DIV_35 + * @arg @ref LL_RCC_PLLSAIM_DIV_36 + * @arg @ref LL_RCC_PLLSAIM_DIV_37 + * @arg @ref LL_RCC_PLLSAIM_DIV_38 + * @arg @ref LL_RCC_PLLSAIM_DIV_39 + * @arg @ref LL_RCC_PLLSAIM_DIV_40 + * @arg @ref LL_RCC_PLLSAIM_DIV_41 + * @arg @ref LL_RCC_PLLSAIM_DIV_42 + * @arg @ref LL_RCC_PLLSAIM_DIV_43 + * @arg @ref LL_RCC_PLLSAIM_DIV_44 + * @arg @ref LL_RCC_PLLSAIM_DIV_45 + * @arg @ref LL_RCC_PLLSAIM_DIV_46 + * @arg @ref LL_RCC_PLLSAIM_DIV_47 + * @arg @ref LL_RCC_PLLSAIM_DIV_48 + * @arg @ref LL_RCC_PLLSAIM_DIV_49 + * @arg @ref LL_RCC_PLLSAIM_DIV_50 + * @arg @ref LL_RCC_PLLSAIM_DIV_51 + * @arg @ref LL_RCC_PLLSAIM_DIV_52 + * @arg @ref LL_RCC_PLLSAIM_DIV_53 + * @arg @ref LL_RCC_PLLSAIM_DIV_54 + * @arg @ref LL_RCC_PLLSAIM_DIV_55 + * @arg @ref LL_RCC_PLLSAIM_DIV_56 + * @arg @ref LL_RCC_PLLSAIM_DIV_57 + * @arg @ref LL_RCC_PLLSAIM_DIV_58 + * @arg @ref LL_RCC_PLLSAIM_DIV_59 + * @arg @ref LL_RCC_PLLSAIM_DIV_60 + * @arg @ref LL_RCC_PLLSAIM_DIV_61 + * @arg @ref LL_RCC_PLLSAIM_DIV_62 + * @arg @ref LL_RCC_PLLSAIM_DIV_63 + * @param __PLLSAIN__ Between 50 and 432 + * @param __PLLSAIP__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIP_DIV_2 + * @arg @ref LL_RCC_PLLSAIP_DIV_4 + * @arg @ref LL_RCC_PLLSAIP_DIV_6 + * @arg @ref LL_RCC_PLLSAIP_DIV_8 + * @retval PLLSAI clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLSAI_48M_FREQ(__INPUTFREQ__, __PLLM__, __PLLSAIN__, __PLLSAIP__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLSAIN__) / \ + ((((__PLLSAIP__) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) * 2U)) +#endif /* RCC_PLLSAICFGR_PLLSAIP */ + +#if defined(LTDC) +/** + * @brief Helper macro to calculate the PLLSAI frequency used for LTDC domain + * @note ex: @ref __LL_RCC_CALC_PLLSAI_LTDC_FREQ (HSE_VALUE,@ref LL_RCC_PLLSAI_GetDivider (), + * @ref LL_RCC_PLLSAI_GetN (), @ref LL_RCC_PLLSAI_GetR (), @ref LL_RCC_PLLSAI_GetDIVR ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIM_DIV_2 + * @arg @ref LL_RCC_PLLSAIM_DIV_3 + * @arg @ref LL_RCC_PLLSAIM_DIV_4 + * @arg @ref LL_RCC_PLLSAIM_DIV_5 + * @arg @ref LL_RCC_PLLSAIM_DIV_6 + * @arg @ref LL_RCC_PLLSAIM_DIV_7 + * @arg @ref LL_RCC_PLLSAIM_DIV_8 + * @arg @ref LL_RCC_PLLSAIM_DIV_9 + * @arg @ref LL_RCC_PLLSAIM_DIV_10 + * @arg @ref LL_RCC_PLLSAIM_DIV_11 + * @arg @ref LL_RCC_PLLSAIM_DIV_12 + * @arg @ref LL_RCC_PLLSAIM_DIV_13 + * @arg @ref LL_RCC_PLLSAIM_DIV_14 + * @arg @ref LL_RCC_PLLSAIM_DIV_15 + * @arg @ref LL_RCC_PLLSAIM_DIV_16 + * @arg @ref LL_RCC_PLLSAIM_DIV_17 + * @arg @ref LL_RCC_PLLSAIM_DIV_18 + * @arg @ref LL_RCC_PLLSAIM_DIV_19 + * @arg @ref LL_RCC_PLLSAIM_DIV_20 + * @arg @ref LL_RCC_PLLSAIM_DIV_21 + * @arg @ref LL_RCC_PLLSAIM_DIV_22 + * @arg @ref LL_RCC_PLLSAIM_DIV_23 + * @arg @ref LL_RCC_PLLSAIM_DIV_24 + * @arg @ref LL_RCC_PLLSAIM_DIV_25 + * @arg @ref LL_RCC_PLLSAIM_DIV_26 + * @arg @ref LL_RCC_PLLSAIM_DIV_27 + * @arg @ref LL_RCC_PLLSAIM_DIV_28 + * @arg @ref LL_RCC_PLLSAIM_DIV_29 + * @arg @ref LL_RCC_PLLSAIM_DIV_30 + * @arg @ref LL_RCC_PLLSAIM_DIV_31 + * @arg @ref LL_RCC_PLLSAIM_DIV_32 + * @arg @ref LL_RCC_PLLSAIM_DIV_33 + * @arg @ref LL_RCC_PLLSAIM_DIV_34 + * @arg @ref LL_RCC_PLLSAIM_DIV_35 + * @arg @ref LL_RCC_PLLSAIM_DIV_36 + * @arg @ref LL_RCC_PLLSAIM_DIV_37 + * @arg @ref LL_RCC_PLLSAIM_DIV_38 + * @arg @ref LL_RCC_PLLSAIM_DIV_39 + * @arg @ref LL_RCC_PLLSAIM_DIV_40 + * @arg @ref LL_RCC_PLLSAIM_DIV_41 + * @arg @ref LL_RCC_PLLSAIM_DIV_42 + * @arg @ref LL_RCC_PLLSAIM_DIV_43 + * @arg @ref LL_RCC_PLLSAIM_DIV_44 + * @arg @ref LL_RCC_PLLSAIM_DIV_45 + * @arg @ref LL_RCC_PLLSAIM_DIV_46 + * @arg @ref LL_RCC_PLLSAIM_DIV_47 + * @arg @ref LL_RCC_PLLSAIM_DIV_48 + * @arg @ref LL_RCC_PLLSAIM_DIV_49 + * @arg @ref LL_RCC_PLLSAIM_DIV_50 + * @arg @ref LL_RCC_PLLSAIM_DIV_51 + * @arg @ref LL_RCC_PLLSAIM_DIV_52 + * @arg @ref LL_RCC_PLLSAIM_DIV_53 + * @arg @ref LL_RCC_PLLSAIM_DIV_54 + * @arg @ref LL_RCC_PLLSAIM_DIV_55 + * @arg @ref LL_RCC_PLLSAIM_DIV_56 + * @arg @ref LL_RCC_PLLSAIM_DIV_57 + * @arg @ref LL_RCC_PLLSAIM_DIV_58 + * @arg @ref LL_RCC_PLLSAIM_DIV_59 + * @arg @ref LL_RCC_PLLSAIM_DIV_60 + * @arg @ref LL_RCC_PLLSAIM_DIV_61 + * @arg @ref LL_RCC_PLLSAIM_DIV_62 + * @arg @ref LL_RCC_PLLSAIM_DIV_63 + * @param __PLLSAIN__ Between 49/50(*) and 432 + * + * (*) value not defined in all devices. + * @param __PLLSAIR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIR_DIV_2 + * @arg @ref LL_RCC_PLLSAIR_DIV_3 + * @arg @ref LL_RCC_PLLSAIR_DIV_4 + * @arg @ref LL_RCC_PLLSAIR_DIV_5 + * @arg @ref LL_RCC_PLLSAIR_DIV_6 + * @arg @ref LL_RCC_PLLSAIR_DIV_7 + * @param __PLLSAIDIVR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_2 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_4 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_8 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_16 + * @retval PLLSAI clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLSAI_LTDC_FREQ(__INPUTFREQ__, __PLLM__, __PLLSAIN__, __PLLSAIR__, __PLLSAIDIVR__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLSAIN__) / \ + (((__PLLSAIR__) >> RCC_PLLSAICFGR_PLLSAIR_Pos) * (aRCC_PLLSAIDIVRPrescTable[(__PLLSAIDIVR__) >> RCC_DCKCFGR_PLLSAIDIVR_Pos]))) +#endif /* LTDC */ +#endif /* RCC_PLLSAI_SUPPORT */ + +#if defined(RCC_PLLI2S_SUPPORT) +#if defined(RCC_DCKCFGR_PLLI2SDIVQ) || defined(RCC_DCKCFGR_PLLI2SDIVR) +/** + * @brief Helper macro to calculate the PLLI2S frequency used for SAI domain + * @note ex: @ref __LL_RCC_CALC_PLLI2S_SAI_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), + * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetQ (), @ref LL_RCC_PLLI2S_GetDIVQ ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param __PLLI2SN__ Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param __PLLI2SQ_R__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SQ_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_7 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_8 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_9 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_10 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_11 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_12 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_13 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_14 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_15 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_7 (*) + * + * (*) value not defined in all devices. + * @param __PLLI2SDIVQ_R__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_1 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_7 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_8 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_9 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_10 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_11 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_12 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_13 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_14 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_15 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_16 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_17 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_18 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_19 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_20 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_21 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_22 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_23 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_24 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_25 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_26 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_27 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_28 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_29 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_30 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_31 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_32 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_1 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_7 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_8 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_9 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_10 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_11 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_12 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_13 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_14 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_15 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_16 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_17 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_18 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_19 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_20 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_21 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_22 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_23 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_24 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_25 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_26 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_27 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_28 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_29 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_30 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_31 (*) + * + * (*) value not defined in all devices. + * @retval PLLI2S clock frequency (in Hz) + */ +#if defined(RCC_DCKCFGR_PLLI2SDIVQ) +#define __LL_RCC_CALC_PLLI2S_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SQ_R__, __PLLI2SDIVQ_R__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ + (((__PLLI2SQ_R__) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos) * (((__PLLI2SDIVQ_R__) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos) + 1U))) +#else +#define __LL_RCC_CALC_PLLI2S_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SQ_R__, __PLLI2SDIVQ_R__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ + (((__PLLI2SQ_R__) >> RCC_PLLI2SCFGR_PLLI2SR_Pos) * ((__PLLI2SDIVQ_R__) >> RCC_DCKCFGR_PLLI2SDIVR_Pos))) + +#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ +#endif /* RCC_DCKCFGR_PLLI2SDIVQ || RCC_DCKCFGR_PLLI2SDIVR */ + +#if defined(SPDIFRX) +/** + * @brief Helper macro to calculate the PLLI2S frequency used on SPDIFRX domain + * @note ex: @ref __LL_RCC_CALC_PLLI2S_SPDIFRX_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), + * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetP ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param __PLLI2SN__ Between 50 and 432 + * @param __PLLI2SP__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SP_DIV_2 + * @arg @ref LL_RCC_PLLI2SP_DIV_4 + * @arg @ref LL_RCC_PLLI2SP_DIV_6 + * @arg @ref LL_RCC_PLLI2SP_DIV_8 + * @retval PLLI2S clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLI2S_SPDIFRX_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SP__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ + ((((__PLLI2SP__) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) * 2U)) + +#endif /* SPDIFRX */ + +/** + * @brief Helper macro to calculate the PLLI2S frequency used for I2S domain + * @note ex: @ref __LL_RCC_CALC_PLLI2S_I2S_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), + * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetR ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param __PLLI2SN__ Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param __PLLI2SR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SR_DIV_2 + * @arg @ref LL_RCC_PLLI2SR_DIV_3 + * @arg @ref LL_RCC_PLLI2SR_DIV_4 + * @arg @ref LL_RCC_PLLI2SR_DIV_5 + * @arg @ref LL_RCC_PLLI2SR_DIV_6 + * @arg @ref LL_RCC_PLLI2SR_DIV_7 + * @retval PLLI2S clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLI2S_I2S_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SR__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ + ((__PLLI2SR__) >> RCC_PLLI2SCFGR_PLLI2SR_Pos)) + +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) +/** + * @brief Helper macro to calculate the PLLI2S frequency used for 48Mhz domain + * @note ex: @ref __LL_RCC_CALC_PLLI2S_48M_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), + * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetQ ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param __PLLI2SN__ Between 50 and 432 + * @param __PLLI2SQ__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SQ_DIV_2 + * @arg @ref LL_RCC_PLLI2SQ_DIV_3 + * @arg @ref LL_RCC_PLLI2SQ_DIV_4 + * @arg @ref LL_RCC_PLLI2SQ_DIV_5 + * @arg @ref LL_RCC_PLLI2SQ_DIV_6 + * @arg @ref LL_RCC_PLLI2SQ_DIV_7 + * @arg @ref LL_RCC_PLLI2SQ_DIV_8 + * @arg @ref LL_RCC_PLLI2SQ_DIV_9 + * @arg @ref LL_RCC_PLLI2SQ_DIV_10 + * @arg @ref LL_RCC_PLLI2SQ_DIV_11 + * @arg @ref LL_RCC_PLLI2SQ_DIV_12 + * @arg @ref LL_RCC_PLLI2SQ_DIV_13 + * @arg @ref LL_RCC_PLLI2SQ_DIV_14 + * @arg @ref LL_RCC_PLLI2SQ_DIV_15 + * @retval PLLI2S clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLI2S_48M_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SQ__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ + ((__PLLI2SQ__) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos)) + +#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ +#endif /* RCC_PLLI2S_SUPPORT */ + +/** + * @brief Helper macro to calculate the HCLK frequency + * @param __SYSCLKFREQ__ SYSCLK frequency (based on HSE/HSI/PLLCLK) + * @param __AHBPRESCALER__ This parameter can be one of the following values: + * @arg @ref LL_RCC_SYSCLK_DIV_1 + * @arg @ref LL_RCC_SYSCLK_DIV_2 + * @arg @ref LL_RCC_SYSCLK_DIV_4 + * @arg @ref LL_RCC_SYSCLK_DIV_8 + * @arg @ref LL_RCC_SYSCLK_DIV_16 + * @arg @ref LL_RCC_SYSCLK_DIV_64 + * @arg @ref LL_RCC_SYSCLK_DIV_128 + * @arg @ref LL_RCC_SYSCLK_DIV_256 + * @arg @ref LL_RCC_SYSCLK_DIV_512 + * @retval HCLK clock frequency (in Hz) + */ +#define __LL_RCC_CALC_HCLK_FREQ(__SYSCLKFREQ__, __AHBPRESCALER__) ((__SYSCLKFREQ__) >> AHBPrescTable[((__AHBPRESCALER__) &\ + RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos]) + +/** + * @brief Helper macro to calculate the PCLK1 frequency (ABP1) + * @param __HCLKFREQ__ HCLK frequency + * @param __APB1PRESCALER__ This parameter can be one of the following values: + * @arg @ref LL_RCC_APB1_DIV_1 + * @arg @ref LL_RCC_APB1_DIV_2 + * @arg @ref LL_RCC_APB1_DIV_4 + * @arg @ref LL_RCC_APB1_DIV_8 + * @arg @ref LL_RCC_APB1_DIV_16 + * @retval PCLK1 clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PCLK1_FREQ(__HCLKFREQ__, __APB1PRESCALER__) ((__HCLKFREQ__) >> APBPrescTable[(__APB1PRESCALER__) >> RCC_CFGR_PPRE1_Pos]) + +/** + * @brief Helper macro to calculate the PCLK2 frequency (ABP2) + * @param __HCLKFREQ__ HCLK frequency + * @param __APB2PRESCALER__ This parameter can be one of the following values: + * @arg @ref LL_RCC_APB2_DIV_1 + * @arg @ref LL_RCC_APB2_DIV_2 + * @arg @ref LL_RCC_APB2_DIV_4 + * @arg @ref LL_RCC_APB2_DIV_8 + * @arg @ref LL_RCC_APB2_DIV_16 + * @retval PCLK2 clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PCLK2_FREQ(__HCLKFREQ__, __APB2PRESCALER__) ((__HCLKFREQ__) >> APBPrescTable[(__APB2PRESCALER__) >> RCC_CFGR_PPRE2_Pos]) + +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup RCC_LL_Exported_Functions RCC Exported Functions + * @{ + */ + +/** @defgroup RCC_LL_EF_HSE HSE + * @{ + */ + +/** + * @brief Enable the Clock Security System. + * @rmtoll CR CSSON LL_RCC_HSE_EnableCSS + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSE_EnableCSS(void) +{ + SET_BIT(RCC->CR, RCC_CR_CSSON); +} + +/** + * @brief Enable HSE external oscillator (HSE Bypass) + * @rmtoll CR HSEBYP LL_RCC_HSE_EnableBypass + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSE_EnableBypass(void) +{ + SET_BIT(RCC->CR, RCC_CR_HSEBYP); +} + +/** + * @brief Disable HSE external oscillator (HSE Bypass) + * @rmtoll CR HSEBYP LL_RCC_HSE_DisableBypass + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSE_DisableBypass(void) +{ + CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); +} + +/** + * @brief Enable HSE crystal oscillator (HSE ON) + * @rmtoll CR HSEON LL_RCC_HSE_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSE_Enable(void) +{ + SET_BIT(RCC->CR, RCC_CR_HSEON); +} + +/** + * @brief Disable HSE crystal oscillator (HSE ON) + * @rmtoll CR HSEON LL_RCC_HSE_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSE_Disable(void) +{ + CLEAR_BIT(RCC->CR, RCC_CR_HSEON); +} + +/** + * @brief Check if HSE oscillator Ready + * @rmtoll CR HSERDY LL_RCC_HSE_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_HSE_IsReady(void) +{ + return (READ_BIT(RCC->CR, RCC_CR_HSERDY) == (RCC_CR_HSERDY)); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_HSI HSI + * @{ + */ + +/** + * @brief Enable HSI oscillator + * @rmtoll CR HSION LL_RCC_HSI_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSI_Enable(void) +{ + SET_BIT(RCC->CR, RCC_CR_HSION); +} + +/** + * @brief Disable HSI oscillator + * @rmtoll CR HSION LL_RCC_HSI_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSI_Disable(void) +{ + CLEAR_BIT(RCC->CR, RCC_CR_HSION); +} + +/** + * @brief Check if HSI clock is ready + * @rmtoll CR HSIRDY LL_RCC_HSI_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_HSI_IsReady(void) +{ + return (READ_BIT(RCC->CR, RCC_CR_HSIRDY) == (RCC_CR_HSIRDY)); +} + +/** + * @brief Get HSI Calibration value + * @note When HSITRIM is written, HSICAL is updated with the sum of + * HSITRIM and the factory trim value + * @rmtoll CR HSICAL LL_RCC_HSI_GetCalibration + * @retval Between Min_Data = 0x00 and Max_Data = 0xFF + */ +__STATIC_INLINE uint32_t LL_RCC_HSI_GetCalibration(void) +{ + return (uint32_t)(READ_BIT(RCC->CR, RCC_CR_HSICAL) >> RCC_CR_HSICAL_Pos); +} + +/** + * @brief Set HSI Calibration trimming + * @note user-programmable trimming value that is added to the HSICAL + * @note Default value is 16, which, when added to the HSICAL value, + * should trim the HSI to 16 MHz +/- 1 % + * @rmtoll CR HSITRIM LL_RCC_HSI_SetCalibTrimming + * @param Value Between Min_Data = 0 and Max_Data = 31 + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSI_SetCalibTrimming(uint32_t Value) +{ + MODIFY_REG(RCC->CR, RCC_CR_HSITRIM, Value << RCC_CR_HSITRIM_Pos); +} + +/** + * @brief Get HSI Calibration trimming + * @rmtoll CR HSITRIM LL_RCC_HSI_GetCalibTrimming + * @retval Between Min_Data = 0 and Max_Data = 31 + */ +__STATIC_INLINE uint32_t LL_RCC_HSI_GetCalibTrimming(void) +{ + return (uint32_t)(READ_BIT(RCC->CR, RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_LSE LSE + * @{ + */ + +/** + * @brief Enable Low Speed External (LSE) crystal. + * @rmtoll BDCR LSEON LL_RCC_LSE_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_Enable(void) +{ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); +} + +/** + * @brief Disable Low Speed External (LSE) crystal. + * @rmtoll BDCR LSEON LL_RCC_LSE_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_Disable(void) +{ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEON); +} + +/** + * @brief Enable external clock source (LSE bypass). + * @rmtoll BDCR LSEBYP LL_RCC_LSE_EnableBypass + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_EnableBypass(void) +{ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); +} + +/** + * @brief Disable external clock source (LSE bypass). + * @rmtoll BDCR LSEBYP LL_RCC_LSE_DisableBypass + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_DisableBypass(void) +{ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); +} + +/** + * @brief Check if LSE oscillator Ready + * @rmtoll BDCR LSERDY LL_RCC_LSE_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_LSE_IsReady(void) +{ + return (READ_BIT(RCC->BDCR, RCC_BDCR_LSERDY) == (RCC_BDCR_LSERDY)); +} + +#if defined(RCC_BDCR_LSEMOD) +/** + * @brief Enable LSE high drive mode. + * @note LSE high drive mode can be enabled only when the LSE clock is disabled + * @rmtoll BDCR LSEMOD LL_RCC_LSE_EnableHighDriveMode + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_EnableHighDriveMode(void) +{ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); +} + +/** + * @brief Disable LSE high drive mode. + * @note LSE high drive mode can be disabled only when the LSE clock is disabled + * @rmtoll BDCR LSEMOD LL_RCC_LSE_DisableHighDriveMode + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_DisableHighDriveMode(void) +{ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); +} +#endif /* RCC_BDCR_LSEMOD */ + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_LSI LSI + * @{ + */ + +/** + * @brief Enable LSI Oscillator + * @rmtoll CSR LSION LL_RCC_LSI_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSI_Enable(void) +{ + SET_BIT(RCC->CSR, RCC_CSR_LSION); +} + +/** + * @brief Disable LSI Oscillator + * @rmtoll CSR LSION LL_RCC_LSI_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSI_Disable(void) +{ + CLEAR_BIT(RCC->CSR, RCC_CSR_LSION); +} + +/** + * @brief Check if LSI is Ready + * @rmtoll CSR LSIRDY LL_RCC_LSI_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_LSI_IsReady(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_LSIRDY) == (RCC_CSR_LSIRDY)); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_System System + * @{ + */ + +/** + * @brief Configure the system clock source + * @rmtoll CFGR SW LL_RCC_SetSysClkSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_SYS_CLKSOURCE_HSI + * @arg @ref LL_RCC_SYS_CLKSOURCE_HSE + * @arg @ref LL_RCC_SYS_CLKSOURCE_PLL + * @arg @ref LL_RCC_SYS_CLKSOURCE_PLLR (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetSysClkSource(uint32_t Source) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, Source); +} + +/** + * @brief Get the system clock source + * @rmtoll CFGR SWS LL_RCC_GetSysClkSource + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_HSI + * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_HSE + * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_PLL + * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_PLLR (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetSysClkSource(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_SWS)); +} + +/** + * @brief Set AHB prescaler + * @rmtoll CFGR HPRE LL_RCC_SetAHBPrescaler + * @param Prescaler This parameter can be one of the following values: + * @arg @ref LL_RCC_SYSCLK_DIV_1 + * @arg @ref LL_RCC_SYSCLK_DIV_2 + * @arg @ref LL_RCC_SYSCLK_DIV_4 + * @arg @ref LL_RCC_SYSCLK_DIV_8 + * @arg @ref LL_RCC_SYSCLK_DIV_16 + * @arg @ref LL_RCC_SYSCLK_DIV_64 + * @arg @ref LL_RCC_SYSCLK_DIV_128 + * @arg @ref LL_RCC_SYSCLK_DIV_256 + * @arg @ref LL_RCC_SYSCLK_DIV_512 + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetAHBPrescaler(uint32_t Prescaler) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, Prescaler); +} + +/** + * @brief Set APB1 prescaler + * @rmtoll CFGR PPRE1 LL_RCC_SetAPB1Prescaler + * @param Prescaler This parameter can be one of the following values: + * @arg @ref LL_RCC_APB1_DIV_1 + * @arg @ref LL_RCC_APB1_DIV_2 + * @arg @ref LL_RCC_APB1_DIV_4 + * @arg @ref LL_RCC_APB1_DIV_8 + * @arg @ref LL_RCC_APB1_DIV_16 + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetAPB1Prescaler(uint32_t Prescaler) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, Prescaler); +} + +/** + * @brief Set APB2 prescaler + * @rmtoll CFGR PPRE2 LL_RCC_SetAPB2Prescaler + * @param Prescaler This parameter can be one of the following values: + * @arg @ref LL_RCC_APB2_DIV_1 + * @arg @ref LL_RCC_APB2_DIV_2 + * @arg @ref LL_RCC_APB2_DIV_4 + * @arg @ref LL_RCC_APB2_DIV_8 + * @arg @ref LL_RCC_APB2_DIV_16 + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetAPB2Prescaler(uint32_t Prescaler) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, Prescaler); +} + +/** + * @brief Get AHB prescaler + * @rmtoll CFGR HPRE LL_RCC_GetAHBPrescaler + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_SYSCLK_DIV_1 + * @arg @ref LL_RCC_SYSCLK_DIV_2 + * @arg @ref LL_RCC_SYSCLK_DIV_4 + * @arg @ref LL_RCC_SYSCLK_DIV_8 + * @arg @ref LL_RCC_SYSCLK_DIV_16 + * @arg @ref LL_RCC_SYSCLK_DIV_64 + * @arg @ref LL_RCC_SYSCLK_DIV_128 + * @arg @ref LL_RCC_SYSCLK_DIV_256 + * @arg @ref LL_RCC_SYSCLK_DIV_512 + */ +__STATIC_INLINE uint32_t LL_RCC_GetAHBPrescaler(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_HPRE)); +} + +/** + * @brief Get APB1 prescaler + * @rmtoll CFGR PPRE1 LL_RCC_GetAPB1Prescaler + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_APB1_DIV_1 + * @arg @ref LL_RCC_APB1_DIV_2 + * @arg @ref LL_RCC_APB1_DIV_4 + * @arg @ref LL_RCC_APB1_DIV_8 + * @arg @ref LL_RCC_APB1_DIV_16 + */ +__STATIC_INLINE uint32_t LL_RCC_GetAPB1Prescaler(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_PPRE1)); +} + +/** + * @brief Get APB2 prescaler + * @rmtoll CFGR PPRE2 LL_RCC_GetAPB2Prescaler + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_APB2_DIV_1 + * @arg @ref LL_RCC_APB2_DIV_2 + * @arg @ref LL_RCC_APB2_DIV_4 + * @arg @ref LL_RCC_APB2_DIV_8 + * @arg @ref LL_RCC_APB2_DIV_16 + */ +__STATIC_INLINE uint32_t LL_RCC_GetAPB2Prescaler(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_PPRE2)); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_MCO MCO + * @{ + */ + +#if defined(RCC_CFGR_MCO1EN) +/** + * @brief Enable MCO1 output + * @rmtoll CFGR RCC_CFGR_MCO1EN LL_RCC_MCO1_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_MCO1_Enable(void) +{ + SET_BIT(RCC->CFGR, RCC_CFGR_MCO1EN); +} + +/** + * @brief Disable MCO1 output + * @rmtoll CFGR RCC_CFGR_MCO1EN LL_RCC_MCO1_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_MCO1_Disable(void) +{ + CLEAR_BIT(RCC->CFGR, RCC_CFGR_MCO1EN); +} +#endif /* RCC_CFGR_MCO1EN */ + +#if defined(RCC_CFGR_MCO2EN) +/** + * @brief Enable MCO2 output + * @rmtoll CFGR RCC_CFGR_MCO2EN LL_RCC_MCO2_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_MCO2_Enable(void) +{ + SET_BIT(RCC->CFGR, RCC_CFGR_MCO2EN); +} + +/** + * @brief Disable MCO2 output + * @rmtoll CFGR RCC_CFGR_MCO2EN LL_RCC_MCO2_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_MCO2_Disable(void) +{ + CLEAR_BIT(RCC->CFGR, RCC_CFGR_MCO2EN); +} +#endif /* RCC_CFGR_MCO2EN */ + +/** + * @brief Configure MCOx + * @rmtoll CFGR MCO1 LL_RCC_ConfigMCO\n + * CFGR MCO1PRE LL_RCC_ConfigMCO\n + * CFGR MCO2 LL_RCC_ConfigMCO\n + * CFGR MCO2PRE LL_RCC_ConfigMCO + * @param MCOxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_MCO1SOURCE_HSI + * @arg @ref LL_RCC_MCO1SOURCE_LSE + * @arg @ref LL_RCC_MCO1SOURCE_HSE + * @arg @ref LL_RCC_MCO1SOURCE_PLLCLK + * @arg @ref LL_RCC_MCO2SOURCE_SYSCLK + * @arg @ref LL_RCC_MCO2SOURCE_PLLI2S + * @arg @ref LL_RCC_MCO2SOURCE_HSE + * @arg @ref LL_RCC_MCO2SOURCE_PLLCLK + * @param MCOxPrescaler This parameter can be one of the following values: + * @arg @ref LL_RCC_MCO1_DIV_1 + * @arg @ref LL_RCC_MCO1_DIV_2 + * @arg @ref LL_RCC_MCO1_DIV_3 + * @arg @ref LL_RCC_MCO1_DIV_4 + * @arg @ref LL_RCC_MCO1_DIV_5 + * @arg @ref LL_RCC_MCO2_DIV_1 + * @arg @ref LL_RCC_MCO2_DIV_2 + * @arg @ref LL_RCC_MCO2_DIV_3 + * @arg @ref LL_RCC_MCO2_DIV_4 + * @arg @ref LL_RCC_MCO2_DIV_5 + * @retval None + */ +__STATIC_INLINE void LL_RCC_ConfigMCO(uint32_t MCOxSource, uint32_t MCOxPrescaler) +{ + MODIFY_REG(RCC->CFGR, (MCOxSource & 0xFFFF0000U) | (MCOxPrescaler & 0xFFFF0000U), (MCOxSource << 16U) | (MCOxPrescaler << 16U)); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_Peripheral_Clock_Source Peripheral Clock Source + * @{ + */ +#if defined(FMPI2C1) +/** + * @brief Configure FMPI2C clock source + * @rmtoll DCKCFGR2 FMPI2C1SEL LL_RCC_SetFMPI2CClockSource + * @param FMPI2CxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_PCLK1 + * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_HSI + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetFMPI2CClockSource(uint32_t FMPI2CxSource) +{ + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, FMPI2CxSource); +} +#endif /* FMPI2C1 */ + +#if defined(LPTIM1) +/** + * @brief Configure LPTIMx clock source + * @rmtoll DCKCFGR2 LPTIM1SEL LL_RCC_SetLPTIMClockSource + * @param LPTIMxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_PCLK1 + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_HSI + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSI + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSE + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetLPTIMClockSource(uint32_t LPTIMxSource) +{ + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, LPTIMxSource); +} +#endif /* LPTIM1 */ + +#if defined(SAI1) +/** + * @brief Configure SAIx clock source + * @rmtoll DCKCFGR SAI1SRC LL_RCC_SetSAIClockSource\n + * DCKCFGR SAI2SRC LL_RCC_SetSAIClockSource\n + * DCKCFGR SAI1ASRC LL_RCC_SetSAIClockSource\n + * DCKCFGR SAI1BSRC LL_RCC_SetSAIClockSource + * @param SAIxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSRC (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSRC (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSRC (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetSAIClockSource(uint32_t SAIxSource) +{ + MODIFY_REG(RCC->DCKCFGR, (SAIxSource & 0xFFFF0000U), (SAIxSource << 16U)); +} +#endif /* SAI1 */ + +#if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL) +/** + * @brief Configure SDIO clock source + * @rmtoll DCKCFGR SDIOSEL LL_RCC_SetSDIOClockSource\n + * DCKCFGR2 SDIOSEL LL_RCC_SetSDIOClockSource + * @param SDIOxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_SDIO_CLKSOURCE_PLL48CLK + * @arg @ref LL_RCC_SDIO_CLKSOURCE_SYSCLK + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetSDIOClockSource(uint32_t SDIOxSource) +{ +#if defined(RCC_DCKCFGR_SDIOSEL) + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SDIOSEL, SDIOxSource); +#else + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, SDIOxSource); +#endif /* RCC_DCKCFGR_SDIOSEL */ +} +#endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */ + +#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) +/** + * @brief Configure 48Mhz domain clock source + * @rmtoll DCKCFGR CK48MSEL LL_RCC_SetCK48MClockSource\n + * DCKCFGR2 CK48MSEL LL_RCC_SetCK48MClockSource + * @param CK48MxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLL + * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLI2S (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetCK48MClockSource(uint32_t CK48MxSource) +{ +#if defined(RCC_DCKCFGR_CK48MSEL) + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, CK48MxSource); +#else + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, CK48MxSource); +#endif /* RCC_DCKCFGR_CK48MSEL */ +} + +#if defined(RNG) +/** + * @brief Configure RNG clock source + * @rmtoll DCKCFGR CK48MSEL LL_RCC_SetRNGClockSource\n + * DCKCFGR2 CK48MSEL LL_RCC_SetRNGClockSource + * @param RNGxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_RNG_CLKSOURCE_PLL + * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLI2S (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetRNGClockSource(uint32_t RNGxSource) +{ +#if defined(RCC_DCKCFGR_CK48MSEL) + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, RNGxSource); +#else + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, RNGxSource); +#endif /* RCC_DCKCFGR_CK48MSEL */ +} +#endif /* RNG */ + +#if defined(USB_OTG_FS) || defined(USB_OTG_HS) +/** + * @brief Configure USB clock source + * @rmtoll DCKCFGR CK48MSEL LL_RCC_SetUSBClockSource\n + * DCKCFGR2 CK48MSEL LL_RCC_SetUSBClockSource + * @param USBxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_USB_CLKSOURCE_PLL + * @arg @ref LL_RCC_USB_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_USB_CLKSOURCE_PLLI2S (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetUSBClockSource(uint32_t USBxSource) +{ +#if defined(RCC_DCKCFGR_CK48MSEL) + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, USBxSource); +#else + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, USBxSource); +#endif /* RCC_DCKCFGR_CK48MSEL */ +} +#endif /* USB_OTG_FS || USB_OTG_HS */ +#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ + +#if defined(CEC) +/** + * @brief Configure CEC clock source + * @rmtoll DCKCFGR2 CECSEL LL_RCC_SetCECClockSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_CEC_CLKSOURCE_HSI_DIV488 + * @arg @ref LL_RCC_CEC_CLKSOURCE_LSE + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetCECClockSource(uint32_t Source) +{ + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CECSEL, Source); +} +#endif /* CEC */ + +/** + * @brief Configure I2S clock source + * @rmtoll CFGR I2SSRC LL_RCC_SetI2SClockSource\n + * DCKCFGR I2SSRC LL_RCC_SetI2SClockSource\n + * DCKCFGR I2S1SRC LL_RCC_SetI2SClockSource\n + * DCKCFGR I2S2SRC LL_RCC_SetI2SClockSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PIN + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLSRC (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLSRC (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetI2SClockSource(uint32_t Source) +{ +#if defined(RCC_CFGR_I2SSRC) + MODIFY_REG(RCC->CFGR, RCC_CFGR_I2SSRC, Source); +#else + MODIFY_REG(RCC->DCKCFGR, (Source & 0xFFFF0000U), (Source << 16U)); +#endif /* RCC_CFGR_I2SSRC */ +} + +#if defined(DSI) +/** + * @brief Configure DSI clock source + * @rmtoll DCKCFGR DSISEL LL_RCC_SetDSIClockSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_DSI_CLKSOURCE_PHY + * @arg @ref LL_RCC_DSI_CLKSOURCE_PLL + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetDSIClockSource(uint32_t Source) +{ + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_DSISEL, Source); +} +#endif /* DSI */ + +#if defined(DFSDM1_Channel0) +/** + * @brief Configure DFSDM Audio clock source + * @rmtoll DCKCFGR CKDFSDM1ASEL LL_RCC_SetDFSDMAudioClockSource\n + * DCKCFGR CKDFSDM2ASEL LL_RCC_SetDFSDMAudioClockSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1 + * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2 + * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1 (*) + * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetDFSDMAudioClockSource(uint32_t Source) +{ + MODIFY_REG(RCC->DCKCFGR, (Source & 0x0000FFFFU), (Source >> 16U)); +} + +/** + * @brief Configure DFSDM Kernel clock source + * @rmtoll DCKCFGR CKDFSDM1SEL LL_RCC_SetDFSDMClockSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_PCLK2 + * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_PCLK2 (*) + * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_SYSCLK (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetDFSDMClockSource(uint32_t Source) +{ + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, Source); +} +#endif /* DFSDM1_Channel0 */ + +#if defined(SPDIFRX) +/** + * @brief Configure SPDIFRX clock source + * @rmtoll DCKCFGR2 SPDIFRXSEL LL_RCC_SetSPDIFRXClockSource + * @param SPDIFRXxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLL + * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetSPDIFRXClockSource(uint32_t SPDIFRXxSource) +{ + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SPDIFRXSEL, SPDIFRXxSource); +} +#endif /* SPDIFRX */ + +#if defined(FMPI2C1) +/** + * @brief Get FMPI2C clock source + * @rmtoll DCKCFGR2 FMPI2C1SEL LL_RCC_GetFMPI2CClockSource + * @param FMPI2Cx This parameter can be one of the following values: + * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_PCLK1 + * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_HSI + */ +__STATIC_INLINE uint32_t LL_RCC_GetFMPI2CClockSource(uint32_t FMPI2Cx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, FMPI2Cx)); +} +#endif /* FMPI2C1 */ + +#if defined(LPTIM1) +/** + * @brief Get LPTIMx clock source + * @rmtoll DCKCFGR2 LPTIM1SEL LL_RCC_GetLPTIMClockSource + * @param LPTIMx This parameter can be one of the following values: + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_PCLK1 + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_HSI + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSI + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSE + */ +__STATIC_INLINE uint32_t LL_RCC_GetLPTIMClockSource(uint32_t LPTIMx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)); +} +#endif /* LPTIM1 */ + +#if defined(SAI1) +/** + * @brief Get SAIx clock source + * @rmtoll DCKCFGR SAI1SEL LL_RCC_GetSAIClockSource\n + * DCKCFGR SAI2SEL LL_RCC_GetSAIClockSource\n + * DCKCFGR SAI1ASRC LL_RCC_GetSAIClockSource\n + * DCKCFGR SAI1BSRC LL_RCC_GetSAIClockSource + * @param SAIx This parameter can be one of the following values: + * @arg @ref LL_RCC_SAI1_CLKSOURCE (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE (*) + * + * (*) value not defined in all devices. + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSRC (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSRC (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSRC (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetSAIClockSource(uint32_t SAIx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, SAIx) >> 16U | SAIx); +} +#endif /* SAI1 */ + +#if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL) +/** + * @brief Get SDIOx clock source + * @rmtoll DCKCFGR SDIOSEL LL_RCC_GetSDIOClockSource\n + * DCKCFGR2 SDIOSEL LL_RCC_GetSDIOClockSource + * @param SDIOx This parameter can be one of the following values: + * @arg @ref LL_RCC_SDIO_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_SDIO_CLKSOURCE_PLL48CLK + * @arg @ref LL_RCC_SDIO_CLKSOURCE_SYSCLK + */ +__STATIC_INLINE uint32_t LL_RCC_GetSDIOClockSource(uint32_t SDIOx) +{ +#if defined(RCC_DCKCFGR_SDIOSEL) + return (uint32_t)(READ_BIT(RCC->DCKCFGR, SDIOx)); +#else + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, SDIOx)); +#endif /* RCC_DCKCFGR_SDIOSEL */ +} +#endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */ + +#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) +/** + * @brief Get 48Mhz domain clock source + * @rmtoll DCKCFGR CK48MSEL LL_RCC_GetCK48MClockSource\n + * DCKCFGR2 CK48MSEL LL_RCC_GetCK48MClockSource + * @param CK48Mx This parameter can be one of the following values: + * @arg @ref LL_RCC_CK48M_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLL + * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLI2S (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetCK48MClockSource(uint32_t CK48Mx) +{ +#if defined(RCC_DCKCFGR_CK48MSEL) + return (uint32_t)(READ_BIT(RCC->DCKCFGR, CK48Mx)); +#else + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, CK48Mx)); +#endif /* RCC_DCKCFGR_CK48MSEL */ +} + +#if defined(RNG) +/** + * @brief Get RNGx clock source + * @rmtoll DCKCFGR CK48MSEL LL_RCC_GetRNGClockSource\n + * DCKCFGR2 CK48MSEL LL_RCC_GetRNGClockSource + * @param RNGx This parameter can be one of the following values: + * @arg @ref LL_RCC_RNG_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_RNG_CLKSOURCE_PLL + * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLI2S (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetRNGClockSource(uint32_t RNGx) +{ +#if defined(RCC_DCKCFGR_CK48MSEL) + return (uint32_t)(READ_BIT(RCC->DCKCFGR, RNGx)); +#else + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, RNGx)); +#endif /* RCC_DCKCFGR_CK48MSEL */ +} +#endif /* RNG */ + +#if defined(USB_OTG_FS) || defined(USB_OTG_HS) +/** + * @brief Get USBx clock source + * @rmtoll DCKCFGR CK48MSEL LL_RCC_GetUSBClockSource\n + * DCKCFGR2 CK48MSEL LL_RCC_GetUSBClockSource + * @param USBx This parameter can be one of the following values: + * @arg @ref LL_RCC_USB_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_USB_CLKSOURCE_PLL + * @arg @ref LL_RCC_USB_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_USB_CLKSOURCE_PLLI2S (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetUSBClockSource(uint32_t USBx) +{ +#if defined(RCC_DCKCFGR_CK48MSEL) + return (uint32_t)(READ_BIT(RCC->DCKCFGR, USBx)); +#else + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, USBx)); +#endif /* RCC_DCKCFGR_CK48MSEL */ +} +#endif /* USB_OTG_FS || USB_OTG_HS */ +#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ + +#if defined(CEC) +/** + * @brief Get CEC Clock Source + * @rmtoll DCKCFGR2 CECSEL LL_RCC_GetCECClockSource + * @param CECx This parameter can be one of the following values: + * @arg @ref LL_RCC_CEC_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_CEC_CLKSOURCE_HSI_DIV488 + * @arg @ref LL_RCC_CEC_CLKSOURCE_LSE + */ +__STATIC_INLINE uint32_t LL_RCC_GetCECClockSource(uint32_t CECx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, CECx)); +} +#endif /* CEC */ + +/** + * @brief Get I2S Clock Source + * @rmtoll CFGR I2SSRC LL_RCC_GetI2SClockSource\n + * DCKCFGR I2SSRC LL_RCC_GetI2SClockSource\n + * DCKCFGR I2S1SRC LL_RCC_GetI2SClockSource\n + * DCKCFGR I2S2SRC LL_RCC_GetI2SClockSource + * @param I2Sx This parameter can be one of the following values: + * @arg @ref LL_RCC_I2S1_CLKSOURCE + * @arg @ref LL_RCC_I2S2_CLKSOURCE (*) + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PIN + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLSRC (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLSRC (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetI2SClockSource(uint32_t I2Sx) +{ +#if defined(RCC_CFGR_I2SSRC) + return (uint32_t)(READ_BIT(RCC->CFGR, I2Sx)); +#else + return (uint32_t)(READ_BIT(RCC->DCKCFGR, I2Sx) >> 16U | I2Sx); +#endif /* RCC_CFGR_I2SSRC */ +} + +#if defined(DFSDM1_Channel0) +/** + * @brief Get DFSDM Audio Clock Source + * @rmtoll DCKCFGR CKDFSDM1ASEL LL_RCC_GetDFSDMAudioClockSource\n + * DCKCFGR CKDFSDM2ASEL LL_RCC_GetDFSDMAudioClockSource + * @param DFSDMx This parameter can be one of the following values: + * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE + * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE (*) + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1 + * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2 + * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1 (*) + * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2 (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetDFSDMAudioClockSource(uint32_t DFSDMx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, DFSDMx) << 16U | DFSDMx); +} + +/** + * @brief Get DFSDM Audio Clock Source + * @rmtoll DCKCFGR CKDFSDM1SEL LL_RCC_GetDFSDMClockSource + * @param DFSDMx This parameter can be one of the following values: + * @arg @ref LL_RCC_DFSDM1_CLKSOURCE + * @arg @ref LL_RCC_DFSDM2_CLKSOURCE (*) + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_PCLK2 + * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_PCLK2 (*) + * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_SYSCLK (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetDFSDMClockSource(uint32_t DFSDMx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, DFSDMx)); +} +#endif /* DFSDM1_Channel0 */ + +#if defined(SPDIFRX) +/** + * @brief Get SPDIFRX clock source + * @rmtoll DCKCFGR2 SPDIFRXSEL LL_RCC_GetSPDIFRXClockSource + * @param SPDIFRXx This parameter can be one of the following values: + * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLL + * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetSPDIFRXClockSource(uint32_t SPDIFRXx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, SPDIFRXx)); +} +#endif /* SPDIFRX */ + +#if defined(DSI) +/** + * @brief Get DSI Clock Source + * @rmtoll DCKCFGR DSISEL LL_RCC_GetDSIClockSource + * @param DSIx This parameter can be one of the following values: + * @arg @ref LL_RCC_DSI_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_DSI_CLKSOURCE_PHY + * @arg @ref LL_RCC_DSI_CLKSOURCE_PLL + */ +__STATIC_INLINE uint32_t LL_RCC_GetDSIClockSource(uint32_t DSIx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, DSIx)); +} +#endif /* DSI */ + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_RTC RTC + * @{ + */ + +/** + * @brief Set RTC Clock Source + * @note Once the RTC clock source has been selected, it cannot be changed anymore unless + * the Backup domain is reset, or unless a failure is detected on LSE (LSECSSD is + * set). The BDRST bit can be used to reset them. + * @rmtoll BDCR RTCSEL LL_RCC_SetRTCClockSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_RTC_CLKSOURCE_NONE + * @arg @ref LL_RCC_RTC_CLKSOURCE_LSE + * @arg @ref LL_RCC_RTC_CLKSOURCE_LSI + * @arg @ref LL_RCC_RTC_CLKSOURCE_HSE + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetRTCClockSource(uint32_t Source) +{ + MODIFY_REG(RCC->BDCR, RCC_BDCR_RTCSEL, Source); +} + +/** + * @brief Get RTC Clock Source + * @rmtoll BDCR RTCSEL LL_RCC_GetRTCClockSource + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_RTC_CLKSOURCE_NONE + * @arg @ref LL_RCC_RTC_CLKSOURCE_LSE + * @arg @ref LL_RCC_RTC_CLKSOURCE_LSI + * @arg @ref LL_RCC_RTC_CLKSOURCE_HSE + */ +__STATIC_INLINE uint32_t LL_RCC_GetRTCClockSource(void) +{ + return (uint32_t)(READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL)); +} + +/** + * @brief Enable RTC + * @rmtoll BDCR RTCEN LL_RCC_EnableRTC + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableRTC(void) +{ + SET_BIT(RCC->BDCR, RCC_BDCR_RTCEN); +} + +/** + * @brief Disable RTC + * @rmtoll BDCR RTCEN LL_RCC_DisableRTC + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableRTC(void) +{ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_RTCEN); +} + +/** + * @brief Check if RTC has been enabled or not + * @rmtoll BDCR RTCEN LL_RCC_IsEnabledRTC + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledRTC(void) +{ + return (READ_BIT(RCC->BDCR, RCC_BDCR_RTCEN) == (RCC_BDCR_RTCEN)); +} + +/** + * @brief Force the Backup domain reset + * @rmtoll BDCR BDRST LL_RCC_ForceBackupDomainReset + * @retval None + */ +__STATIC_INLINE void LL_RCC_ForceBackupDomainReset(void) +{ + SET_BIT(RCC->BDCR, RCC_BDCR_BDRST); +} + +/** + * @brief Release the Backup domain reset + * @rmtoll BDCR BDRST LL_RCC_ReleaseBackupDomainReset + * @retval None + */ +__STATIC_INLINE void LL_RCC_ReleaseBackupDomainReset(void) +{ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_BDRST); +} + +/** + * @brief Set HSE Prescalers for RTC Clock + * @rmtoll CFGR RTCPRE LL_RCC_SetRTC_HSEPrescaler + * @param Prescaler This parameter can be one of the following values: + * @arg @ref LL_RCC_RTC_NOCLOCK + * @arg @ref LL_RCC_RTC_HSE_DIV_2 + * @arg @ref LL_RCC_RTC_HSE_DIV_3 + * @arg @ref LL_RCC_RTC_HSE_DIV_4 + * @arg @ref LL_RCC_RTC_HSE_DIV_5 + * @arg @ref LL_RCC_RTC_HSE_DIV_6 + * @arg @ref LL_RCC_RTC_HSE_DIV_7 + * @arg @ref LL_RCC_RTC_HSE_DIV_8 + * @arg @ref LL_RCC_RTC_HSE_DIV_9 + * @arg @ref LL_RCC_RTC_HSE_DIV_10 + * @arg @ref LL_RCC_RTC_HSE_DIV_11 + * @arg @ref LL_RCC_RTC_HSE_DIV_12 + * @arg @ref LL_RCC_RTC_HSE_DIV_13 + * @arg @ref LL_RCC_RTC_HSE_DIV_14 + * @arg @ref LL_RCC_RTC_HSE_DIV_15 + * @arg @ref LL_RCC_RTC_HSE_DIV_16 + * @arg @ref LL_RCC_RTC_HSE_DIV_17 + * @arg @ref LL_RCC_RTC_HSE_DIV_18 + * @arg @ref LL_RCC_RTC_HSE_DIV_19 + * @arg @ref LL_RCC_RTC_HSE_DIV_20 + * @arg @ref LL_RCC_RTC_HSE_DIV_21 + * @arg @ref LL_RCC_RTC_HSE_DIV_22 + * @arg @ref LL_RCC_RTC_HSE_DIV_23 + * @arg @ref LL_RCC_RTC_HSE_DIV_24 + * @arg @ref LL_RCC_RTC_HSE_DIV_25 + * @arg @ref LL_RCC_RTC_HSE_DIV_26 + * @arg @ref LL_RCC_RTC_HSE_DIV_27 + * @arg @ref LL_RCC_RTC_HSE_DIV_28 + * @arg @ref LL_RCC_RTC_HSE_DIV_29 + * @arg @ref LL_RCC_RTC_HSE_DIV_30 + * @arg @ref LL_RCC_RTC_HSE_DIV_31 + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetRTC_HSEPrescaler(uint32_t Prescaler) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_RTCPRE, Prescaler); +} + +/** + * @brief Get HSE Prescalers for RTC Clock + * @rmtoll CFGR RTCPRE LL_RCC_GetRTC_HSEPrescaler + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_RTC_NOCLOCK + * @arg @ref LL_RCC_RTC_HSE_DIV_2 + * @arg @ref LL_RCC_RTC_HSE_DIV_3 + * @arg @ref LL_RCC_RTC_HSE_DIV_4 + * @arg @ref LL_RCC_RTC_HSE_DIV_5 + * @arg @ref LL_RCC_RTC_HSE_DIV_6 + * @arg @ref LL_RCC_RTC_HSE_DIV_7 + * @arg @ref LL_RCC_RTC_HSE_DIV_8 + * @arg @ref LL_RCC_RTC_HSE_DIV_9 + * @arg @ref LL_RCC_RTC_HSE_DIV_10 + * @arg @ref LL_RCC_RTC_HSE_DIV_11 + * @arg @ref LL_RCC_RTC_HSE_DIV_12 + * @arg @ref LL_RCC_RTC_HSE_DIV_13 + * @arg @ref LL_RCC_RTC_HSE_DIV_14 + * @arg @ref LL_RCC_RTC_HSE_DIV_15 + * @arg @ref LL_RCC_RTC_HSE_DIV_16 + * @arg @ref LL_RCC_RTC_HSE_DIV_17 + * @arg @ref LL_RCC_RTC_HSE_DIV_18 + * @arg @ref LL_RCC_RTC_HSE_DIV_19 + * @arg @ref LL_RCC_RTC_HSE_DIV_20 + * @arg @ref LL_RCC_RTC_HSE_DIV_21 + * @arg @ref LL_RCC_RTC_HSE_DIV_22 + * @arg @ref LL_RCC_RTC_HSE_DIV_23 + * @arg @ref LL_RCC_RTC_HSE_DIV_24 + * @arg @ref LL_RCC_RTC_HSE_DIV_25 + * @arg @ref LL_RCC_RTC_HSE_DIV_26 + * @arg @ref LL_RCC_RTC_HSE_DIV_27 + * @arg @ref LL_RCC_RTC_HSE_DIV_28 + * @arg @ref LL_RCC_RTC_HSE_DIV_29 + * @arg @ref LL_RCC_RTC_HSE_DIV_30 + * @arg @ref LL_RCC_RTC_HSE_DIV_31 + */ +__STATIC_INLINE uint32_t LL_RCC_GetRTC_HSEPrescaler(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_RTCPRE)); +} + +/** + * @} + */ + +#if defined(RCC_DCKCFGR_TIMPRE) +/** @defgroup RCC_LL_EF_TIM_CLOCK_PRESCALER TIM + * @{ + */ + +/** + * @brief Set Timers Clock Prescalers + * @rmtoll DCKCFGR TIMPRE LL_RCC_SetTIMPrescaler + * @param Prescaler This parameter can be one of the following values: + * @arg @ref LL_RCC_TIM_PRESCALER_TWICE + * @arg @ref LL_RCC_TIM_PRESCALER_FOUR_TIMES + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetTIMPrescaler(uint32_t Prescaler) +{ + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_TIMPRE, Prescaler); +} + +/** + * @brief Get Timers Clock Prescalers + * @rmtoll DCKCFGR TIMPRE LL_RCC_GetTIMPrescaler + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_TIM_PRESCALER_TWICE + * @arg @ref LL_RCC_TIM_PRESCALER_FOUR_TIMES + */ +__STATIC_INLINE uint32_t LL_RCC_GetTIMPrescaler(void) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_TIMPRE)); +} + +/** + * @} + */ +#endif /* RCC_DCKCFGR_TIMPRE */ + +/** @defgroup RCC_LL_EF_PLL PLL + * @{ + */ + +/** + * @brief Enable PLL + * @rmtoll CR PLLON LL_RCC_PLL_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_Enable(void) +{ + SET_BIT(RCC->CR, RCC_CR_PLLON); +} + +/** + * @brief Disable PLL + * @note Cannot be disabled if the PLL clock is used as the system clock + * @rmtoll CR PLLON LL_RCC_PLL_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_Disable(void) +{ + CLEAR_BIT(RCC->CR, RCC_CR_PLLON); +} + +/** + * @brief Check if PLL Ready + * @rmtoll CR PLLRDY LL_RCC_PLL_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_IsReady(void) +{ + return (READ_BIT(RCC->CR, RCC_CR_PLLRDY) == (RCC_CR_PLLRDY)); +} + +/** + * @brief Configure PLL used for SYSCLK Domain + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLP can be written only when PLL is disabled + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_SYS\n + * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_SYS\n + * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_SYS\n + * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_SYS\n + * PLLCFGR PLLP LL_RCC_PLL_ConfigDomain_SYS + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param PLLN Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param PLLP_R This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLP_DIV_2 + * @arg @ref LL_RCC_PLLP_DIV_4 + * @arg @ref LL_RCC_PLLP_DIV_6 + * @arg @ref LL_RCC_PLLP_DIV_8 + * @arg @ref LL_RCC_PLLR_DIV_2 (*) + * @arg @ref LL_RCC_PLLR_DIV_3 (*) + * @arg @ref LL_RCC_PLLR_DIV_4 (*) + * @arg @ref LL_RCC_PLLR_DIV_5 (*) + * @arg @ref LL_RCC_PLLR_DIV_6 (*) + * @arg @ref LL_RCC_PLLR_DIV_7 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SYS(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP_R) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN, + Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos); + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLP, PLLP_R); +#if defined(RCC_PLLR_SYSCLK_SUPPORT) + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLR, PLLP_R); +#endif /* RCC_PLLR_SYSCLK_SUPPORT */ +} + +/** + * @brief Configure PLL used for 48Mhz domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLQ can be written only when PLL is disabled + * @note This can be selected for USB, RNG, SDIO + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_48M\n + * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_48M\n + * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_48M\n + * PLLCFGR PLLQ LL_RCC_PLL_ConfigDomain_48M + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param PLLN Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param PLLQ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLQ_DIV_2 + * @arg @ref LL_RCC_PLLQ_DIV_3 + * @arg @ref LL_RCC_PLLQ_DIV_4 + * @arg @ref LL_RCC_PLLQ_DIV_5 + * @arg @ref LL_RCC_PLLQ_DIV_6 + * @arg @ref LL_RCC_PLLQ_DIV_7 + * @arg @ref LL_RCC_PLLQ_DIV_8 + * @arg @ref LL_RCC_PLLQ_DIV_9 + * @arg @ref LL_RCC_PLLQ_DIV_10 + * @arg @ref LL_RCC_PLLQ_DIV_11 + * @arg @ref LL_RCC_PLLQ_DIV_12 + * @arg @ref LL_RCC_PLLQ_DIV_13 + * @arg @ref LL_RCC_PLLQ_DIV_14 + * @arg @ref LL_RCC_PLLQ_DIV_15 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_48M(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLQ, + Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLQ); +} + +#if defined(DSI) +/** + * @brief Configure PLL used for DSI clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI are disabled + * @note PLLN/PLLR can be written only when PLL is disabled + * @note This can be selected for DSI + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_DSI\n + * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_DSI\n + * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_DSI\n + * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_DSI + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param PLLN Between 50 and 432 + * @param PLLR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_DSI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, + Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); +} +#endif /* DSI */ + +#if defined(RCC_PLLR_I2S_CLKSOURCE_SUPPORT) +/** + * @brief Configure PLL used for I2S clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI are disabled + * @note PLLN/PLLR can be written only when PLL is disabled + * @note This can be selected for I2S + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_I2S\n + * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_I2S\n + * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_I2S\n + * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_I2S + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param PLLN Between 50 and 432 + * @param PLLR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_I2S(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, + Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); +} +#endif /* RCC_PLLR_I2S_CLKSOURCE_SUPPORT */ + +#if defined(SPDIFRX) +/** + * @brief Configure PLL used for SPDIFRX clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI are disabled + * @note PLLN/PLLR can be written only when PLL is disabled + * @note This can be selected for SPDIFRX + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_SPDIFRX\n + * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_SPDIFRX\n + * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_SPDIFRX\n + * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_SPDIFRX + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param PLLN Between 50 and 432 + * @param PLLR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SPDIFRX(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, + Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); +} +#endif /* SPDIFRX */ + +#if defined(RCC_PLLCFGR_PLLR) +#if defined(SAI1) +/** + * @brief Configure PLL used for SAI clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI are disabled + * @note PLLN/PLLR can be written only when PLL is disabled + * @note This can be selected for SAI + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_SAI\n + * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_SAI\n + * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_SAI\n + * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_SAI\n + * DCKCFGR PLLDIVR LL_RCC_PLL_ConfigDomain_SAI + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param PLLN Between 50 and 432 + * @param PLLR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @param PLLDIVR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLDIVR_DIV_1 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_2 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_3 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_4 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_5 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_6 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_7 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_8 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_9 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_10 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_11 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_12 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_13 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_14 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_15 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_16 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_17 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_18 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_19 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_20 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_21 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_22 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_23 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_24 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_25 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_26 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_27 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_28 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_29 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_30 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_31 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +#if defined(RCC_DCKCFGR_PLLDIVR) +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR, + uint32_t PLLDIVR) +#else +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) +#endif /* RCC_DCKCFGR_PLLDIVR */ +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, + Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); +#if defined(RCC_DCKCFGR_PLLDIVR) + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR, PLLDIVR); +#endif /* RCC_DCKCFGR_PLLDIVR */ +} +#endif /* SAI1 */ +#endif /* RCC_PLLCFGR_PLLR */ + +/** + * @brief Configure PLL clock source + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_SetMainSource + * @param PLLSource This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_SetMainSource(uint32_t PLLSource) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, PLLSource); +} + +/** + * @brief Get the oscillator used as PLL clock source. + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_GetMainSource + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetMainSource(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC)); +} + +/** + * @brief Get Main PLL multiplication factor for VCO + * @rmtoll PLLCFGR PLLN LL_RCC_PLL_GetN + * @retval Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetN(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); +} + +/** + * @brief Get Main PLL division factor for PLLP + * @rmtoll PLLCFGR PLLP LL_RCC_PLL_GetP + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLP_DIV_2 + * @arg @ref LL_RCC_PLLP_DIV_4 + * @arg @ref LL_RCC_PLLP_DIV_6 + * @arg @ref LL_RCC_PLLP_DIV_8 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetP(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLP)); +} + +/** + * @brief Get Main PLL division factor for PLLQ + * @note used for PLL48MCLK selected for USB, RNG, SDIO (48 MHz clock) + * @rmtoll PLLCFGR PLLQ LL_RCC_PLL_GetQ + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLQ_DIV_2 + * @arg @ref LL_RCC_PLLQ_DIV_3 + * @arg @ref LL_RCC_PLLQ_DIV_4 + * @arg @ref LL_RCC_PLLQ_DIV_5 + * @arg @ref LL_RCC_PLLQ_DIV_6 + * @arg @ref LL_RCC_PLLQ_DIV_7 + * @arg @ref LL_RCC_PLLQ_DIV_8 + * @arg @ref LL_RCC_PLLQ_DIV_9 + * @arg @ref LL_RCC_PLLQ_DIV_10 + * @arg @ref LL_RCC_PLLQ_DIV_11 + * @arg @ref LL_RCC_PLLQ_DIV_12 + * @arg @ref LL_RCC_PLLQ_DIV_13 + * @arg @ref LL_RCC_PLLQ_DIV_14 + * @arg @ref LL_RCC_PLLQ_DIV_15 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetQ(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLQ)); +} + +#if defined(RCC_PLLCFGR_PLLR) +/** + * @brief Get Main PLL division factor for PLLR + * @note used for PLLCLK (system clock) + * @rmtoll PLLCFGR PLLR LL_RCC_PLL_GetR + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetR(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLR)); +} +#endif /* RCC_PLLCFGR_PLLR */ + +#if defined(RCC_DCKCFGR_PLLDIVR) +/** + * @brief Get Main PLL division factor for PLLDIVR + * @note used for PLLSAICLK (SAI1 and SAI2 clock) + * @rmtoll DCKCFGR PLLDIVR LL_RCC_PLL_GetDIVR + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLDIVR_DIV_1 + * @arg @ref LL_RCC_PLLDIVR_DIV_2 + * @arg @ref LL_RCC_PLLDIVR_DIV_3 + * @arg @ref LL_RCC_PLLDIVR_DIV_4 + * @arg @ref LL_RCC_PLLDIVR_DIV_5 + * @arg @ref LL_RCC_PLLDIVR_DIV_6 + * @arg @ref LL_RCC_PLLDIVR_DIV_7 + * @arg @ref LL_RCC_PLLDIVR_DIV_8 + * @arg @ref LL_RCC_PLLDIVR_DIV_9 + * @arg @ref LL_RCC_PLLDIVR_DIV_10 + * @arg @ref LL_RCC_PLLDIVR_DIV_11 + * @arg @ref LL_RCC_PLLDIVR_DIV_12 + * @arg @ref LL_RCC_PLLDIVR_DIV_13 + * @arg @ref LL_RCC_PLLDIVR_DIV_14 + * @arg @ref LL_RCC_PLLDIVR_DIV_15 + * @arg @ref LL_RCC_PLLDIVR_DIV_16 + * @arg @ref LL_RCC_PLLDIVR_DIV_17 + * @arg @ref LL_RCC_PLLDIVR_DIV_18 + * @arg @ref LL_RCC_PLLDIVR_DIV_19 + * @arg @ref LL_RCC_PLLDIVR_DIV_20 + * @arg @ref LL_RCC_PLLDIVR_DIV_21 + * @arg @ref LL_RCC_PLLDIVR_DIV_22 + * @arg @ref LL_RCC_PLLDIVR_DIV_23 + * @arg @ref LL_RCC_PLLDIVR_DIV_24 + * @arg @ref LL_RCC_PLLDIVR_DIV_25 + * @arg @ref LL_RCC_PLLDIVR_DIV_26 + * @arg @ref LL_RCC_PLLDIVR_DIV_27 + * @arg @ref LL_RCC_PLLDIVR_DIV_28 + * @arg @ref LL_RCC_PLLDIVR_DIV_29 + * @arg @ref LL_RCC_PLLDIVR_DIV_30 + * @arg @ref LL_RCC_PLLDIVR_DIV_31 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetDIVR(void) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR)); +} +#endif /* RCC_DCKCFGR_PLLDIVR */ + +/** + * @brief Get Division factor for the main PLL and other PLL + * @rmtoll PLLCFGR PLLM LL_RCC_PLL_GetDivider + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetDivider(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM)); +} + +/** + * @brief Configure Spread Spectrum used for PLL + * @note These bits must be written before enabling PLL + * @rmtoll SSCGR MODPER LL_RCC_PLL_ConfigSpreadSpectrum\n + * SSCGR INCSTEP LL_RCC_PLL_ConfigSpreadSpectrum\n + * SSCGR SPREADSEL LL_RCC_PLL_ConfigSpreadSpectrum + * @param Mod Between Min_Data=0 and Max_Data=8191 + * @param Inc Between Min_Data=0 and Max_Data=32767 + * @param Sel This parameter can be one of the following values: + * @arg @ref LL_RCC_SPREAD_SELECT_CENTER + * @arg @ref LL_RCC_SPREAD_SELECT_DOWN + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigSpreadSpectrum(uint32_t Mod, uint32_t Inc, uint32_t Sel) +{ + MODIFY_REG(RCC->SSCGR, RCC_SSCGR_MODPER | RCC_SSCGR_INCSTEP | RCC_SSCGR_SPREADSEL, Mod | (Inc << RCC_SSCGR_INCSTEP_Pos) | Sel); +} + +/** + * @brief Get Spread Spectrum Modulation Period for PLL + * @rmtoll SSCGR MODPER LL_RCC_PLL_GetPeriodModulation + * @retval Between Min_Data=0 and Max_Data=8191 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetPeriodModulation(void) +{ + return (uint32_t)(READ_BIT(RCC->SSCGR, RCC_SSCGR_MODPER)); +} + +/** + * @brief Get Spread Spectrum Incrementation Step for PLL + * @note Must be written before enabling PLL + * @rmtoll SSCGR INCSTEP LL_RCC_PLL_GetStepIncrementation + * @retval Between Min_Data=0 and Max_Data=32767 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetStepIncrementation(void) +{ + return (uint32_t)(READ_BIT(RCC->SSCGR, RCC_SSCGR_INCSTEP) >> RCC_SSCGR_INCSTEP_Pos); +} + +/** + * @brief Get Spread Spectrum Selection for PLL + * @note Must be written before enabling PLL + * @rmtoll SSCGR SPREADSEL LL_RCC_PLL_GetSpreadSelection + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_SPREAD_SELECT_CENTER + * @arg @ref LL_RCC_SPREAD_SELECT_DOWN + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetSpreadSelection(void) +{ + return (uint32_t)(READ_BIT(RCC->SSCGR, RCC_SSCGR_SPREADSEL)); +} + +/** + * @brief Enable Spread Spectrum for PLL. + * @rmtoll SSCGR SSCGEN LL_RCC_PLL_SpreadSpectrum_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_SpreadSpectrum_Enable(void) +{ + SET_BIT(RCC->SSCGR, RCC_SSCGR_SSCGEN); +} + +/** + * @brief Disable Spread Spectrum for PLL. + * @rmtoll SSCGR SSCGEN LL_RCC_PLL_SpreadSpectrum_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_SpreadSpectrum_Disable(void) +{ + CLEAR_BIT(RCC->SSCGR, RCC_SSCGR_SSCGEN); +} + +/** + * @} + */ + +#if defined(RCC_PLLI2S_SUPPORT) +/** @defgroup RCC_LL_EF_PLLI2S PLLI2S + * @{ + */ + +/** + * @brief Enable PLLI2S + * @rmtoll CR PLLI2SON LL_RCC_PLLI2S_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLI2S_Enable(void) +{ + SET_BIT(RCC->CR, RCC_CR_PLLI2SON); +} + +/** + * @brief Disable PLLI2S + * @rmtoll CR PLLI2SON LL_RCC_PLLI2S_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLI2S_Disable(void) +{ + CLEAR_BIT(RCC->CR, RCC_CR_PLLI2SON); +} + +/** + * @brief Check if PLLI2S Ready + * @rmtoll CR PLLI2SRDY LL_RCC_PLLI2S_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_IsReady(void) +{ + return (READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) == (RCC_CR_PLLI2SRDY)); +} + +#if (defined(RCC_DCKCFGR_PLLI2SDIVQ) || defined(RCC_DCKCFGR_PLLI2SDIVR)) +/** + * @brief Configure PLLI2S used for SAI domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLQ/PLLR can be written only when PLLI2S is disabled + * @note This can be selected for SAI + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_SAI\n + * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_ConfigDomain_SAI\n + * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_SAI\n + * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_SAI\n + * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_SAI\n + * PLLI2SCFGR PLLI2SQ LL_RCC_PLLI2S_ConfigDomain_SAI\n + * PLLI2SCFGR PLLI2SR LL_RCC_PLLI2S_ConfigDomain_SAI\n + * DCKCFGR PLLI2SDIVQ LL_RCC_PLLI2S_ConfigDomain_SAI\n + * DCKCFGR PLLI2SDIVR LL_RCC_PLLI2S_ConfigDomain_SAI + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) + * + * (*) value not defined in all devices. + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param PLLN Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param PLLQ_R This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SQ_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_7 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_8 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_9 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_10 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_11 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_12 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_13 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_14 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_15 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_7 (*) + * + * (*) value not defined in all devices. + * @param PLLDIVQ_R This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_1 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_7 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_8 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_9 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_10 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_11 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_12 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_13 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_14 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_15 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_16 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_17 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_18 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_19 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_20 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_21 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_22 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_23 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_24 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_25 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_26 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_27 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_28 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_29 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_30 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_31 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_32 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_1 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_7 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_8 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_9 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_10 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_11 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_12 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_13 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_14 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_15 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_16 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_17 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_18 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_19 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_20 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_21 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_22 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_23 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_24 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_25 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_26 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_27 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_28 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_29 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_30 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_31 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ_R, + uint32_t PLLDIVQ_R) +{ + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&RCC->PLLCFGR) + (Source & 0x80U))); + MODIFY_REG(*pReg, RCC_PLLCFGR_PLLSRC, (Source & (~0x80U))); +#if defined(RCC_PLLI2SCFGR_PLLI2SM) + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); +#else + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); +#endif /* RCC_PLLI2SCFGR_PLLI2SM */ + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos); +#if defined(RCC_DCKCFGR_PLLI2SDIVQ) + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SQ, PLLQ_R); + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ, PLLDIVQ_R); +#else + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SR, PLLQ_R); + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR, PLLDIVQ_R); +#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ +} +#endif /* RCC_DCKCFGR_PLLI2SDIVQ && RCC_DCKCFGR_PLLI2SDIVR */ + +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) +/** + * @brief Configure PLLI2S used for 48Mhz domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLQ can be written only when PLLI2S is disabled + * @note This can be selected for RNG, USB, SDIO + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_48M\n + * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_ConfigDomain_48M\n + * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_48M\n + * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_48M\n + * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_48M\n + * PLLI2SCFGR PLLI2SQ LL_RCC_PLLI2S_ConfigDomain_48M + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) + * + * (*) value not defined in all devices. + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param PLLN Between 50 and 432 + * @param PLLQ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SQ_DIV_2 + * @arg @ref LL_RCC_PLLI2SQ_DIV_3 + * @arg @ref LL_RCC_PLLI2SQ_DIV_4 + * @arg @ref LL_RCC_PLLI2SQ_DIV_5 + * @arg @ref LL_RCC_PLLI2SQ_DIV_6 + * @arg @ref LL_RCC_PLLI2SQ_DIV_7 + * @arg @ref LL_RCC_PLLI2SQ_DIV_8 + * @arg @ref LL_RCC_PLLI2SQ_DIV_9 + * @arg @ref LL_RCC_PLLI2SQ_DIV_10 + * @arg @ref LL_RCC_PLLI2SQ_DIV_11 + * @arg @ref LL_RCC_PLLI2SQ_DIV_12 + * @arg @ref LL_RCC_PLLI2SQ_DIV_13 + * @arg @ref LL_RCC_PLLI2SQ_DIV_14 + * @arg @ref LL_RCC_PLLI2SQ_DIV_15 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_48M(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ) +{ + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&RCC->PLLCFGR) + (Source & 0x80U))); + MODIFY_REG(*pReg, RCC_PLLCFGR_PLLSRC, (Source & (~0x80U))); +#if defined(RCC_PLLI2SCFGR_PLLI2SM) + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); +#else + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); +#endif /* RCC_PLLI2SCFGR_PLLI2SM */ + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN | RCC_PLLI2SCFGR_PLLI2SQ, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos | PLLQ); +} +#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ + +#if defined(SPDIFRX) +/** + * @brief Configure PLLI2S used for SPDIFRX domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLP can be written only when PLLI2S is disabled + * @note This can be selected for SPDIFRX + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n + * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n + * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n + * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n + * PLLI2SCFGR PLLI2SP LL_RCC_PLLI2S_ConfigDomain_SPDIFRX + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param PLLN Between 50 and 432 + * @param PLLP This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SP_DIV_2 + * @arg @ref LL_RCC_PLLI2SP_DIV_4 + * @arg @ref LL_RCC_PLLI2SP_DIV_6 + * @arg @ref LL_RCC_PLLI2SP_DIV_8 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_SPDIFRX(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, Source); +#if defined(RCC_PLLI2SCFGR_PLLI2SM) + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); +#else + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); +#endif /* RCC_PLLI2SCFGR_PLLI2SM */ + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN | RCC_PLLI2SCFGR_PLLI2SP, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos | PLLP); +} +#endif /* SPDIFRX */ + +/** + * @brief Configure PLLI2S used for I2S1 domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLR can be written only when PLLI2S is disabled + * @note This can be selected for I2S + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_I2S\n + * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_I2S\n + * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_ConfigDomain_I2S\n + * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_I2S\n + * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_I2S\n + * PLLI2SCFGR PLLI2SR LL_RCC_PLLI2S_ConfigDomain_I2S + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) + * + * (*) value not defined in all devices. + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param PLLN Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param PLLR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SR_DIV_2 + * @arg @ref LL_RCC_PLLI2SR_DIV_3 + * @arg @ref LL_RCC_PLLI2SR_DIV_4 + * @arg @ref LL_RCC_PLLI2SR_DIV_5 + * @arg @ref LL_RCC_PLLI2SR_DIV_6 + * @arg @ref LL_RCC_PLLI2SR_DIV_7 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_I2S(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) +{ + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&RCC->PLLCFGR) + (Source & 0x80U))); + MODIFY_REG(*pReg, RCC_PLLCFGR_PLLSRC, (Source & (~0x80U))); +#if defined(RCC_PLLI2SCFGR_PLLI2SM) + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); +#else + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); +#endif /* RCC_PLLI2SCFGR_PLLI2SM */ + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN | RCC_PLLI2SCFGR_PLLI2SR, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos | PLLR); +} + +/** + * @brief Get I2SPLL multiplication factor for VCO + * @rmtoll PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_GetN + * @retval Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetN(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); +} + +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) +/** + * @brief Get I2SPLL division factor for PLLI2SQ + * @rmtoll PLLI2SCFGR PLLI2SQ LL_RCC_PLLI2S_GetQ + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLI2SQ_DIV_2 + * @arg @ref LL_RCC_PLLI2SQ_DIV_3 + * @arg @ref LL_RCC_PLLI2SQ_DIV_4 + * @arg @ref LL_RCC_PLLI2SQ_DIV_5 + * @arg @ref LL_RCC_PLLI2SQ_DIV_6 + * @arg @ref LL_RCC_PLLI2SQ_DIV_7 + * @arg @ref LL_RCC_PLLI2SQ_DIV_8 + * @arg @ref LL_RCC_PLLI2SQ_DIV_9 + * @arg @ref LL_RCC_PLLI2SQ_DIV_10 + * @arg @ref LL_RCC_PLLI2SQ_DIV_11 + * @arg @ref LL_RCC_PLLI2SQ_DIV_12 + * @arg @ref LL_RCC_PLLI2SQ_DIV_13 + * @arg @ref LL_RCC_PLLI2SQ_DIV_14 + * @arg @ref LL_RCC_PLLI2SQ_DIV_15 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetQ(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SQ)); +} +#endif /* RCC_PLLI2SCFGR_PLLI2SQ */ + +/** + * @brief Get I2SPLL division factor for PLLI2SR + * @note used for PLLI2SCLK (I2S clock) + * @rmtoll PLLI2SCFGR PLLI2SR LL_RCC_PLLI2S_GetR + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLI2SR_DIV_2 + * @arg @ref LL_RCC_PLLI2SR_DIV_3 + * @arg @ref LL_RCC_PLLI2SR_DIV_4 + * @arg @ref LL_RCC_PLLI2SR_DIV_5 + * @arg @ref LL_RCC_PLLI2SR_DIV_6 + * @arg @ref LL_RCC_PLLI2SR_DIV_7 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetR(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SR)); +} + +#if defined(RCC_PLLI2SCFGR_PLLI2SP) +/** + * @brief Get I2SPLL division factor for PLLI2SP + * @note used for PLLSPDIFRXCLK (SPDIFRX clock) + * @rmtoll PLLI2SCFGR PLLI2SP LL_RCC_PLLI2S_GetP + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLI2SP_DIV_2 + * @arg @ref LL_RCC_PLLI2SP_DIV_4 + * @arg @ref LL_RCC_PLLI2SP_DIV_6 + * @arg @ref LL_RCC_PLLI2SP_DIV_8 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetP(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SP)); +} +#endif /* RCC_PLLI2SCFGR_PLLI2SP */ + +#if defined(RCC_DCKCFGR_PLLI2SDIVQ) +/** + * @brief Get I2SPLL division factor for PLLI2SDIVQ + * @note used PLLSAICLK selected (SAI clock) + * @rmtoll DCKCFGR PLLI2SDIVQ LL_RCC_PLLI2S_GetDIVQ + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_1 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_2 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_3 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_4 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_5 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_6 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_7 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_8 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_9 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_10 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_11 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_12 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_13 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_14 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_15 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_16 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_17 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_18 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_19 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_20 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_21 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_22 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_23 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_24 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_25 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_26 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_27 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_28 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_29 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_30 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_31 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_32 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetDIVQ(void) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ)); +} +#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ + +#if defined(RCC_DCKCFGR_PLLI2SDIVR) +/** + * @brief Get I2SPLL division factor for PLLI2SDIVR + * @note used PLLSAICLK selected (SAI clock) + * @rmtoll DCKCFGR PLLI2SDIVR LL_RCC_PLLI2S_GetDIVR + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_1 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_2 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_3 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_4 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_5 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_6 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_7 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_8 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_9 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_10 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_11 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_12 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_13 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_14 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_15 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_16 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_17 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_18 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_19 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_20 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_21 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_22 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_23 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_24 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_25 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_26 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_27 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_28 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_29 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_30 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_31 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetDIVR(void) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR)); +} +#endif /* RCC_DCKCFGR_PLLI2SDIVR */ + +/** + * @brief Get division factor for PLLI2S input clock + * @rmtoll PLLCFGR PLLM LL_RCC_PLLI2S_GetDivider\n + * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_GetDivider + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetDivider(void) +{ +#if defined(RCC_PLLI2SCFGR_PLLI2SM) + return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM)); +#else + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM)); +#endif /* RCC_PLLI2SCFGR_PLLI2SM */ +} + +/** + * @brief Get the oscillator used as PLL clock source. + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_GetMainSource\n + * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_GetMainSource + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetMainSource(void) +{ +#if defined(RCC_PLLI2SCFGR_PLLI2SSRC) + uint32_t pllsrc = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC); + uint32_t plli2sssrc0 = READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SSRC); + uint32_t plli2sssrc1 = READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SSRC) >> 15U; + return (uint32_t)(pllsrc | plli2sssrc0 | plli2sssrc1); +#else + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC)); +#endif /* RCC_PLLI2SCFGR_PLLI2SSRC */ +} + +/** + * @} + */ +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** @defgroup RCC_LL_EF_PLLSAI PLLSAI + * @{ + */ + +/** + * @brief Enable PLLSAI + * @rmtoll CR PLLSAION LL_RCC_PLLSAI_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLSAI_Enable(void) +{ + SET_BIT(RCC->CR, RCC_CR_PLLSAION); +} + +/** + * @brief Disable PLLSAI + * @rmtoll CR PLLSAION LL_RCC_PLLSAI_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLSAI_Disable(void) +{ + CLEAR_BIT(RCC->CR, RCC_CR_PLLSAION); +} + +/** + * @brief Check if PLLSAI Ready + * @rmtoll CR PLLSAIRDY LL_RCC_PLLSAI_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_IsReady(void) +{ + return (READ_BIT(RCC->CR, RCC_CR_PLLSAIRDY) == (RCC_CR_PLLSAIRDY)); +} + +/** + * @brief Configure PLLSAI used for SAI domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLQ can be written only when PLLSAI is disabled + * @note This can be selected for SAI + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLSAI_ConfigDomain_SAI\n + * PLLCFGR PLLM LL_RCC_PLLSAI_ConfigDomain_SAI\n + * PLLSAICFGR PLLSAIM LL_RCC_PLLSAI_ConfigDomain_SAI\n + * PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_ConfigDomain_SAI\n + * PLLSAICFGR PLLSAIQ LL_RCC_PLLSAI_ConfigDomain_SAI\n + * DCKCFGR PLLSAIDIVQ LL_RCC_PLLSAI_ConfigDomain_SAI + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIM_DIV_2 + * @arg @ref LL_RCC_PLLSAIM_DIV_3 + * @arg @ref LL_RCC_PLLSAIM_DIV_4 + * @arg @ref LL_RCC_PLLSAIM_DIV_5 + * @arg @ref LL_RCC_PLLSAIM_DIV_6 + * @arg @ref LL_RCC_PLLSAIM_DIV_7 + * @arg @ref LL_RCC_PLLSAIM_DIV_8 + * @arg @ref LL_RCC_PLLSAIM_DIV_9 + * @arg @ref LL_RCC_PLLSAIM_DIV_10 + * @arg @ref LL_RCC_PLLSAIM_DIV_11 + * @arg @ref LL_RCC_PLLSAIM_DIV_12 + * @arg @ref LL_RCC_PLLSAIM_DIV_13 + * @arg @ref LL_RCC_PLLSAIM_DIV_14 + * @arg @ref LL_RCC_PLLSAIM_DIV_15 + * @arg @ref LL_RCC_PLLSAIM_DIV_16 + * @arg @ref LL_RCC_PLLSAIM_DIV_17 + * @arg @ref LL_RCC_PLLSAIM_DIV_18 + * @arg @ref LL_RCC_PLLSAIM_DIV_19 + * @arg @ref LL_RCC_PLLSAIM_DIV_20 + * @arg @ref LL_RCC_PLLSAIM_DIV_21 + * @arg @ref LL_RCC_PLLSAIM_DIV_22 + * @arg @ref LL_RCC_PLLSAIM_DIV_23 + * @arg @ref LL_RCC_PLLSAIM_DIV_24 + * @arg @ref LL_RCC_PLLSAIM_DIV_25 + * @arg @ref LL_RCC_PLLSAIM_DIV_26 + * @arg @ref LL_RCC_PLLSAIM_DIV_27 + * @arg @ref LL_RCC_PLLSAIM_DIV_28 + * @arg @ref LL_RCC_PLLSAIM_DIV_29 + * @arg @ref LL_RCC_PLLSAIM_DIV_30 + * @arg @ref LL_RCC_PLLSAIM_DIV_31 + * @arg @ref LL_RCC_PLLSAIM_DIV_32 + * @arg @ref LL_RCC_PLLSAIM_DIV_33 + * @arg @ref LL_RCC_PLLSAIM_DIV_34 + * @arg @ref LL_RCC_PLLSAIM_DIV_35 + * @arg @ref LL_RCC_PLLSAIM_DIV_36 + * @arg @ref LL_RCC_PLLSAIM_DIV_37 + * @arg @ref LL_RCC_PLLSAIM_DIV_38 + * @arg @ref LL_RCC_PLLSAIM_DIV_39 + * @arg @ref LL_RCC_PLLSAIM_DIV_40 + * @arg @ref LL_RCC_PLLSAIM_DIV_41 + * @arg @ref LL_RCC_PLLSAIM_DIV_42 + * @arg @ref LL_RCC_PLLSAIM_DIV_43 + * @arg @ref LL_RCC_PLLSAIM_DIV_44 + * @arg @ref LL_RCC_PLLSAIM_DIV_45 + * @arg @ref LL_RCC_PLLSAIM_DIV_46 + * @arg @ref LL_RCC_PLLSAIM_DIV_47 + * @arg @ref LL_RCC_PLLSAIM_DIV_48 + * @arg @ref LL_RCC_PLLSAIM_DIV_49 + * @arg @ref LL_RCC_PLLSAIM_DIV_50 + * @arg @ref LL_RCC_PLLSAIM_DIV_51 + * @arg @ref LL_RCC_PLLSAIM_DIV_52 + * @arg @ref LL_RCC_PLLSAIM_DIV_53 + * @arg @ref LL_RCC_PLLSAIM_DIV_54 + * @arg @ref LL_RCC_PLLSAIM_DIV_55 + * @arg @ref LL_RCC_PLLSAIM_DIV_56 + * @arg @ref LL_RCC_PLLSAIM_DIV_57 + * @arg @ref LL_RCC_PLLSAIM_DIV_58 + * @arg @ref LL_RCC_PLLSAIM_DIV_59 + * @arg @ref LL_RCC_PLLSAIM_DIV_60 + * @arg @ref LL_RCC_PLLSAIM_DIV_61 + * @arg @ref LL_RCC_PLLSAIM_DIV_62 + * @arg @ref LL_RCC_PLLSAIM_DIV_63 + * @param PLLN Between 49/50(*) and 432 + * + * (*) value not defined in all devices. + * @param PLLQ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIQ_DIV_2 + * @arg @ref LL_RCC_PLLSAIQ_DIV_3 + * @arg @ref LL_RCC_PLLSAIQ_DIV_4 + * @arg @ref LL_RCC_PLLSAIQ_DIV_5 + * @arg @ref LL_RCC_PLLSAIQ_DIV_6 + * @arg @ref LL_RCC_PLLSAIQ_DIV_7 + * @arg @ref LL_RCC_PLLSAIQ_DIV_8 + * @arg @ref LL_RCC_PLLSAIQ_DIV_9 + * @arg @ref LL_RCC_PLLSAIQ_DIV_10 + * @arg @ref LL_RCC_PLLSAIQ_DIV_11 + * @arg @ref LL_RCC_PLLSAIQ_DIV_12 + * @arg @ref LL_RCC_PLLSAIQ_DIV_13 + * @arg @ref LL_RCC_PLLSAIQ_DIV_14 + * @arg @ref LL_RCC_PLLSAIQ_DIV_15 + * @param PLLDIVQ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_1 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_2 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_3 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_4 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_5 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_6 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_7 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_8 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_9 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_10 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_11 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_12 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_13 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_14 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_15 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_16 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_17 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_18 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_19 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_20 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_21 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_22 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_23 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_24 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_25 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_26 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_27 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_28 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_29 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_30 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_31 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_32 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLSAI_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ, + uint32_t PLLDIVQ) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, Source); +#if defined(RCC_PLLSAICFGR_PLLSAIM) + MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIM, PLLM); +#else + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); +#endif /* RCC_PLLSAICFGR_PLLSAIM */ + MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN | RCC_PLLSAICFGR_PLLSAIQ, PLLN << RCC_PLLSAICFGR_PLLSAIN_Pos | PLLQ); + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ, PLLDIVQ); +} + +#if defined(RCC_PLLSAICFGR_PLLSAIP) +/** + * @brief Configure PLLSAI used for 48Mhz domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLP can be written only when PLLSAI is disabled + * @note This can be selected for USB, RNG, SDIO + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLSAI_ConfigDomain_48M\n + * PLLCFGR PLLM LL_RCC_PLLSAI_ConfigDomain_48M\n + * PLLSAICFGR PLLSAIM LL_RCC_PLLSAI_ConfigDomain_48M\n + * PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_ConfigDomain_48M\n + * PLLSAICFGR PLLSAIP LL_RCC_PLLSAI_ConfigDomain_48M + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIM_DIV_2 + * @arg @ref LL_RCC_PLLSAIM_DIV_3 + * @arg @ref LL_RCC_PLLSAIM_DIV_4 + * @arg @ref LL_RCC_PLLSAIM_DIV_5 + * @arg @ref LL_RCC_PLLSAIM_DIV_6 + * @arg @ref LL_RCC_PLLSAIM_DIV_7 + * @arg @ref LL_RCC_PLLSAIM_DIV_8 + * @arg @ref LL_RCC_PLLSAIM_DIV_9 + * @arg @ref LL_RCC_PLLSAIM_DIV_10 + * @arg @ref LL_RCC_PLLSAIM_DIV_11 + * @arg @ref LL_RCC_PLLSAIM_DIV_12 + * @arg @ref LL_RCC_PLLSAIM_DIV_13 + * @arg @ref LL_RCC_PLLSAIM_DIV_14 + * @arg @ref LL_RCC_PLLSAIM_DIV_15 + * @arg @ref LL_RCC_PLLSAIM_DIV_16 + * @arg @ref LL_RCC_PLLSAIM_DIV_17 + * @arg @ref LL_RCC_PLLSAIM_DIV_18 + * @arg @ref LL_RCC_PLLSAIM_DIV_19 + * @arg @ref LL_RCC_PLLSAIM_DIV_20 + * @arg @ref LL_RCC_PLLSAIM_DIV_21 + * @arg @ref LL_RCC_PLLSAIM_DIV_22 + * @arg @ref LL_RCC_PLLSAIM_DIV_23 + * @arg @ref LL_RCC_PLLSAIM_DIV_24 + * @arg @ref LL_RCC_PLLSAIM_DIV_25 + * @arg @ref LL_RCC_PLLSAIM_DIV_26 + * @arg @ref LL_RCC_PLLSAIM_DIV_27 + * @arg @ref LL_RCC_PLLSAIM_DIV_28 + * @arg @ref LL_RCC_PLLSAIM_DIV_29 + * @arg @ref LL_RCC_PLLSAIM_DIV_30 + * @arg @ref LL_RCC_PLLSAIM_DIV_31 + * @arg @ref LL_RCC_PLLSAIM_DIV_32 + * @arg @ref LL_RCC_PLLSAIM_DIV_33 + * @arg @ref LL_RCC_PLLSAIM_DIV_34 + * @arg @ref LL_RCC_PLLSAIM_DIV_35 + * @arg @ref LL_RCC_PLLSAIM_DIV_36 + * @arg @ref LL_RCC_PLLSAIM_DIV_37 + * @arg @ref LL_RCC_PLLSAIM_DIV_38 + * @arg @ref LL_RCC_PLLSAIM_DIV_39 + * @arg @ref LL_RCC_PLLSAIM_DIV_40 + * @arg @ref LL_RCC_PLLSAIM_DIV_41 + * @arg @ref LL_RCC_PLLSAIM_DIV_42 + * @arg @ref LL_RCC_PLLSAIM_DIV_43 + * @arg @ref LL_RCC_PLLSAIM_DIV_44 + * @arg @ref LL_RCC_PLLSAIM_DIV_45 + * @arg @ref LL_RCC_PLLSAIM_DIV_46 + * @arg @ref LL_RCC_PLLSAIM_DIV_47 + * @arg @ref LL_RCC_PLLSAIM_DIV_48 + * @arg @ref LL_RCC_PLLSAIM_DIV_49 + * @arg @ref LL_RCC_PLLSAIM_DIV_50 + * @arg @ref LL_RCC_PLLSAIM_DIV_51 + * @arg @ref LL_RCC_PLLSAIM_DIV_52 + * @arg @ref LL_RCC_PLLSAIM_DIV_53 + * @arg @ref LL_RCC_PLLSAIM_DIV_54 + * @arg @ref LL_RCC_PLLSAIM_DIV_55 + * @arg @ref LL_RCC_PLLSAIM_DIV_56 + * @arg @ref LL_RCC_PLLSAIM_DIV_57 + * @arg @ref LL_RCC_PLLSAIM_DIV_58 + * @arg @ref LL_RCC_PLLSAIM_DIV_59 + * @arg @ref LL_RCC_PLLSAIM_DIV_60 + * @arg @ref LL_RCC_PLLSAIM_DIV_61 + * @arg @ref LL_RCC_PLLSAIM_DIV_62 + * @arg @ref LL_RCC_PLLSAIM_DIV_63 + * @param PLLN Between 50 and 432 + * @param PLLP This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIP_DIV_2 + * @arg @ref LL_RCC_PLLSAIP_DIV_4 + * @arg @ref LL_RCC_PLLSAIP_DIV_6 + * @arg @ref LL_RCC_PLLSAIP_DIV_8 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLSAI_ConfigDomain_48M(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, Source); +#if defined(RCC_PLLSAICFGR_PLLSAIM) + MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIM, PLLM); +#else + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); +#endif /* RCC_PLLSAICFGR_PLLSAIM */ + MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN | RCC_PLLSAICFGR_PLLSAIP, PLLN << RCC_PLLSAICFGR_PLLSAIN_Pos | PLLP); +} +#endif /* RCC_PLLSAICFGR_PLLSAIP */ + +#if defined(LTDC) +/** + * @brief Configure PLLSAI used for LTDC domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLR can be written only when PLLSAI is disabled + * @note This can be selected for LTDC + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLSAI_ConfigDomain_LTDC\n + * PLLCFGR PLLM LL_RCC_PLLSAI_ConfigDomain_LTDC\n + * PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_ConfigDomain_LTDC\n + * PLLSAICFGR PLLSAIR LL_RCC_PLLSAI_ConfigDomain_LTDC\n + * DCKCFGR PLLSAIDIVR LL_RCC_PLLSAI_ConfigDomain_LTDC + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIM_DIV_2 + * @arg @ref LL_RCC_PLLSAIM_DIV_3 + * @arg @ref LL_RCC_PLLSAIM_DIV_4 + * @arg @ref LL_RCC_PLLSAIM_DIV_5 + * @arg @ref LL_RCC_PLLSAIM_DIV_6 + * @arg @ref LL_RCC_PLLSAIM_DIV_7 + * @arg @ref LL_RCC_PLLSAIM_DIV_8 + * @arg @ref LL_RCC_PLLSAIM_DIV_9 + * @arg @ref LL_RCC_PLLSAIM_DIV_10 + * @arg @ref LL_RCC_PLLSAIM_DIV_11 + * @arg @ref LL_RCC_PLLSAIM_DIV_12 + * @arg @ref LL_RCC_PLLSAIM_DIV_13 + * @arg @ref LL_RCC_PLLSAIM_DIV_14 + * @arg @ref LL_RCC_PLLSAIM_DIV_15 + * @arg @ref LL_RCC_PLLSAIM_DIV_16 + * @arg @ref LL_RCC_PLLSAIM_DIV_17 + * @arg @ref LL_RCC_PLLSAIM_DIV_18 + * @arg @ref LL_RCC_PLLSAIM_DIV_19 + * @arg @ref LL_RCC_PLLSAIM_DIV_20 + * @arg @ref LL_RCC_PLLSAIM_DIV_21 + * @arg @ref LL_RCC_PLLSAIM_DIV_22 + * @arg @ref LL_RCC_PLLSAIM_DIV_23 + * @arg @ref LL_RCC_PLLSAIM_DIV_24 + * @arg @ref LL_RCC_PLLSAIM_DIV_25 + * @arg @ref LL_RCC_PLLSAIM_DIV_26 + * @arg @ref LL_RCC_PLLSAIM_DIV_27 + * @arg @ref LL_RCC_PLLSAIM_DIV_28 + * @arg @ref LL_RCC_PLLSAIM_DIV_29 + * @arg @ref LL_RCC_PLLSAIM_DIV_30 + * @arg @ref LL_RCC_PLLSAIM_DIV_31 + * @arg @ref LL_RCC_PLLSAIM_DIV_32 + * @arg @ref LL_RCC_PLLSAIM_DIV_33 + * @arg @ref LL_RCC_PLLSAIM_DIV_34 + * @arg @ref LL_RCC_PLLSAIM_DIV_35 + * @arg @ref LL_RCC_PLLSAIM_DIV_36 + * @arg @ref LL_RCC_PLLSAIM_DIV_37 + * @arg @ref LL_RCC_PLLSAIM_DIV_38 + * @arg @ref LL_RCC_PLLSAIM_DIV_39 + * @arg @ref LL_RCC_PLLSAIM_DIV_40 + * @arg @ref LL_RCC_PLLSAIM_DIV_41 + * @arg @ref LL_RCC_PLLSAIM_DIV_42 + * @arg @ref LL_RCC_PLLSAIM_DIV_43 + * @arg @ref LL_RCC_PLLSAIM_DIV_44 + * @arg @ref LL_RCC_PLLSAIM_DIV_45 + * @arg @ref LL_RCC_PLLSAIM_DIV_46 + * @arg @ref LL_RCC_PLLSAIM_DIV_47 + * @arg @ref LL_RCC_PLLSAIM_DIV_48 + * @arg @ref LL_RCC_PLLSAIM_DIV_49 + * @arg @ref LL_RCC_PLLSAIM_DIV_50 + * @arg @ref LL_RCC_PLLSAIM_DIV_51 + * @arg @ref LL_RCC_PLLSAIM_DIV_52 + * @arg @ref LL_RCC_PLLSAIM_DIV_53 + * @arg @ref LL_RCC_PLLSAIM_DIV_54 + * @arg @ref LL_RCC_PLLSAIM_DIV_55 + * @arg @ref LL_RCC_PLLSAIM_DIV_56 + * @arg @ref LL_RCC_PLLSAIM_DIV_57 + * @arg @ref LL_RCC_PLLSAIM_DIV_58 + * @arg @ref LL_RCC_PLLSAIM_DIV_59 + * @arg @ref LL_RCC_PLLSAIM_DIV_60 + * @arg @ref LL_RCC_PLLSAIM_DIV_61 + * @arg @ref LL_RCC_PLLSAIM_DIV_62 + * @arg @ref LL_RCC_PLLSAIM_DIV_63 + * @param PLLN Between 49/50(*) and 432 + * + * (*) value not defined in all devices. + * @param PLLR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIR_DIV_2 + * @arg @ref LL_RCC_PLLSAIR_DIV_3 + * @arg @ref LL_RCC_PLLSAIR_DIV_4 + * @arg @ref LL_RCC_PLLSAIR_DIV_5 + * @arg @ref LL_RCC_PLLSAIR_DIV_6 + * @arg @ref LL_RCC_PLLSAIR_DIV_7 + * @param PLLDIVR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_2 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_4 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_8 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_16 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLSAI_ConfigDomain_LTDC(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR, + uint32_t PLLDIVR) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM, Source | PLLM); + MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN | RCC_PLLSAICFGR_PLLSAIR, PLLN << RCC_PLLSAICFGR_PLLSAIN_Pos | PLLR); + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVR, PLLDIVR); +} +#endif /* LTDC */ + +/** + * @brief Get division factor for PLLSAI input clock + * @rmtoll PLLCFGR PLLM LL_RCC_PLLSAI_GetDivider\n + * PLLSAICFGR PLLSAIM LL_RCC_PLLSAI_GetDivider + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSAIM_DIV_2 + * @arg @ref LL_RCC_PLLSAIM_DIV_3 + * @arg @ref LL_RCC_PLLSAIM_DIV_4 + * @arg @ref LL_RCC_PLLSAIM_DIV_5 + * @arg @ref LL_RCC_PLLSAIM_DIV_6 + * @arg @ref LL_RCC_PLLSAIM_DIV_7 + * @arg @ref LL_RCC_PLLSAIM_DIV_8 + * @arg @ref LL_RCC_PLLSAIM_DIV_9 + * @arg @ref LL_RCC_PLLSAIM_DIV_10 + * @arg @ref LL_RCC_PLLSAIM_DIV_11 + * @arg @ref LL_RCC_PLLSAIM_DIV_12 + * @arg @ref LL_RCC_PLLSAIM_DIV_13 + * @arg @ref LL_RCC_PLLSAIM_DIV_14 + * @arg @ref LL_RCC_PLLSAIM_DIV_15 + * @arg @ref LL_RCC_PLLSAIM_DIV_16 + * @arg @ref LL_RCC_PLLSAIM_DIV_17 + * @arg @ref LL_RCC_PLLSAIM_DIV_18 + * @arg @ref LL_RCC_PLLSAIM_DIV_19 + * @arg @ref LL_RCC_PLLSAIM_DIV_20 + * @arg @ref LL_RCC_PLLSAIM_DIV_21 + * @arg @ref LL_RCC_PLLSAIM_DIV_22 + * @arg @ref LL_RCC_PLLSAIM_DIV_23 + * @arg @ref LL_RCC_PLLSAIM_DIV_24 + * @arg @ref LL_RCC_PLLSAIM_DIV_25 + * @arg @ref LL_RCC_PLLSAIM_DIV_26 + * @arg @ref LL_RCC_PLLSAIM_DIV_27 + * @arg @ref LL_RCC_PLLSAIM_DIV_28 + * @arg @ref LL_RCC_PLLSAIM_DIV_29 + * @arg @ref LL_RCC_PLLSAIM_DIV_30 + * @arg @ref LL_RCC_PLLSAIM_DIV_31 + * @arg @ref LL_RCC_PLLSAIM_DIV_32 + * @arg @ref LL_RCC_PLLSAIM_DIV_33 + * @arg @ref LL_RCC_PLLSAIM_DIV_34 + * @arg @ref LL_RCC_PLLSAIM_DIV_35 + * @arg @ref LL_RCC_PLLSAIM_DIV_36 + * @arg @ref LL_RCC_PLLSAIM_DIV_37 + * @arg @ref LL_RCC_PLLSAIM_DIV_38 + * @arg @ref LL_RCC_PLLSAIM_DIV_39 + * @arg @ref LL_RCC_PLLSAIM_DIV_40 + * @arg @ref LL_RCC_PLLSAIM_DIV_41 + * @arg @ref LL_RCC_PLLSAIM_DIV_42 + * @arg @ref LL_RCC_PLLSAIM_DIV_43 + * @arg @ref LL_RCC_PLLSAIM_DIV_44 + * @arg @ref LL_RCC_PLLSAIM_DIV_45 + * @arg @ref LL_RCC_PLLSAIM_DIV_46 + * @arg @ref LL_RCC_PLLSAIM_DIV_47 + * @arg @ref LL_RCC_PLLSAIM_DIV_48 + * @arg @ref LL_RCC_PLLSAIM_DIV_49 + * @arg @ref LL_RCC_PLLSAIM_DIV_50 + * @arg @ref LL_RCC_PLLSAIM_DIV_51 + * @arg @ref LL_RCC_PLLSAIM_DIV_52 + * @arg @ref LL_RCC_PLLSAIM_DIV_53 + * @arg @ref LL_RCC_PLLSAIM_DIV_54 + * @arg @ref LL_RCC_PLLSAIM_DIV_55 + * @arg @ref LL_RCC_PLLSAIM_DIV_56 + * @arg @ref LL_RCC_PLLSAIM_DIV_57 + * @arg @ref LL_RCC_PLLSAIM_DIV_58 + * @arg @ref LL_RCC_PLLSAIM_DIV_59 + * @arg @ref LL_RCC_PLLSAIM_DIV_60 + * @arg @ref LL_RCC_PLLSAIM_DIV_61 + * @arg @ref LL_RCC_PLLSAIM_DIV_62 + * @arg @ref LL_RCC_PLLSAIM_DIV_63 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetDivider(void) +{ +#if defined(RCC_PLLSAICFGR_PLLSAIM) + return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIM)); +#else + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM)); +#endif /* RCC_PLLSAICFGR_PLLSAIM */ +} + +/** + * @brief Get SAIPLL multiplication factor for VCO + * @rmtoll PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_GetN + * @retval Between 49/50(*) and 432 + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetN(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); +} + +/** + * @brief Get SAIPLL division factor for PLLSAIQ + * @rmtoll PLLSAICFGR PLLSAIQ LL_RCC_PLLSAI_GetQ + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSAIQ_DIV_2 + * @arg @ref LL_RCC_PLLSAIQ_DIV_3 + * @arg @ref LL_RCC_PLLSAIQ_DIV_4 + * @arg @ref LL_RCC_PLLSAIQ_DIV_5 + * @arg @ref LL_RCC_PLLSAIQ_DIV_6 + * @arg @ref LL_RCC_PLLSAIQ_DIV_7 + * @arg @ref LL_RCC_PLLSAIQ_DIV_8 + * @arg @ref LL_RCC_PLLSAIQ_DIV_9 + * @arg @ref LL_RCC_PLLSAIQ_DIV_10 + * @arg @ref LL_RCC_PLLSAIQ_DIV_11 + * @arg @ref LL_RCC_PLLSAIQ_DIV_12 + * @arg @ref LL_RCC_PLLSAIQ_DIV_13 + * @arg @ref LL_RCC_PLLSAIQ_DIV_14 + * @arg @ref LL_RCC_PLLSAIQ_DIV_15 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetQ(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIQ)); +} + +#if defined(RCC_PLLSAICFGR_PLLSAIR) +/** + * @brief Get SAIPLL division factor for PLLSAIR + * @note used for PLLSAICLK (SAI clock) + * @rmtoll PLLSAICFGR PLLSAIR LL_RCC_PLLSAI_GetR + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSAIR_DIV_2 + * @arg @ref LL_RCC_PLLSAIR_DIV_3 + * @arg @ref LL_RCC_PLLSAIR_DIV_4 + * @arg @ref LL_RCC_PLLSAIR_DIV_5 + * @arg @ref LL_RCC_PLLSAIR_DIV_6 + * @arg @ref LL_RCC_PLLSAIR_DIV_7 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetR(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIR)); +} +#endif /* RCC_PLLSAICFGR_PLLSAIR */ + +#if defined(RCC_PLLSAICFGR_PLLSAIP) +/** + * @brief Get SAIPLL division factor for PLLSAIP + * @note used for PLL48MCLK (48M domain clock) + * @rmtoll PLLSAICFGR PLLSAIP LL_RCC_PLLSAI_GetP + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSAIP_DIV_2 + * @arg @ref LL_RCC_PLLSAIP_DIV_4 + * @arg @ref LL_RCC_PLLSAIP_DIV_6 + * @arg @ref LL_RCC_PLLSAIP_DIV_8 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetP(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIP)); +} +#endif /* RCC_PLLSAICFGR_PLLSAIP */ + +/** + * @brief Get SAIPLL division factor for PLLSAIDIVQ + * @note used PLLSAICLK selected (SAI clock) + * @rmtoll DCKCFGR PLLSAIDIVQ LL_RCC_PLLSAI_GetDIVQ + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_1 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_2 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_3 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_4 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_5 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_6 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_7 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_8 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_9 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_10 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_11 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_12 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_13 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_14 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_15 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_16 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_17 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_18 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_19 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_20 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_21 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_22 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_23 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_24 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_25 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_26 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_27 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_28 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_29 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_30 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_31 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_32 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetDIVQ(void) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ)); +} + +#if defined(RCC_DCKCFGR_PLLSAIDIVR) +/** + * @brief Get SAIPLL division factor for PLLSAIDIVR + * @note used for LTDC domain clock + * @rmtoll DCKCFGR PLLSAIDIVR LL_RCC_PLLSAI_GetDIVR + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_2 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_4 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_8 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_16 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetDIVR(void) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVR)); +} +#endif /* RCC_DCKCFGR_PLLSAIDIVR */ + +/** + * @} + */ +#endif /* RCC_PLLSAI_SUPPORT */ + +/** @defgroup RCC_LL_EF_FLAG_Management FLAG Management + * @{ + */ + +/** + * @brief Clear LSI ready interrupt flag + * @rmtoll CIR LSIRDYC LL_RCC_ClearFlag_LSIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_LSIRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_LSIRDYC); +} + +/** + * @brief Clear LSE ready interrupt flag + * @rmtoll CIR LSERDYC LL_RCC_ClearFlag_LSERDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_LSERDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_LSERDYC); +} + +/** + * @brief Clear HSI ready interrupt flag + * @rmtoll CIR HSIRDYC LL_RCC_ClearFlag_HSIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_HSIRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_HSIRDYC); +} + +/** + * @brief Clear HSE ready interrupt flag + * @rmtoll CIR HSERDYC LL_RCC_ClearFlag_HSERDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_HSERDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_HSERDYC); +} + +/** + * @brief Clear PLL ready interrupt flag + * @rmtoll CIR PLLRDYC LL_RCC_ClearFlag_PLLRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_PLLRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_PLLRDYC); +} + +#if defined(RCC_PLLI2S_SUPPORT) +/** + * @brief Clear PLLI2S ready interrupt flag + * @rmtoll CIR PLLI2SRDYC LL_RCC_ClearFlag_PLLI2SRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_PLLI2SRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYC); +} + +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** + * @brief Clear PLLSAI ready interrupt flag + * @rmtoll CIR PLLSAIRDYC LL_RCC_ClearFlag_PLLSAIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_PLLSAIRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYC); +} + +#endif /* RCC_PLLSAI_SUPPORT */ + +/** + * @brief Clear Clock security system interrupt flag + * @rmtoll CIR CSSC LL_RCC_ClearFlag_HSECSS + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_HSECSS(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_CSSC); +} + +/** + * @brief Check if LSI ready interrupt occurred or not + * @rmtoll CIR LSIRDYF LL_RCC_IsActiveFlag_LSIRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_LSIRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_LSIRDYF) == (RCC_CIR_LSIRDYF)); +} + +/** + * @brief Check if LSE ready interrupt occurred or not + * @rmtoll CIR LSERDYF LL_RCC_IsActiveFlag_LSERDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_LSERDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_LSERDYF) == (RCC_CIR_LSERDYF)); +} + +/** + * @brief Check if HSI ready interrupt occurred or not + * @rmtoll CIR HSIRDYF LL_RCC_IsActiveFlag_HSIRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_HSIRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_HSIRDYF) == (RCC_CIR_HSIRDYF)); +} + +/** + * @brief Check if HSE ready interrupt occurred or not + * @rmtoll CIR HSERDYF LL_RCC_IsActiveFlag_HSERDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_HSERDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_HSERDYF) == (RCC_CIR_HSERDYF)); +} + +/** + * @brief Check if PLL ready interrupt occurred or not + * @rmtoll CIR PLLRDYF LL_RCC_IsActiveFlag_PLLRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PLLRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_PLLRDYF) == (RCC_CIR_PLLRDYF)); +} + +#if defined(RCC_PLLI2S_SUPPORT) +/** + * @brief Check if PLLI2S ready interrupt occurred or not + * @rmtoll CIR PLLI2SRDYF LL_RCC_IsActiveFlag_PLLI2SRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PLLI2SRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYF) == (RCC_CIR_PLLI2SRDYF)); +} +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** + * @brief Check if PLLSAI ready interrupt occurred or not + * @rmtoll CIR PLLSAIRDYF LL_RCC_IsActiveFlag_PLLSAIRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PLLSAIRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYF) == (RCC_CIR_PLLSAIRDYF)); +} +#endif /* RCC_PLLSAI_SUPPORT */ + +/** + * @brief Check if Clock security system interrupt occurred or not + * @rmtoll CIR CSSF LL_RCC_IsActiveFlag_HSECSS + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_HSECSS(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_CSSF) == (RCC_CIR_CSSF)); +} + +/** + * @brief Check if RCC flag Independent Watchdog reset is set or not. + * @rmtoll CSR IWDGRSTF LL_RCC_IsActiveFlag_IWDGRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_IWDGRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_IWDGRSTF) == (RCC_CSR_IWDGRSTF)); +} + +/** + * @brief Check if RCC flag Low Power reset is set or not. + * @rmtoll CSR LPWRRSTF LL_RCC_IsActiveFlag_LPWRRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_LPWRRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_LPWRRSTF) == (RCC_CSR_LPWRRSTF)); +} + +/** + * @brief Check if RCC flag Pin reset is set or not. + * @rmtoll CSR PINRSTF LL_RCC_IsActiveFlag_PINRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PINRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_PINRSTF) == (RCC_CSR_PINRSTF)); +} + +/** + * @brief Check if RCC flag POR/PDR reset is set or not. + * @rmtoll CSR PORRSTF LL_RCC_IsActiveFlag_PORRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PORRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_PORRSTF) == (RCC_CSR_PORRSTF)); +} + +/** + * @brief Check if RCC flag Software reset is set or not. + * @rmtoll CSR SFTRSTF LL_RCC_IsActiveFlag_SFTRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_SFTRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_SFTRSTF) == (RCC_CSR_SFTRSTF)); +} + +/** + * @brief Check if RCC flag Window Watchdog reset is set or not. + * @rmtoll CSR WWDGRSTF LL_RCC_IsActiveFlag_WWDGRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_WWDGRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_WWDGRSTF) == (RCC_CSR_WWDGRSTF)); +} + +#if defined(RCC_CSR_BORRSTF) +/** + * @brief Check if RCC flag BOR reset is set or not. + * @rmtoll CSR BORRSTF LL_RCC_IsActiveFlag_BORRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_BORRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_BORRSTF) == (RCC_CSR_BORRSTF)); +} +#endif /* RCC_CSR_BORRSTF */ + +/** + * @brief Set RMVF bit to clear the reset flags. + * @rmtoll CSR RMVF LL_RCC_ClearResetFlags + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearResetFlags(void) +{ + SET_BIT(RCC->CSR, RCC_CSR_RMVF); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_IT_Management IT Management + * @{ + */ + +/** + * @brief Enable LSI ready interrupt + * @rmtoll CIR LSIRDYIE LL_RCC_EnableIT_LSIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_LSIRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_LSIRDYIE); +} + +/** + * @brief Enable LSE ready interrupt + * @rmtoll CIR LSERDYIE LL_RCC_EnableIT_LSERDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_LSERDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_LSERDYIE); +} + +/** + * @brief Enable HSI ready interrupt + * @rmtoll CIR HSIRDYIE LL_RCC_EnableIT_HSIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_HSIRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_HSIRDYIE); +} + +/** + * @brief Enable HSE ready interrupt + * @rmtoll CIR HSERDYIE LL_RCC_EnableIT_HSERDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_HSERDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_HSERDYIE); +} + +/** + * @brief Enable PLL ready interrupt + * @rmtoll CIR PLLRDYIE LL_RCC_EnableIT_PLLRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_PLLRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_PLLRDYIE); +} + +#if defined(RCC_PLLI2S_SUPPORT) +/** + * @brief Enable PLLI2S ready interrupt + * @rmtoll CIR PLLI2SRDYIE LL_RCC_EnableIT_PLLI2SRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_PLLI2SRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE); +} +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** + * @brief Enable PLLSAI ready interrupt + * @rmtoll CIR PLLSAIRDYIE LL_RCC_EnableIT_PLLSAIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_PLLSAIRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE); +} +#endif /* RCC_PLLSAI_SUPPORT */ + +/** + * @brief Disable LSI ready interrupt + * @rmtoll CIR LSIRDYIE LL_RCC_DisableIT_LSIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_LSIRDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_LSIRDYIE); +} + +/** + * @brief Disable LSE ready interrupt + * @rmtoll CIR LSERDYIE LL_RCC_DisableIT_LSERDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_LSERDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_LSERDYIE); +} + +/** + * @brief Disable HSI ready interrupt + * @rmtoll CIR HSIRDYIE LL_RCC_DisableIT_HSIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_HSIRDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_HSIRDYIE); +} + +/** + * @brief Disable HSE ready interrupt + * @rmtoll CIR HSERDYIE LL_RCC_DisableIT_HSERDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_HSERDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_HSERDYIE); +} + +/** + * @brief Disable PLL ready interrupt + * @rmtoll CIR PLLRDYIE LL_RCC_DisableIT_PLLRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_PLLRDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_PLLRDYIE); +} + +#if defined(RCC_PLLI2S_SUPPORT) +/** + * @brief Disable PLLI2S ready interrupt + * @rmtoll CIR PLLI2SRDYIE LL_RCC_DisableIT_PLLI2SRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_PLLI2SRDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE); +} + +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** + * @brief Disable PLLSAI ready interrupt + * @rmtoll CIR PLLSAIRDYIE LL_RCC_DisableIT_PLLSAIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_PLLSAIRDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE); +} +#endif /* RCC_PLLSAI_SUPPORT */ + +/** + * @brief Checks if LSI ready interrupt source is enabled or disabled. + * @rmtoll CIR LSIRDYIE LL_RCC_IsEnabledIT_LSIRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_LSIRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_LSIRDYIE) == (RCC_CIR_LSIRDYIE)); +} + +/** + * @brief Checks if LSE ready interrupt source is enabled or disabled. + * @rmtoll CIR LSERDYIE LL_RCC_IsEnabledIT_LSERDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_LSERDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_LSERDYIE) == (RCC_CIR_LSERDYIE)); +} + +/** + * @brief Checks if HSI ready interrupt source is enabled or disabled. + * @rmtoll CIR HSIRDYIE LL_RCC_IsEnabledIT_HSIRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_HSIRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_HSIRDYIE) == (RCC_CIR_HSIRDYIE)); +} + +/** + * @brief Checks if HSE ready interrupt source is enabled or disabled. + * @rmtoll CIR HSERDYIE LL_RCC_IsEnabledIT_HSERDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_HSERDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_HSERDYIE) == (RCC_CIR_HSERDYIE)); +} + +/** + * @brief Checks if PLL ready interrupt source is enabled or disabled. + * @rmtoll CIR PLLRDYIE LL_RCC_IsEnabledIT_PLLRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_PLLRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_PLLRDYIE) == (RCC_CIR_PLLRDYIE)); +} + +#if defined(RCC_PLLI2S_SUPPORT) +/** + * @brief Checks if PLLI2S ready interrupt source is enabled or disabled. + * @rmtoll CIR PLLI2SRDYIE LL_RCC_IsEnabledIT_PLLI2SRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_PLLI2SRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE) == (RCC_CIR_PLLI2SRDYIE)); +} + +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** + * @brief Checks if PLLSAI ready interrupt source is enabled or disabled. + * @rmtoll CIR PLLSAIRDYIE LL_RCC_IsEnabledIT_PLLSAIRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_PLLSAIRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE) == (RCC_CIR_PLLSAIRDYIE)); +} +#endif /* RCC_PLLSAI_SUPPORT */ + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup RCC_LL_EF_Init De-initialization function + * @{ + */ +ErrorStatus LL_RCC_DeInit(void); +/** + * @} + */ + +/** @defgroup RCC_LL_EF_Get_Freq Get system and peripherals clocks frequency functions + * @{ + */ +void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *RCC_Clocks); +#if defined(FMPI2C1) +uint32_t LL_RCC_GetFMPI2CClockFreq(uint32_t FMPI2CxSource); +#endif /* FMPI2C1 */ +#if defined(LPTIM1) +uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource); +#endif /* LPTIM1 */ +#if defined(SAI1) +uint32_t LL_RCC_GetSAIClockFreq(uint32_t SAIxSource); +#endif /* SAI1 */ +#if defined(SDIO) +uint32_t LL_RCC_GetSDIOClockFreq(uint32_t SDIOxSource); +#endif /* SDIO */ +#if defined(RNG) +uint32_t LL_RCC_GetRNGClockFreq(uint32_t RNGxSource); +#endif /* RNG */ +#if defined(USB_OTG_FS) || defined(USB_OTG_HS) +uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource); +#endif /* USB_OTG_FS || USB_OTG_HS */ +#if defined(DFSDM1_Channel0) +uint32_t LL_RCC_GetDFSDMClockFreq(uint32_t DFSDMxSource); +uint32_t LL_RCC_GetDFSDMAudioClockFreq(uint32_t DFSDMxSource); +#endif /* DFSDM1_Channel0 */ +uint32_t LL_RCC_GetI2SClockFreq(uint32_t I2SxSource); +#if defined(CEC) +uint32_t LL_RCC_GetCECClockFreq(uint32_t CECxSource); +#endif /* CEC */ +#if defined(LTDC) +uint32_t LL_RCC_GetLTDCClockFreq(uint32_t LTDCxSource); +#endif /* LTDC */ +#if defined(SPDIFRX) +uint32_t LL_RCC_GetSPDIFRXClockFreq(uint32_t SPDIFRXxSource); +#endif /* SPDIFRX */ +#if defined(DSI) +uint32_t LL_RCC_GetDSIClockFreq(uint32_t DSIxSource); +#endif /* DSI */ +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined(RCC) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_RCC_H */ + diff --git a/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_spi.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_spi.h new file mode 100644 index 0000000..164cbb9 --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_spi.h @@ -0,0 +1,2042 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_spi.h + * @author MCD Application Team + * @brief Header file of SPI LL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32F4xx_LL_SPI_H +#define STM32F4xx_LL_SPI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (SPI1) || defined (SPI2) || defined (SPI3) || defined (SPI4) || defined (SPI5) || defined(SPI6) + +/** @defgroup SPI_LL SPI + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup SPI_LL_ES_INIT SPI Exported Init structure + * @{ + */ + +/** + * @brief SPI Init structures definition + */ +typedef struct +{ + uint32_t TransferDirection; /*!< Specifies the SPI unidirectional or bidirectional data mode. + This parameter can be a value of @ref SPI_LL_EC_TRANSFER_MODE. + + This feature can be modified afterwards using unitary + function @ref LL_SPI_SetTransferDirection().*/ + + uint32_t Mode; /*!< Specifies the SPI mode (Master/Slave). + This parameter can be a value of @ref SPI_LL_EC_MODE. + + This feature can be modified afterwards using unitary + function @ref LL_SPI_SetMode().*/ + + uint32_t DataWidth; /*!< Specifies the SPI data width. + This parameter can be a value of @ref SPI_LL_EC_DATAWIDTH. + + This feature can be modified afterwards using unitary + function @ref LL_SPI_SetDataWidth().*/ + + uint32_t ClockPolarity; /*!< Specifies the serial clock steady state. + This parameter can be a value of @ref SPI_LL_EC_POLARITY. + + This feature can be modified afterwards using unitary + function @ref LL_SPI_SetClockPolarity().*/ + + uint32_t ClockPhase; /*!< Specifies the clock active edge for the bit capture. + This parameter can be a value of @ref SPI_LL_EC_PHASE. + + This feature can be modified afterwards using unitary + function @ref LL_SPI_SetClockPhase().*/ + + uint32_t NSS; /*!< Specifies whether the NSS signal is managed by hardware (NSS pin) + or by software using the SSI bit. + This parameter can be a value of @ref SPI_LL_EC_NSS_MODE. + + This feature can be modified afterwards using unitary + function @ref LL_SPI_SetNSSMode().*/ + + uint32_t BaudRate; /*!< Specifies the BaudRate prescaler value which will be used + to configure the transmit and receive SCK clock. + This parameter can be a value of @ref SPI_LL_EC_BAUDRATEPRESCALER. + @note The communication clock is derived from the master clock. + The slave clock does not need to be set. + + This feature can be modified afterwards using unitary + function @ref LL_SPI_SetBaudRatePrescaler().*/ + + uint32_t BitOrder; /*!< Specifies whether data transfers start from MSB or LSB bit. + This parameter can be a value of @ref SPI_LL_EC_BIT_ORDER. + + This feature can be modified afterwards using unitary + function @ref LL_SPI_SetTransferBitOrder().*/ + + uint32_t CRCCalculation; /*!< Specifies if the CRC calculation is enabled or not. + This parameter can be a value of @ref SPI_LL_EC_CRC_CALCULATION. + + This feature can be modified afterwards using unitary + functions @ref LL_SPI_EnableCRC() and @ref LL_SPI_DisableCRC().*/ + + uint32_t CRCPoly; /*!< Specifies the polynomial used for the CRC calculation. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFFFF. + + This feature can be modified afterwards using unitary + function @ref LL_SPI_SetCRCPolynomial().*/ + +} LL_SPI_InitTypeDef; + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup SPI_LL_Exported_Constants SPI Exported Constants + * @{ + */ + +/** @defgroup SPI_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_SPI_ReadReg function + * @{ + */ +#define LL_SPI_SR_RXNE SPI_SR_RXNE /*!< Rx buffer not empty flag */ +#define LL_SPI_SR_TXE SPI_SR_TXE /*!< Tx buffer empty flag */ +#define LL_SPI_SR_BSY SPI_SR_BSY /*!< Busy flag */ +#define LL_SPI_SR_CRCERR SPI_SR_CRCERR /*!< CRC error flag */ +#define LL_SPI_SR_MODF SPI_SR_MODF /*!< Mode fault flag */ +#define LL_SPI_SR_OVR SPI_SR_OVR /*!< Overrun flag */ +#define LL_SPI_SR_FRE SPI_SR_FRE /*!< TI mode frame format error flag */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_SPI_ReadReg and LL_SPI_WriteReg functions + * @{ + */ +#define LL_SPI_CR2_RXNEIE SPI_CR2_RXNEIE /*!< Rx buffer not empty interrupt enable */ +#define LL_SPI_CR2_TXEIE SPI_CR2_TXEIE /*!< Tx buffer empty interrupt enable */ +#define LL_SPI_CR2_ERRIE SPI_CR2_ERRIE /*!< Error interrupt enable */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_MODE Operation Mode + * @{ + */ +#define LL_SPI_MODE_MASTER (SPI_CR1_MSTR | SPI_CR1_SSI) /*!< Master configuration */ +#define LL_SPI_MODE_SLAVE 0x00000000U /*!< Slave configuration */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_PROTOCOL Serial Protocol + * @{ + */ +#define LL_SPI_PROTOCOL_MOTOROLA 0x00000000U /*!< Motorola mode. Used as default value */ +#define LL_SPI_PROTOCOL_TI (SPI_CR2_FRF) /*!< TI mode */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_PHASE Clock Phase + * @{ + */ +#define LL_SPI_PHASE_1EDGE 0x00000000U /*!< First clock transition is the first data capture edge */ +#define LL_SPI_PHASE_2EDGE (SPI_CR1_CPHA) /*!< Second clock transition is the first data capture edge */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_POLARITY Clock Polarity + * @{ + */ +#define LL_SPI_POLARITY_LOW 0x00000000U /*!< Clock to 0 when idle */ +#define LL_SPI_POLARITY_HIGH (SPI_CR1_CPOL) /*!< Clock to 1 when idle */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_BAUDRATEPRESCALER Baud Rate Prescaler + * @{ + */ +#define LL_SPI_BAUDRATEPRESCALER_DIV2 0x00000000U /*!< BaudRate control equal to fPCLK/2 */ +#define LL_SPI_BAUDRATEPRESCALER_DIV4 (SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/4 */ +#define LL_SPI_BAUDRATEPRESCALER_DIV8 (SPI_CR1_BR_1) /*!< BaudRate control equal to fPCLK/8 */ +#define LL_SPI_BAUDRATEPRESCALER_DIV16 (SPI_CR1_BR_1 | SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/16 */ +#define LL_SPI_BAUDRATEPRESCALER_DIV32 (SPI_CR1_BR_2) /*!< BaudRate control equal to fPCLK/32 */ +#define LL_SPI_BAUDRATEPRESCALER_DIV64 (SPI_CR1_BR_2 | SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/64 */ +#define LL_SPI_BAUDRATEPRESCALER_DIV128 (SPI_CR1_BR_2 | SPI_CR1_BR_1) /*!< BaudRate control equal to fPCLK/128 */ +#define LL_SPI_BAUDRATEPRESCALER_DIV256 (SPI_CR1_BR_2 | SPI_CR1_BR_1 | SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/256 */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_BIT_ORDER Transmission Bit Order + * @{ + */ +#define LL_SPI_LSB_FIRST (SPI_CR1_LSBFIRST) /*!< Data is transmitted/received with the LSB first */ +#define LL_SPI_MSB_FIRST 0x00000000U /*!< Data is transmitted/received with the MSB first */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_TRANSFER_MODE Transfer Mode + * @{ + */ +#define LL_SPI_FULL_DUPLEX 0x00000000U /*!< Full-Duplex mode. Rx and Tx transfer on 2 lines */ +#define LL_SPI_SIMPLEX_RX (SPI_CR1_RXONLY) /*!< Simplex Rx mode. Rx transfer only on 1 line */ +#define LL_SPI_HALF_DUPLEX_RX (SPI_CR1_BIDIMODE) /*!< Half-Duplex Rx mode. Rx transfer on 1 line */ +#define LL_SPI_HALF_DUPLEX_TX (SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE) /*!< Half-Duplex Tx mode. Tx transfer on 1 line */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_NSS_MODE Slave Select Pin Mode + * @{ + */ +#define LL_SPI_NSS_SOFT (SPI_CR1_SSM) /*!< NSS managed internally. NSS pin not used and free */ +#define LL_SPI_NSS_HARD_INPUT 0x00000000U /*!< NSS pin used in Input. Only used in Master mode */ +#define LL_SPI_NSS_HARD_OUTPUT (((uint32_t)SPI_CR2_SSOE << 16U)) /*!< NSS pin used in Output. Only used in Slave mode as chip select */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_DATAWIDTH Datawidth + * @{ + */ +#define LL_SPI_DATAWIDTH_8BIT 0x00000000U /*!< Data length for SPI transfer: 8 bits */ +#define LL_SPI_DATAWIDTH_16BIT (SPI_CR1_DFF) /*!< Data length for SPI transfer: 16 bits */ +/** + * @} + */ +#if defined(USE_FULL_LL_DRIVER) + +/** @defgroup SPI_LL_EC_CRC_CALCULATION CRC Calculation + * @{ + */ +#define LL_SPI_CRCCALCULATION_DISABLE 0x00000000U /*!< CRC calculation disabled */ +#define LL_SPI_CRCCALCULATION_ENABLE (SPI_CR1_CRCEN) /*!< CRC calculation enabled */ +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup SPI_LL_Exported_Macros SPI Exported Macros + * @{ + */ + +/** @defgroup SPI_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in SPI register + * @param __INSTANCE__ SPI Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_SPI_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in SPI register + * @param __INSTANCE__ SPI Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_SPI_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup SPI_LL_Exported_Functions SPI Exported Functions + * @{ + */ + +/** @defgroup SPI_LL_EF_Configuration Configuration + * @{ + */ + +/** + * @brief Enable SPI peripheral + * @rmtoll CR1 SPE LL_SPI_Enable + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_Enable(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR1, SPI_CR1_SPE); +} + +/** + * @brief Disable SPI peripheral + * @note When disabling the SPI, follow the procedure described in the Reference Manual. + * @rmtoll CR1 SPE LL_SPI_Disable + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_Disable(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->CR1, SPI_CR1_SPE); +} + +/** + * @brief Check if SPI peripheral is enabled + * @rmtoll CR1 SPE LL_SPI_IsEnabled + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsEnabled(const SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->CR1, SPI_CR1_SPE) == (SPI_CR1_SPE)) ? 1UL : 0UL); +} + +/** + * @brief Set SPI operation mode to Master or Slave + * @note This bit should not be changed when communication is ongoing. + * @rmtoll CR1 MSTR LL_SPI_SetMode\n + * CR1 SSI LL_SPI_SetMode + * @param SPIx SPI Instance + * @param Mode This parameter can be one of the following values: + * @arg @ref LL_SPI_MODE_MASTER + * @arg @ref LL_SPI_MODE_SLAVE + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetMode(SPI_TypeDef *SPIx, uint32_t Mode) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_MSTR | SPI_CR1_SSI, Mode); +} + +/** + * @brief Get SPI operation mode (Master or Slave) + * @rmtoll CR1 MSTR LL_SPI_GetMode\n + * CR1 SSI LL_SPI_GetMode + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_MODE_MASTER + * @arg @ref LL_SPI_MODE_SLAVE + */ +__STATIC_INLINE uint32_t LL_SPI_GetMode(const SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_MSTR | SPI_CR1_SSI)); +} + +/** + * @brief Set serial protocol used + * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. + * @rmtoll CR2 FRF LL_SPI_SetStandard + * @param SPIx SPI Instance + * @param Standard This parameter can be one of the following values: + * @arg @ref LL_SPI_PROTOCOL_MOTOROLA + * @arg @ref LL_SPI_PROTOCOL_TI + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetStandard(SPI_TypeDef *SPIx, uint32_t Standard) +{ + MODIFY_REG(SPIx->CR2, SPI_CR2_FRF, Standard); +} + +/** + * @brief Get serial protocol used + * @rmtoll CR2 FRF LL_SPI_GetStandard + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_PROTOCOL_MOTOROLA + * @arg @ref LL_SPI_PROTOCOL_TI + */ +__STATIC_INLINE uint32_t LL_SPI_GetStandard(const SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR2, SPI_CR2_FRF)); +} + +/** + * @brief Set clock phase + * @note This bit should not be changed when communication is ongoing. + * This bit is not used in SPI TI mode. + * @rmtoll CR1 CPHA LL_SPI_SetClockPhase + * @param SPIx SPI Instance + * @param ClockPhase This parameter can be one of the following values: + * @arg @ref LL_SPI_PHASE_1EDGE + * @arg @ref LL_SPI_PHASE_2EDGE + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetClockPhase(SPI_TypeDef *SPIx, uint32_t ClockPhase) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_CPHA, ClockPhase); +} + +/** + * @brief Get clock phase + * @rmtoll CR1 CPHA LL_SPI_GetClockPhase + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_PHASE_1EDGE + * @arg @ref LL_SPI_PHASE_2EDGE + */ +__STATIC_INLINE uint32_t LL_SPI_GetClockPhase(const SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_CPHA)); +} + +/** + * @brief Set clock polarity + * @note This bit should not be changed when communication is ongoing. + * This bit is not used in SPI TI mode. + * @rmtoll CR1 CPOL LL_SPI_SetClockPolarity + * @param SPIx SPI Instance + * @param ClockPolarity This parameter can be one of the following values: + * @arg @ref LL_SPI_POLARITY_LOW + * @arg @ref LL_SPI_POLARITY_HIGH + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetClockPolarity(SPI_TypeDef *SPIx, uint32_t ClockPolarity) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_CPOL, ClockPolarity); +} + +/** + * @brief Get clock polarity + * @rmtoll CR1 CPOL LL_SPI_GetClockPolarity + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_POLARITY_LOW + * @arg @ref LL_SPI_POLARITY_HIGH + */ +__STATIC_INLINE uint32_t LL_SPI_GetClockPolarity(const SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_CPOL)); +} + +/** + * @brief Set baud rate prescaler + * @note These bits should not be changed when communication is ongoing. SPI BaudRate = fPCLK/Prescaler. + * @rmtoll CR1 BR LL_SPI_SetBaudRatePrescaler + * @param SPIx SPI Instance + * @param BaudRate This parameter can be one of the following values: + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV2 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV4 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV8 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV16 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV32 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV64 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV128 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV256 + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetBaudRatePrescaler(SPI_TypeDef *SPIx, uint32_t BaudRate) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_BR, BaudRate); +} + +/** + * @brief Get baud rate prescaler + * @rmtoll CR1 BR LL_SPI_GetBaudRatePrescaler + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV2 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV4 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV8 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV16 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV32 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV64 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV128 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV256 + */ +__STATIC_INLINE uint32_t LL_SPI_GetBaudRatePrescaler(const SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_BR)); +} + +/** + * @brief Set transfer bit order + * @note This bit should not be changed when communication is ongoing. This bit is not used in SPI TI mode. + * @rmtoll CR1 LSBFIRST LL_SPI_SetTransferBitOrder + * @param SPIx SPI Instance + * @param BitOrder This parameter can be one of the following values: + * @arg @ref LL_SPI_LSB_FIRST + * @arg @ref LL_SPI_MSB_FIRST + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetTransferBitOrder(SPI_TypeDef *SPIx, uint32_t BitOrder) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_LSBFIRST, BitOrder); +} + +/** + * @brief Get transfer bit order + * @rmtoll CR1 LSBFIRST LL_SPI_GetTransferBitOrder + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_LSB_FIRST + * @arg @ref LL_SPI_MSB_FIRST + */ +__STATIC_INLINE uint32_t LL_SPI_GetTransferBitOrder(const SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_LSBFIRST)); +} + +/** + * @brief Set transfer direction mode + * @note For Half-Duplex mode, Rx Direction is set by default. + * In master mode, the MOSI pin is used and in slave mode, the MISO pin is used for Half-Duplex. + * @rmtoll CR1 RXONLY LL_SPI_SetTransferDirection\n + * CR1 BIDIMODE LL_SPI_SetTransferDirection\n + * CR1 BIDIOE LL_SPI_SetTransferDirection + * @param SPIx SPI Instance + * @param TransferDirection This parameter can be one of the following values: + * @arg @ref LL_SPI_FULL_DUPLEX + * @arg @ref LL_SPI_SIMPLEX_RX + * @arg @ref LL_SPI_HALF_DUPLEX_RX + * @arg @ref LL_SPI_HALF_DUPLEX_TX + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetTransferDirection(SPI_TypeDef *SPIx, uint32_t TransferDirection) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_RXONLY | SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE, TransferDirection); +} + +/** + * @brief Get transfer direction mode + * @rmtoll CR1 RXONLY LL_SPI_GetTransferDirection\n + * CR1 BIDIMODE LL_SPI_GetTransferDirection\n + * CR1 BIDIOE LL_SPI_GetTransferDirection + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_FULL_DUPLEX + * @arg @ref LL_SPI_SIMPLEX_RX + * @arg @ref LL_SPI_HALF_DUPLEX_RX + * @arg @ref LL_SPI_HALF_DUPLEX_TX + */ +__STATIC_INLINE uint32_t LL_SPI_GetTransferDirection(const SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_RXONLY | SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE)); +} + +/** + * @brief Set frame data width + * @rmtoll CR1 DFF LL_SPI_SetDataWidth + * @param SPIx SPI Instance + * @param DataWidth This parameter can be one of the following values: + * @arg @ref LL_SPI_DATAWIDTH_8BIT + * @arg @ref LL_SPI_DATAWIDTH_16BIT + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetDataWidth(SPI_TypeDef *SPIx, uint32_t DataWidth) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_DFF, DataWidth); +} + +/** + * @brief Get frame data width + * @rmtoll CR1 DFF LL_SPI_GetDataWidth + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_DATAWIDTH_8BIT + * @arg @ref LL_SPI_DATAWIDTH_16BIT + */ +__STATIC_INLINE uint32_t LL_SPI_GetDataWidth(const SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_DFF)); +} + +/** + * @} + */ + +/** @defgroup SPI_LL_EF_CRC_Management CRC Management + * @{ + */ + +/** + * @brief Enable CRC + * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. + * @rmtoll CR1 CRCEN LL_SPI_EnableCRC + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_EnableCRC(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR1, SPI_CR1_CRCEN); +} + +/** + * @brief Disable CRC + * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. + * @rmtoll CR1 CRCEN LL_SPI_DisableCRC + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_DisableCRC(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->CR1, SPI_CR1_CRCEN); +} + +/** + * @brief Check if CRC is enabled + * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. + * @rmtoll CR1 CRCEN LL_SPI_IsEnabledCRC + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsEnabledCRC(const SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->CR1, SPI_CR1_CRCEN) == (SPI_CR1_CRCEN)) ? 1UL : 0UL); +} + +/** + * @brief Set CRCNext to transfer CRC on the line + * @note This bit has to be written as soon as the last data is written in the SPIx_DR register. + * @rmtoll CR1 CRCNEXT LL_SPI_SetCRCNext + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetCRCNext(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR1, SPI_CR1_CRCNEXT); +} + +/** + * @brief Set polynomial for CRC calculation + * @rmtoll CRCPR CRCPOLY LL_SPI_SetCRCPolynomial + * @param SPIx SPI Instance + * @param CRCPoly This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFFFF + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetCRCPolynomial(SPI_TypeDef *SPIx, uint32_t CRCPoly) +{ + WRITE_REG(SPIx->CRCPR, (uint16_t)CRCPoly); +} + +/** + * @brief Get polynomial for CRC calculation + * @rmtoll CRCPR CRCPOLY LL_SPI_GetCRCPolynomial + * @param SPIx SPI Instance + * @retval Returned value is a number between Min_Data = 0x00 and Max_Data = 0xFFFF + */ +__STATIC_INLINE uint32_t LL_SPI_GetCRCPolynomial(const SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_REG(SPIx->CRCPR)); +} + +/** + * @brief Get Rx CRC + * @rmtoll RXCRCR RXCRC LL_SPI_GetRxCRC + * @param SPIx SPI Instance + * @retval Returned value is a number between Min_Data = 0x00 and Max_Data = 0xFFFF + */ +__STATIC_INLINE uint32_t LL_SPI_GetRxCRC(const SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_REG(SPIx->RXCRCR)); +} + +/** + * @brief Get Tx CRC + * @rmtoll TXCRCR TXCRC LL_SPI_GetTxCRC + * @param SPIx SPI Instance + * @retval Returned value is a number between Min_Data = 0x00 and Max_Data = 0xFFFF + */ +__STATIC_INLINE uint32_t LL_SPI_GetTxCRC(const SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_REG(SPIx->TXCRCR)); +} + +/** + * @} + */ + +/** @defgroup SPI_LL_EF_NSS_Management Slave Select Pin Management + * @{ + */ + +/** + * @brief Set NSS mode + * @note LL_SPI_NSS_SOFT Mode is not used in SPI TI mode. + * @rmtoll CR1 SSM LL_SPI_SetNSSMode\n + * @rmtoll CR2 SSOE LL_SPI_SetNSSMode + * @param SPIx SPI Instance + * @param NSS This parameter can be one of the following values: + * @arg @ref LL_SPI_NSS_SOFT + * @arg @ref LL_SPI_NSS_HARD_INPUT + * @arg @ref LL_SPI_NSS_HARD_OUTPUT + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetNSSMode(SPI_TypeDef *SPIx, uint32_t NSS) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_SSM, NSS); + MODIFY_REG(SPIx->CR2, SPI_CR2_SSOE, ((uint32_t)(NSS >> 16U))); +} + +/** + * @brief Get NSS mode + * @rmtoll CR1 SSM LL_SPI_GetNSSMode\n + * @rmtoll CR2 SSOE LL_SPI_GetNSSMode + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_NSS_SOFT + * @arg @ref LL_SPI_NSS_HARD_INPUT + * @arg @ref LL_SPI_NSS_HARD_OUTPUT + */ +__STATIC_INLINE uint32_t LL_SPI_GetNSSMode(const SPI_TypeDef *SPIx) +{ + uint32_t Ssm = (READ_BIT(SPIx->CR1, SPI_CR1_SSM)); + uint32_t Ssoe = (READ_BIT(SPIx->CR2, SPI_CR2_SSOE) << 16U); + return (Ssm | Ssoe); +} + +/** + * @} + */ + +/** @defgroup SPI_LL_EF_FLAG_Management FLAG Management + * @{ + */ + +/** + * @brief Check if Rx buffer is not empty + * @rmtoll SR RXNE LL_SPI_IsActiveFlag_RXNE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_RXNE(const SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->SR, SPI_SR_RXNE) == (SPI_SR_RXNE)) ? 1UL : 0UL); +} + +/** + * @brief Check if Tx buffer is empty + * @rmtoll SR TXE LL_SPI_IsActiveFlag_TXE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_TXE(const SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->SR, SPI_SR_TXE) == (SPI_SR_TXE)) ? 1UL : 0UL); +} + +/** + * @brief Get CRC error flag + * @rmtoll SR CRCERR LL_SPI_IsActiveFlag_CRCERR + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_CRCERR(const SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->SR, SPI_SR_CRCERR) == (SPI_SR_CRCERR)) ? 1UL : 0UL); +} + +/** + * @brief Get mode fault error flag + * @rmtoll SR MODF LL_SPI_IsActiveFlag_MODF + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_MODF(const SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->SR, SPI_SR_MODF) == (SPI_SR_MODF)) ? 1UL : 0UL); +} + +/** + * @brief Get overrun error flag + * @rmtoll SR OVR LL_SPI_IsActiveFlag_OVR + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_OVR(const SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->SR, SPI_SR_OVR) == (SPI_SR_OVR)) ? 1UL : 0UL); +} + +/** + * @brief Get busy flag + * @note The BSY flag is cleared under any one of the following conditions: + * -When the SPI is correctly disabled + * -When a fault is detected in Master mode (MODF bit set to 1) + * -In Master mode, when it finishes a data transmission and no new data is ready to be + * sent + * -In Slave mode, when the BSY flag is set to '0' for at least one SPI clock cycle between + * each data transfer. + * @rmtoll SR BSY LL_SPI_IsActiveFlag_BSY + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_BSY(const SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->SR, SPI_SR_BSY) == (SPI_SR_BSY)) ? 1UL : 0UL); +} + +/** + * @brief Get frame format error flag + * @rmtoll SR FRE LL_SPI_IsActiveFlag_FRE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_FRE(const SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->SR, SPI_SR_FRE) == (SPI_SR_FRE)) ? 1UL : 0UL); +} + +/** + * @brief Clear CRC error flag + * @rmtoll SR CRCERR LL_SPI_ClearFlag_CRCERR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_ClearFlag_CRCERR(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->SR, SPI_SR_CRCERR); +} + +/** + * @brief Clear mode fault error flag + * @note Clearing this flag is done by a read access to the SPIx_SR + * register followed by a write access to the SPIx_CR1 register + * @rmtoll SR MODF LL_SPI_ClearFlag_MODF + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_ClearFlag_MODF(SPI_TypeDef *SPIx) +{ + __IO uint32_t tmpreg_sr; + tmpreg_sr = SPIx->SR; + (void) tmpreg_sr; + CLEAR_BIT(SPIx->CR1, SPI_CR1_SPE); +} + +/** + * @brief Clear overrun error flag + * @note Clearing this flag is done by a read access to the SPIx_DR + * register followed by a read access to the SPIx_SR register + * @rmtoll SR OVR LL_SPI_ClearFlag_OVR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_ClearFlag_OVR(const SPI_TypeDef *SPIx) +{ + __IO uint32_t tmpreg; + tmpreg = SPIx->DR; + (void) tmpreg; + tmpreg = SPIx->SR; + (void) tmpreg; +} + +/** + * @brief Clear frame format error flag + * @note Clearing this flag is done by reading SPIx_SR register + * @rmtoll SR FRE LL_SPI_ClearFlag_FRE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_ClearFlag_FRE(const SPI_TypeDef *SPIx) +{ + __IO uint32_t tmpreg; + tmpreg = SPIx->SR; + (void) tmpreg; +} + +/** + * @} + */ + +/** @defgroup SPI_LL_EF_IT_Management Interrupt Management + * @{ + */ + +/** + * @brief Enable error interrupt + * @note This bit controls the generation of an interrupt when an error condition + * occurs (CRCERR, OVR, MODF in SPI mode, FRE at TI mode). + * @rmtoll CR2 ERRIE LL_SPI_EnableIT_ERR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_EnableIT_ERR(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR2, SPI_CR2_ERRIE); +} + +/** + * @brief Enable Rx buffer not empty interrupt + * @rmtoll CR2 RXNEIE LL_SPI_EnableIT_RXNE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_EnableIT_RXNE(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR2, SPI_CR2_RXNEIE); +} + +/** + * @brief Enable Tx buffer empty interrupt + * @rmtoll CR2 TXEIE LL_SPI_EnableIT_TXE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_EnableIT_TXE(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR2, SPI_CR2_TXEIE); +} + +/** + * @brief Disable error interrupt + * @note This bit controls the generation of an interrupt when an error condition + * occurs (CRCERR, OVR, MODF in SPI mode, FRE at TI mode). + * @rmtoll CR2 ERRIE LL_SPI_DisableIT_ERR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_DisableIT_ERR(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->CR2, SPI_CR2_ERRIE); +} + +/** + * @brief Disable Rx buffer not empty interrupt + * @rmtoll CR2 RXNEIE LL_SPI_DisableIT_RXNE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_DisableIT_RXNE(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->CR2, SPI_CR2_RXNEIE); +} + +/** + * @brief Disable Tx buffer empty interrupt + * @rmtoll CR2 TXEIE LL_SPI_DisableIT_TXE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_DisableIT_TXE(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->CR2, SPI_CR2_TXEIE); +} + +/** + * @brief Check if error interrupt is enabled + * @rmtoll CR2 ERRIE LL_SPI_IsEnabledIT_ERR + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsEnabledIT_ERR(const SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->CR2, SPI_CR2_ERRIE) == (SPI_CR2_ERRIE)) ? 1UL : 0UL); +} + +/** + * @brief Check if Rx buffer not empty interrupt is enabled + * @rmtoll CR2 RXNEIE LL_SPI_IsEnabledIT_RXNE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsEnabledIT_RXNE(const SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->CR2, SPI_CR2_RXNEIE) == (SPI_CR2_RXNEIE)) ? 1UL : 0UL); +} + +/** + * @brief Check if Tx buffer empty interrupt + * @rmtoll CR2 TXEIE LL_SPI_IsEnabledIT_TXE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsEnabledIT_TXE(const SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->CR2, SPI_CR2_TXEIE) == (SPI_CR2_TXEIE)) ? 1UL : 0UL); +} + +/** + * @} + */ + +/** @defgroup SPI_LL_EF_DMA_Management DMA Management + * @{ + */ + +/** + * @brief Enable DMA Rx + * @rmtoll CR2 RXDMAEN LL_SPI_EnableDMAReq_RX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_EnableDMAReq_RX(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR2, SPI_CR2_RXDMAEN); +} + +/** + * @brief Disable DMA Rx + * @rmtoll CR2 RXDMAEN LL_SPI_DisableDMAReq_RX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_DisableDMAReq_RX(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->CR2, SPI_CR2_RXDMAEN); +} + +/** + * @brief Check if DMA Rx is enabled + * @rmtoll CR2 RXDMAEN LL_SPI_IsEnabledDMAReq_RX + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsEnabledDMAReq_RX(const SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->CR2, SPI_CR2_RXDMAEN) == (SPI_CR2_RXDMAEN)) ? 1UL : 0UL); +} + +/** + * @brief Enable DMA Tx + * @rmtoll CR2 TXDMAEN LL_SPI_EnableDMAReq_TX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_EnableDMAReq_TX(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR2, SPI_CR2_TXDMAEN); +} + +/** + * @brief Disable DMA Tx + * @rmtoll CR2 TXDMAEN LL_SPI_DisableDMAReq_TX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_DisableDMAReq_TX(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->CR2, SPI_CR2_TXDMAEN); +} + +/** + * @brief Check if DMA Tx is enabled + * @rmtoll CR2 TXDMAEN LL_SPI_IsEnabledDMAReq_TX + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsEnabledDMAReq_TX(const SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->CR2, SPI_CR2_TXDMAEN) == (SPI_CR2_TXDMAEN)) ? 1UL : 0UL); +} + +/** + * @brief Get the data register address used for DMA transfer + * @rmtoll DR DR LL_SPI_DMA_GetRegAddr + * @param SPIx SPI Instance + * @retval Address of data register + */ +__STATIC_INLINE uint32_t LL_SPI_DMA_GetRegAddr(const SPI_TypeDef *SPIx) +{ + return (uint32_t) &(SPIx->DR); +} + +/** + * @} + */ + +/** @defgroup SPI_LL_EF_DATA_Management DATA Management + * @{ + */ + +/** + * @brief Read 8-Bits in the data register + * @rmtoll DR DR LL_SPI_ReceiveData8 + * @param SPIx SPI Instance + * @retval RxData Value between Min_Data=0x00 and Max_Data=0xFF + */ +__STATIC_INLINE uint8_t LL_SPI_ReceiveData8(SPI_TypeDef *SPIx) +{ + return (*((__IO uint8_t *)&SPIx->DR)); +} + +/** + * @brief Read 16-Bits in the data register + * @rmtoll DR DR LL_SPI_ReceiveData16 + * @param SPIx SPI Instance + * @retval RxData Value between Min_Data=0x00 and Max_Data=0xFFFF + */ +__STATIC_INLINE uint16_t LL_SPI_ReceiveData16(SPI_TypeDef *SPIx) +{ + return (uint16_t)(READ_REG(SPIx->DR)); +} + +/** + * @brief Write 8-Bits in the data register + * @rmtoll DR DR LL_SPI_TransmitData8 + * @param SPIx SPI Instance + * @param TxData Value between Min_Data=0x00 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_SPI_TransmitData8(SPI_TypeDef *SPIx, uint8_t TxData) +{ +#if defined (__GNUC__) + __IO uint8_t *spidr = ((__IO uint8_t *)&SPIx->DR); + *spidr = TxData; +#else + *((__IO uint8_t *)&SPIx->DR) = TxData; +#endif /* __GNUC__ */ +} + +/** + * @brief Write 16-Bits in the data register + * @rmtoll DR DR LL_SPI_TransmitData16 + * @param SPIx SPI Instance + * @param TxData Value between Min_Data=0x00 and Max_Data=0xFFFF + * @retval None + */ +__STATIC_INLINE void LL_SPI_TransmitData16(SPI_TypeDef *SPIx, uint16_t TxData) +{ +#if defined (__GNUC__) + __IO uint16_t *spidr = ((__IO uint16_t *)&SPIx->DR); + *spidr = TxData; +#else + SPIx->DR = TxData; +#endif /* __GNUC__ */ +} + +/** + * @} + */ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup SPI_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + +ErrorStatus LL_SPI_DeInit(const SPI_TypeDef *SPIx); +ErrorStatus LL_SPI_Init(SPI_TypeDef *SPIx, LL_SPI_InitTypeDef *SPI_InitStruct); +void LL_SPI_StructInit(LL_SPI_InitTypeDef *SPI_InitStruct); + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup I2S_LL I2S + * @{ + */ + +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup I2S_LL_ES_INIT I2S Exported Init structure + * @{ + */ + +/** + * @brief I2S Init structure definition + */ + +typedef struct +{ + uint32_t Mode; /*!< Specifies the I2S operating mode. + This parameter can be a value of @ref I2S_LL_EC_MODE + + This feature can be modified afterwards using unitary function @ref LL_I2S_SetTransferMode().*/ + + uint32_t Standard; /*!< Specifies the standard used for the I2S communication. + This parameter can be a value of @ref I2S_LL_EC_STANDARD + + This feature can be modified afterwards using unitary function @ref LL_I2S_SetStandard().*/ + + + uint32_t DataFormat; /*!< Specifies the data format for the I2S communication. + This parameter can be a value of @ref I2S_LL_EC_DATA_FORMAT + + This feature can be modified afterwards using unitary function @ref LL_I2S_SetDataFormat().*/ + + + uint32_t MCLKOutput; /*!< Specifies whether the I2S MCLK output is enabled or not. + This parameter can be a value of @ref I2S_LL_EC_MCLK_OUTPUT + + This feature can be modified afterwards using unitary functions @ref LL_I2S_EnableMasterClock() or @ref LL_I2S_DisableMasterClock.*/ + + + uint32_t AudioFreq; /*!< Specifies the frequency selected for the I2S communication. + This parameter can be a value of @ref I2S_LL_EC_AUDIO_FREQ + + Audio Frequency can be modified afterwards using Reference manual formulas to calculate Prescaler Linear, Parity + and unitary functions @ref LL_I2S_SetPrescalerLinear() and @ref LL_I2S_SetPrescalerParity() to set it.*/ + + + uint32_t ClockPolarity; /*!< Specifies the idle state of the I2S clock. + This parameter can be a value of @ref I2S_LL_EC_POLARITY + + This feature can be modified afterwards using unitary function @ref LL_I2S_SetClockPolarity().*/ + +} LL_I2S_InitTypeDef; + +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup I2S_LL_Exported_Constants I2S Exported Constants + * @{ + */ + +/** @defgroup I2S_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_I2S_ReadReg function + * @{ + */ +#define LL_I2S_SR_RXNE LL_SPI_SR_RXNE /*!< Rx buffer not empty flag */ +#define LL_I2S_SR_TXE LL_SPI_SR_TXE /*!< Tx buffer empty flag */ +#define LL_I2S_SR_BSY LL_SPI_SR_BSY /*!< Busy flag */ +#define LL_I2S_SR_UDR SPI_SR_UDR /*!< Underrun flag */ +#define LL_I2S_SR_OVR LL_SPI_SR_OVR /*!< Overrun flag */ +#define LL_I2S_SR_FRE LL_SPI_SR_FRE /*!< TI mode frame format error flag */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_SPI_ReadReg and LL_SPI_WriteReg functions + * @{ + */ +#define LL_I2S_CR2_RXNEIE LL_SPI_CR2_RXNEIE /*!< Rx buffer not empty interrupt enable */ +#define LL_I2S_CR2_TXEIE LL_SPI_CR2_TXEIE /*!< Tx buffer empty interrupt enable */ +#define LL_I2S_CR2_ERRIE LL_SPI_CR2_ERRIE /*!< Error interrupt enable */ +/** + * @} + */ + +/** @defgroup I2S_LL_EC_DATA_FORMAT Data format + * @{ + */ +#define LL_I2S_DATAFORMAT_16B 0x00000000U /*!< Data length 16 bits, Channel length 16bit */ +#define LL_I2S_DATAFORMAT_16B_EXTENDED (SPI_I2SCFGR_CHLEN) /*!< Data length 16 bits, Channel length 32bit */ +#define LL_I2S_DATAFORMAT_24B (SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN_0) /*!< Data length 24 bits, Channel length 32bit */ +#define LL_I2S_DATAFORMAT_32B (SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN_1) /*!< Data length 16 bits, Channel length 32bit */ +/** + * @} + */ + +/** @defgroup I2S_LL_EC_POLARITY Clock Polarity + * @{ + */ +#define LL_I2S_POLARITY_LOW 0x00000000U /*!< Clock steady state is low level */ +#define LL_I2S_POLARITY_HIGH (SPI_I2SCFGR_CKPOL) /*!< Clock steady state is high level */ +/** + * @} + */ + +/** @defgroup I2S_LL_EC_STANDARD I2s Standard + * @{ + */ +#define LL_I2S_STANDARD_PHILIPS 0x00000000U /*!< I2S standard philips */ +#define LL_I2S_STANDARD_MSB (SPI_I2SCFGR_I2SSTD_0) /*!< MSB justified standard (left justified) */ +#define LL_I2S_STANDARD_LSB (SPI_I2SCFGR_I2SSTD_1) /*!< LSB justified standard (right justified) */ +#define LL_I2S_STANDARD_PCM_SHORT (SPI_I2SCFGR_I2SSTD_0 | SPI_I2SCFGR_I2SSTD_1) /*!< PCM standard, short frame synchronization */ +#define LL_I2S_STANDARD_PCM_LONG (SPI_I2SCFGR_I2SSTD_0 | SPI_I2SCFGR_I2SSTD_1 | SPI_I2SCFGR_PCMSYNC) /*!< PCM standard, long frame synchronization */ +/** + * @} + */ + +/** @defgroup I2S_LL_EC_MODE Operation Mode + * @{ + */ +#define LL_I2S_MODE_SLAVE_TX 0x00000000U /*!< Slave Tx configuration */ +#define LL_I2S_MODE_SLAVE_RX (SPI_I2SCFGR_I2SCFG_0) /*!< Slave Rx configuration */ +#define LL_I2S_MODE_MASTER_TX (SPI_I2SCFGR_I2SCFG_1) /*!< Master Tx configuration */ +#define LL_I2S_MODE_MASTER_RX (SPI_I2SCFGR_I2SCFG_0 | SPI_I2SCFGR_I2SCFG_1) /*!< Master Rx configuration */ +/** + * @} + */ + +/** @defgroup I2S_LL_EC_PRESCALER_FACTOR Prescaler Factor + * @{ + */ +#define LL_I2S_PRESCALER_PARITY_EVEN 0x00000000U /*!< Odd factor: Real divider value is = I2SDIV * 2 */ +#define LL_I2S_PRESCALER_PARITY_ODD (SPI_I2SPR_ODD >> 8U) /*!< Odd factor: Real divider value is = (I2SDIV * 2)+1 */ +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) + +/** @defgroup I2S_LL_EC_MCLK_OUTPUT MCLK Output + * @{ + */ +#define LL_I2S_MCLK_OUTPUT_DISABLE 0x00000000U /*!< Master clock output is disabled */ +#define LL_I2S_MCLK_OUTPUT_ENABLE (SPI_I2SPR_MCKOE) /*!< Master clock output is enabled */ +/** + * @} + */ + +/** @defgroup I2S_LL_EC_AUDIO_FREQ Audio Frequency + * @{ + */ + +#define LL_I2S_AUDIOFREQ_192K 192000U /*!< Audio Frequency configuration 192000 Hz */ +#define LL_I2S_AUDIOFREQ_96K 96000U /*!< Audio Frequency configuration 96000 Hz */ +#define LL_I2S_AUDIOFREQ_48K 48000U /*!< Audio Frequency configuration 48000 Hz */ +#define LL_I2S_AUDIOFREQ_44K 44100U /*!< Audio Frequency configuration 44100 Hz */ +#define LL_I2S_AUDIOFREQ_32K 32000U /*!< Audio Frequency configuration 32000 Hz */ +#define LL_I2S_AUDIOFREQ_22K 22050U /*!< Audio Frequency configuration 22050 Hz */ +#define LL_I2S_AUDIOFREQ_16K 16000U /*!< Audio Frequency configuration 16000 Hz */ +#define LL_I2S_AUDIOFREQ_11K 11025U /*!< Audio Frequency configuration 11025 Hz */ +#define LL_I2S_AUDIOFREQ_8K 8000U /*!< Audio Frequency configuration 8000 Hz */ +#define LL_I2S_AUDIOFREQ_DEFAULT 2U /*!< Audio Freq not specified. Register I2SDIV = 2 */ +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup I2S_LL_Exported_Macros I2S Exported Macros + * @{ + */ + +/** @defgroup I2S_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in I2S register + * @param __INSTANCE__ I2S Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_I2S_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in I2S register + * @param __INSTANCE__ I2S Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_I2S_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** + * @} + */ + + +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup I2S_LL_Exported_Functions I2S Exported Functions + * @{ + */ + +/** @defgroup I2S_LL_EF_Configuration Configuration + * @{ + */ + +/** + * @brief Select I2S mode and Enable I2S peripheral + * @rmtoll I2SCFGR I2SMOD LL_I2S_Enable\n + * I2SCFGR I2SE LL_I2S_Enable + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_Enable(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SMOD | SPI_I2SCFGR_I2SE); +} + +/** + * @brief Disable I2S peripheral + * @rmtoll I2SCFGR I2SE LL_I2S_Disable + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_Disable(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SMOD | SPI_I2SCFGR_I2SE); +} + +/** + * @brief Check if I2S peripheral is enabled + * @rmtoll I2SCFGR I2SE LL_I2S_IsEnabled + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabled(const SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SE) == (SPI_I2SCFGR_I2SE)) ? 1UL : 0UL); +} + +/** + * @brief Set I2S data frame length + * @rmtoll I2SCFGR DATLEN LL_I2S_SetDataFormat\n + * I2SCFGR CHLEN LL_I2S_SetDataFormat + * @param SPIx SPI Instance + * @param DataFormat This parameter can be one of the following values: + * @arg @ref LL_I2S_DATAFORMAT_16B + * @arg @ref LL_I2S_DATAFORMAT_16B_EXTENDED + * @arg @ref LL_I2S_DATAFORMAT_24B + * @arg @ref LL_I2S_DATAFORMAT_32B + * @retval None + */ +__STATIC_INLINE void LL_I2S_SetDataFormat(SPI_TypeDef *SPIx, uint32_t DataFormat) +{ + MODIFY_REG(SPIx->I2SCFGR, SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN, DataFormat); +} + +/** + * @brief Get I2S data frame length + * @rmtoll I2SCFGR DATLEN LL_I2S_GetDataFormat\n + * I2SCFGR CHLEN LL_I2S_GetDataFormat + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2S_DATAFORMAT_16B + * @arg @ref LL_I2S_DATAFORMAT_16B_EXTENDED + * @arg @ref LL_I2S_DATAFORMAT_24B + * @arg @ref LL_I2S_DATAFORMAT_32B + */ +__STATIC_INLINE uint32_t LL_I2S_GetDataFormat(const SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN)); +} + +/** + * @brief Set I2S clock polarity + * @rmtoll I2SCFGR CKPOL LL_I2S_SetClockPolarity + * @param SPIx SPI Instance + * @param ClockPolarity This parameter can be one of the following values: + * @arg @ref LL_I2S_POLARITY_LOW + * @arg @ref LL_I2S_POLARITY_HIGH + * @retval None + */ +__STATIC_INLINE void LL_I2S_SetClockPolarity(SPI_TypeDef *SPIx, uint32_t ClockPolarity) +{ + SET_BIT(SPIx->I2SCFGR, ClockPolarity); +} + +/** + * @brief Get I2S clock polarity + * @rmtoll I2SCFGR CKPOL LL_I2S_GetClockPolarity + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2S_POLARITY_LOW + * @arg @ref LL_I2S_POLARITY_HIGH + */ +__STATIC_INLINE uint32_t LL_I2S_GetClockPolarity(const SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_CKPOL)); +} + +/** + * @brief Set I2S standard protocol + * @rmtoll I2SCFGR I2SSTD LL_I2S_SetStandard\n + * I2SCFGR PCMSYNC LL_I2S_SetStandard + * @param SPIx SPI Instance + * @param Standard This parameter can be one of the following values: + * @arg @ref LL_I2S_STANDARD_PHILIPS + * @arg @ref LL_I2S_STANDARD_MSB + * @arg @ref LL_I2S_STANDARD_LSB + * @arg @ref LL_I2S_STANDARD_PCM_SHORT + * @arg @ref LL_I2S_STANDARD_PCM_LONG + * @retval None + */ +__STATIC_INLINE void LL_I2S_SetStandard(SPI_TypeDef *SPIx, uint32_t Standard) +{ + MODIFY_REG(SPIx->I2SCFGR, SPI_I2SCFGR_I2SSTD | SPI_I2SCFGR_PCMSYNC, Standard); +} + +/** + * @brief Get I2S standard protocol + * @rmtoll I2SCFGR I2SSTD LL_I2S_GetStandard\n + * I2SCFGR PCMSYNC LL_I2S_GetStandard + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2S_STANDARD_PHILIPS + * @arg @ref LL_I2S_STANDARD_MSB + * @arg @ref LL_I2S_STANDARD_LSB + * @arg @ref LL_I2S_STANDARD_PCM_SHORT + * @arg @ref LL_I2S_STANDARD_PCM_LONG + */ +__STATIC_INLINE uint32_t LL_I2S_GetStandard(const SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SSTD | SPI_I2SCFGR_PCMSYNC)); +} + +/** + * @brief Set I2S transfer mode + * @rmtoll I2SCFGR I2SCFG LL_I2S_SetTransferMode + * @param SPIx SPI Instance + * @param Mode This parameter can be one of the following values: + * @arg @ref LL_I2S_MODE_SLAVE_TX + * @arg @ref LL_I2S_MODE_SLAVE_RX + * @arg @ref LL_I2S_MODE_MASTER_TX + * @arg @ref LL_I2S_MODE_MASTER_RX + * @retval None + */ +__STATIC_INLINE void LL_I2S_SetTransferMode(SPI_TypeDef *SPIx, uint32_t Mode) +{ + MODIFY_REG(SPIx->I2SCFGR, SPI_I2SCFGR_I2SCFG, Mode); +} + +/** + * @brief Get I2S transfer mode + * @rmtoll I2SCFGR I2SCFG LL_I2S_GetTransferMode + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2S_MODE_SLAVE_TX + * @arg @ref LL_I2S_MODE_SLAVE_RX + * @arg @ref LL_I2S_MODE_MASTER_TX + * @arg @ref LL_I2S_MODE_MASTER_RX + */ +__STATIC_INLINE uint32_t LL_I2S_GetTransferMode(const SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SCFG)); +} + +/** + * @brief Set I2S linear prescaler + * @rmtoll I2SPR I2SDIV LL_I2S_SetPrescalerLinear + * @param SPIx SPI Instance + * @param PrescalerLinear Value between Min_Data=0x02 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_I2S_SetPrescalerLinear(SPI_TypeDef *SPIx, uint8_t PrescalerLinear) +{ + MODIFY_REG(SPIx->I2SPR, SPI_I2SPR_I2SDIV, PrescalerLinear); +} + +/** + * @brief Get I2S linear prescaler + * @rmtoll I2SPR I2SDIV LL_I2S_GetPrescalerLinear + * @param SPIx SPI Instance + * @retval PrescalerLinear Value between Min_Data=0x02 and Max_Data=0xFF + */ +__STATIC_INLINE uint32_t LL_I2S_GetPrescalerLinear(const SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->I2SPR, SPI_I2SPR_I2SDIV)); +} + +/** + * @brief Set I2S parity prescaler + * @rmtoll I2SPR ODD LL_I2S_SetPrescalerParity + * @param SPIx SPI Instance + * @param PrescalerParity This parameter can be one of the following values: + * @arg @ref LL_I2S_PRESCALER_PARITY_EVEN + * @arg @ref LL_I2S_PRESCALER_PARITY_ODD + * @retval None + */ +__STATIC_INLINE void LL_I2S_SetPrescalerParity(SPI_TypeDef *SPIx, uint32_t PrescalerParity) +{ + MODIFY_REG(SPIx->I2SPR, SPI_I2SPR_ODD, PrescalerParity << 8U); +} + +/** + * @brief Get I2S parity prescaler + * @rmtoll I2SPR ODD LL_I2S_GetPrescalerParity + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2S_PRESCALER_PARITY_EVEN + * @arg @ref LL_I2S_PRESCALER_PARITY_ODD + */ +__STATIC_INLINE uint32_t LL_I2S_GetPrescalerParity(const SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->I2SPR, SPI_I2SPR_ODD) >> 8U); +} + +/** + * @brief Enable the master clock output (Pin MCK) + * @rmtoll I2SPR MCKOE LL_I2S_EnableMasterClock + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_EnableMasterClock(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->I2SPR, SPI_I2SPR_MCKOE); +} + +/** + * @brief Disable the master clock output (Pin MCK) + * @rmtoll I2SPR MCKOE LL_I2S_DisableMasterClock + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_DisableMasterClock(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->I2SPR, SPI_I2SPR_MCKOE); +} + +/** + * @brief Check if the master clock output (Pin MCK) is enabled + * @rmtoll I2SPR MCKOE LL_I2S_IsEnabledMasterClock + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabledMasterClock(const SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->I2SPR, SPI_I2SPR_MCKOE) == (SPI_I2SPR_MCKOE)) ? 1UL : 0UL); +} + +#if defined(SPI_I2SCFGR_ASTRTEN) +/** + * @brief Enable asynchronous start + * @rmtoll I2SCFGR ASTRTEN LL_I2S_EnableAsyncStart + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_EnableAsyncStart(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_ASTRTEN); +} + +/** + * @brief Disable asynchronous start + * @rmtoll I2SCFGR ASTRTEN LL_I2S_DisableAsyncStart + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_DisableAsyncStart(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_ASTRTEN); +} + +/** + * @brief Check if asynchronous start is enabled + * @rmtoll I2SCFGR ASTRTEN LL_I2S_IsEnabledAsyncStart + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabledAsyncStart(const SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_ASTRTEN) == (SPI_I2SCFGR_ASTRTEN)) ? 1UL : 0UL); +} +#endif /* SPI_I2SCFGR_ASTRTEN */ + +/** + * @} + */ + +/** @defgroup I2S_LL_EF_FLAG FLAG Management + * @{ + */ + +/** + * @brief Check if Rx buffer is not empty + * @rmtoll SR RXNE LL_I2S_IsActiveFlag_RXNE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_RXNE(const SPI_TypeDef *SPIx) +{ + return LL_SPI_IsActiveFlag_RXNE(SPIx); +} + +/** + * @brief Check if Tx buffer is empty + * @rmtoll SR TXE LL_I2S_IsActiveFlag_TXE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_TXE(const SPI_TypeDef *SPIx) +{ + return LL_SPI_IsActiveFlag_TXE(SPIx); +} + +/** + * @brief Get busy flag + * @rmtoll SR BSY LL_I2S_IsActiveFlag_BSY + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_BSY(const SPI_TypeDef *SPIx) +{ + return LL_SPI_IsActiveFlag_BSY(SPIx); +} + +/** + * @brief Get overrun error flag + * @rmtoll SR OVR LL_I2S_IsActiveFlag_OVR + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_OVR(const SPI_TypeDef *SPIx) +{ + return LL_SPI_IsActiveFlag_OVR(SPIx); +} + +/** + * @brief Get underrun error flag + * @rmtoll SR UDR LL_I2S_IsActiveFlag_UDR + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_UDR(const SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->SR, SPI_SR_UDR) == (SPI_SR_UDR)) ? 1UL : 0UL); +} + +/** + * @brief Get frame format error flag + * @rmtoll SR FRE LL_I2S_IsActiveFlag_FRE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_FRE(const SPI_TypeDef *SPIx) +{ + return LL_SPI_IsActiveFlag_FRE(SPIx); +} + +/** + * @brief Get channel side flag. + * @note 0: Channel Left has to be transmitted or has been received\n + * 1: Channel Right has to be transmitted or has been received\n + * It has no significance in PCM mode. + * @rmtoll SR CHSIDE LL_I2S_IsActiveFlag_CHSIDE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_CHSIDE(const SPI_TypeDef *SPIx) +{ + return ((READ_BIT(SPIx->SR, SPI_SR_CHSIDE) == (SPI_SR_CHSIDE)) ? 1UL : 0UL); +} + +/** + * @brief Clear overrun error flag + * @rmtoll SR OVR LL_I2S_ClearFlag_OVR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_ClearFlag_OVR(SPI_TypeDef *SPIx) +{ + LL_SPI_ClearFlag_OVR(SPIx); +} + +/** + * @brief Clear underrun error flag + * @rmtoll SR UDR LL_I2S_ClearFlag_UDR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_ClearFlag_UDR(const SPI_TypeDef *SPIx) +{ + __IO uint32_t tmpreg; + tmpreg = SPIx->SR; + (void)tmpreg; +} + +/** + * @brief Clear frame format error flag + * @rmtoll SR FRE LL_I2S_ClearFlag_FRE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_ClearFlag_FRE(const SPI_TypeDef *SPIx) +{ + LL_SPI_ClearFlag_FRE(SPIx); +} + +/** + * @} + */ + +/** @defgroup I2S_LL_EF_IT Interrupt Management + * @{ + */ + +/** + * @brief Enable error IT + * @note This bit controls the generation of an interrupt when an error condition occurs (OVR, UDR and FRE in I2S mode). + * @rmtoll CR2 ERRIE LL_I2S_EnableIT_ERR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_EnableIT_ERR(SPI_TypeDef *SPIx) +{ + LL_SPI_EnableIT_ERR(SPIx); +} + +/** + * @brief Enable Rx buffer not empty IT + * @rmtoll CR2 RXNEIE LL_I2S_EnableIT_RXNE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_EnableIT_RXNE(SPI_TypeDef *SPIx) +{ + LL_SPI_EnableIT_RXNE(SPIx); +} + +/** + * @brief Enable Tx buffer empty IT + * @rmtoll CR2 TXEIE LL_I2S_EnableIT_TXE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_EnableIT_TXE(SPI_TypeDef *SPIx) +{ + LL_SPI_EnableIT_TXE(SPIx); +} + +/** + * @brief Disable error IT + * @note This bit controls the generation of an interrupt when an error condition occurs (OVR, UDR and FRE in I2S mode). + * @rmtoll CR2 ERRIE LL_I2S_DisableIT_ERR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_DisableIT_ERR(SPI_TypeDef *SPIx) +{ + LL_SPI_DisableIT_ERR(SPIx); +} + +/** + * @brief Disable Rx buffer not empty IT + * @rmtoll CR2 RXNEIE LL_I2S_DisableIT_RXNE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_DisableIT_RXNE(SPI_TypeDef *SPIx) +{ + LL_SPI_DisableIT_RXNE(SPIx); +} + +/** + * @brief Disable Tx buffer empty IT + * @rmtoll CR2 TXEIE LL_I2S_DisableIT_TXE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_DisableIT_TXE(SPI_TypeDef *SPIx) +{ + LL_SPI_DisableIT_TXE(SPIx); +} + +/** + * @brief Check if ERR IT is enabled + * @rmtoll CR2 ERRIE LL_I2S_IsEnabledIT_ERR + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabledIT_ERR(const SPI_TypeDef *SPIx) +{ + return LL_SPI_IsEnabledIT_ERR(SPIx); +} + +/** + * @brief Check if RXNE IT is enabled + * @rmtoll CR2 RXNEIE LL_I2S_IsEnabledIT_RXNE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabledIT_RXNE(const SPI_TypeDef *SPIx) +{ + return LL_SPI_IsEnabledIT_RXNE(SPIx); +} + +/** + * @brief Check if TXE IT is enabled + * @rmtoll CR2 TXEIE LL_I2S_IsEnabledIT_TXE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabledIT_TXE(const SPI_TypeDef *SPIx) +{ + return LL_SPI_IsEnabledIT_TXE(SPIx); +} + +/** + * @} + */ + +/** @defgroup I2S_LL_EF_DMA DMA Management + * @{ + */ + +/** + * @brief Enable DMA Rx + * @rmtoll CR2 RXDMAEN LL_I2S_EnableDMAReq_RX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_EnableDMAReq_RX(SPI_TypeDef *SPIx) +{ + LL_SPI_EnableDMAReq_RX(SPIx); +} + +/** + * @brief Disable DMA Rx + * @rmtoll CR2 RXDMAEN LL_I2S_DisableDMAReq_RX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_DisableDMAReq_RX(SPI_TypeDef *SPIx) +{ + LL_SPI_DisableDMAReq_RX(SPIx); +} + +/** + * @brief Check if DMA Rx is enabled + * @rmtoll CR2 RXDMAEN LL_I2S_IsEnabledDMAReq_RX + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabledDMAReq_RX(const SPI_TypeDef *SPIx) +{ + return LL_SPI_IsEnabledDMAReq_RX(SPIx); +} + +/** + * @brief Enable DMA Tx + * @rmtoll CR2 TXDMAEN LL_I2S_EnableDMAReq_TX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_EnableDMAReq_TX(SPI_TypeDef *SPIx) +{ + LL_SPI_EnableDMAReq_TX(SPIx); +} + +/** + * @brief Disable DMA Tx + * @rmtoll CR2 TXDMAEN LL_I2S_DisableDMAReq_TX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_DisableDMAReq_TX(SPI_TypeDef *SPIx) +{ + LL_SPI_DisableDMAReq_TX(SPIx); +} + +/** + * @brief Check if DMA Tx is enabled + * @rmtoll CR2 TXDMAEN LL_I2S_IsEnabledDMAReq_TX + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabledDMAReq_TX(const SPI_TypeDef *SPIx) +{ + return LL_SPI_IsEnabledDMAReq_TX(SPIx); +} + +/** + * @} + */ + +/** @defgroup I2S_LL_EF_DATA DATA Management + * @{ + */ + +/** + * @brief Read 16-Bits in data register + * @rmtoll DR DR LL_I2S_ReceiveData16 + * @param SPIx SPI Instance + * @retval RxData Value between Min_Data=0x0000 and Max_Data=0xFFFF + */ +__STATIC_INLINE uint16_t LL_I2S_ReceiveData16(SPI_TypeDef *SPIx) +{ + return LL_SPI_ReceiveData16(SPIx); +} + +/** + * @brief Write 16-Bits in data register + * @rmtoll DR DR LL_I2S_TransmitData16 + * @param SPIx SPI Instance + * @param TxData Value between Min_Data=0x0000 and Max_Data=0xFFFF + * @retval None + */ +__STATIC_INLINE void LL_I2S_TransmitData16(SPI_TypeDef *SPIx, uint16_t TxData) +{ + LL_SPI_TransmitData16(SPIx, TxData); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup I2S_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + +ErrorStatus LL_I2S_DeInit(const SPI_TypeDef *SPIx); +ErrorStatus LL_I2S_Init(SPI_TypeDef *SPIx, LL_I2S_InitTypeDef *I2S_InitStruct); +void LL_I2S_StructInit(LL_I2S_InitTypeDef *I2S_InitStruct); +void LL_I2S_ConfigPrescaler(SPI_TypeDef *SPIx, uint32_t PrescalerLinear, uint32_t PrescalerParity); +#if defined (SPI_I2S_FULLDUPLEX_SUPPORT) +ErrorStatus LL_I2S_InitFullDuplex(SPI_TypeDef *I2Sxext, LL_I2S_InitTypeDef *I2S_InitStruct); +#endif /* SPI_I2S_FULLDUPLEX_SUPPORT */ + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined (SPI1) || defined (SPI2) || defined (SPI3) || defined (SPI4) || defined (SPI5) || defined(SPI6) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32F4xx_LL_SPI_H */ + diff --git a/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h new file mode 100644 index 0000000..84ea5c4 --- /dev/null +++ b/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/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_tim.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_tim.h new file mode 100644 index 0000000..a11f561 --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_tim.h @@ -0,0 +1,4096 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_tim.h + * @author MCD Application Team + * @brief Header file of TIM 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_TIM_H +#define __STM32F4xx_LL_TIM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (TIM1) || defined (TIM2) || defined (TIM3) || defined (TIM4) || defined (TIM5) || defined (TIM6) || defined (TIM7) || defined (TIM8) || defined (TIM9) || defined (TIM10) || defined (TIM11) || defined (TIM12) || defined (TIM13) || defined (TIM14) + +/** @defgroup TIM_LL TIM + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @defgroup TIM_LL_Private_Variables TIM Private Variables + * @{ + */ +static const uint8_t OFFSET_TAB_CCMRx[] = +{ + 0x00U, /* 0: TIMx_CH1 */ + 0x00U, /* 1: TIMx_CH1N */ + 0x00U, /* 2: TIMx_CH2 */ + 0x00U, /* 3: TIMx_CH2N */ + 0x04U, /* 4: TIMx_CH3 */ + 0x04U, /* 5: TIMx_CH3N */ + 0x04U /* 6: TIMx_CH4 */ +}; + +static const uint8_t SHIFT_TAB_OCxx[] = +{ + 0U, /* 0: OC1M, OC1FE, OC1PE */ + 0U, /* 1: - NA */ + 8U, /* 2: OC2M, OC2FE, OC2PE */ + 0U, /* 3: - NA */ + 0U, /* 4: OC3M, OC3FE, OC3PE */ + 0U, /* 5: - NA */ + 8U /* 6: OC4M, OC4FE, OC4PE */ +}; + +static const uint8_t SHIFT_TAB_ICxx[] = +{ + 0U, /* 0: CC1S, IC1PSC, IC1F */ + 0U, /* 1: - NA */ + 8U, /* 2: CC2S, IC2PSC, IC2F */ + 0U, /* 3: - NA */ + 0U, /* 4: CC3S, IC3PSC, IC3F */ + 0U, /* 5: - NA */ + 8U /* 6: CC4S, IC4PSC, IC4F */ +}; + +static const uint8_t SHIFT_TAB_CCxP[] = +{ + 0U, /* 0: CC1P */ + 2U, /* 1: CC1NP */ + 4U, /* 2: CC2P */ + 6U, /* 3: CC2NP */ + 8U, /* 4: CC3P */ + 10U, /* 5: CC3NP */ + 12U /* 6: CC4P */ +}; + +static const uint8_t SHIFT_TAB_OISx[] = +{ + 0U, /* 0: OIS1 */ + 1U, /* 1: OIS1N */ + 2U, /* 2: OIS2 */ + 3U, /* 3: OIS2N */ + 4U, /* 4: OIS3 */ + 5U, /* 5: OIS3N */ + 6U /* 6: OIS4 */ +}; +/** + * @} + */ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup TIM_LL_Private_Constants TIM Private Constants + * @{ + */ + + +/* Remap mask definitions */ +#define TIMx_OR_RMP_SHIFT 16U +#define TIMx_OR_RMP_MASK 0x0000FFFFU +#define TIM2_OR_RMP_MASK (TIM_OR_ITR1_RMP << TIMx_OR_RMP_SHIFT) +#define TIM5_OR_RMP_MASK (TIM_OR_TI4_RMP << TIMx_OR_RMP_SHIFT) +#define TIM11_OR_RMP_MASK (TIM_OR_TI1_RMP << TIMx_OR_RMP_SHIFT) + +/* Mask used to set the TDG[x:0] of the DTG bits of the TIMx_BDTR register */ +#define DT_DELAY_1 ((uint8_t)0x7F) +#define DT_DELAY_2 ((uint8_t)0x3F) +#define DT_DELAY_3 ((uint8_t)0x1F) +#define DT_DELAY_4 ((uint8_t)0x1F) + +/* Mask used to set the DTG[7:5] bits of the DTG bits of the TIMx_BDTR register */ +#define DT_RANGE_1 ((uint8_t)0x00) +#define DT_RANGE_2 ((uint8_t)0x80) +#define DT_RANGE_3 ((uint8_t)0xC0) +#define DT_RANGE_4 ((uint8_t)0xE0) + + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup TIM_LL_Private_Macros TIM Private Macros + * @{ + */ +/** @brief Convert channel id into channel index. + * @param __CHANNEL__ This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH1N + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH2N + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH3N + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval none + */ +#define TIM_GET_CHANNEL_INDEX( __CHANNEL__) \ + (((__CHANNEL__) == LL_TIM_CHANNEL_CH1) ? 0U :\ + ((__CHANNEL__) == LL_TIM_CHANNEL_CH1N) ? 1U :\ + ((__CHANNEL__) == LL_TIM_CHANNEL_CH2) ? 2U :\ + ((__CHANNEL__) == LL_TIM_CHANNEL_CH2N) ? 3U :\ + ((__CHANNEL__) == LL_TIM_CHANNEL_CH3) ? 4U :\ + ((__CHANNEL__) == LL_TIM_CHANNEL_CH3N) ? 5U : 6U) + +/** @brief Calculate the deadtime sampling period(in ps). + * @param __TIMCLK__ timer input clock frequency (in Hz). + * @param __CKD__ This parameter can be one of the following values: + * @arg @ref LL_TIM_CLOCKDIVISION_DIV1 + * @arg @ref LL_TIM_CLOCKDIVISION_DIV2 + * @arg @ref LL_TIM_CLOCKDIVISION_DIV4 + * @retval none + */ +#define TIM_CALC_DTS(__TIMCLK__, __CKD__) \ + (((__CKD__) == LL_TIM_CLOCKDIVISION_DIV1) ? ((uint64_t)1000000000000U/(__TIMCLK__)) : \ + ((__CKD__) == LL_TIM_CLOCKDIVISION_DIV2) ? ((uint64_t)1000000000000U/((__TIMCLK__) >> 1U)) : \ + ((uint64_t)1000000000000U/((__TIMCLK__) >> 2U))) +/** + * @} + */ + + +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup TIM_LL_ES_INIT TIM Exported Init structure + * @{ + */ + +/** + * @brief TIM Time Base configuration structure definition. + */ +typedef struct +{ + uint16_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. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_SetPrescaler().*/ + + uint32_t CounterMode; /*!< Specifies the counter mode. + This parameter can be a value of @ref TIM_LL_EC_COUNTERMODE. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_SetCounterMode().*/ + + uint32_t Autoreload; /*!< Specifies the auto reload value to be loaded into the active + Auto-Reload Register at the next update event. + This parameter must be a number between Min_Data=0x0000 and Max_Data=0xFFFF. + Some timer instances may support 32 bits counters. In that case this parameter must + be a number between 0x0000 and 0xFFFFFFFF. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_SetAutoReload().*/ + + uint32_t ClockDivision; /*!< Specifies the clock division. + This parameter can be a value of @ref TIM_LL_EC_CLOCKDIVISION. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_SetClockDivision().*/ + + 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. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_SetRepetitionCounter().*/ +} LL_TIM_InitTypeDef; + +/** + * @brief TIM Output Compare configuration structure definition. + */ +typedef struct +{ + uint32_t OCMode; /*!< Specifies the output mode. + This parameter can be a value of @ref TIM_LL_EC_OCMODE. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_OC_SetMode().*/ + + uint32_t OCState; /*!< Specifies the TIM Output Compare state. + This parameter can be a value of @ref TIM_LL_EC_OCSTATE. + + This feature can be modified afterwards using unitary functions + @ref LL_TIM_CC_EnableChannel() or @ref LL_TIM_CC_DisableChannel().*/ + + uint32_t OCNState; /*!< Specifies the TIM complementary Output Compare state. + This parameter can be a value of @ref TIM_LL_EC_OCSTATE. + + This feature can be modified afterwards using unitary functions + @ref LL_TIM_CC_EnableChannel() or @ref LL_TIM_CC_DisableChannel().*/ + + uint32_t CompareValue; /*!< Specifies the Compare value to be loaded into the Capture Compare Register. + This parameter can be a number between Min_Data=0x0000 and Max_Data=0xFFFF. + + This feature can be modified afterwards using unitary function + LL_TIM_OC_SetCompareCHx (x=1..6).*/ + + uint32_t OCPolarity; /*!< Specifies the output polarity. + This parameter can be a value of @ref TIM_LL_EC_OCPOLARITY. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_OC_SetPolarity().*/ + + uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. + This parameter can be a value of @ref TIM_LL_EC_OCPOLARITY. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_OC_SetPolarity().*/ + + + uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_LL_EC_OCIDLESTATE. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_OC_SetIdleState().*/ + + uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_LL_EC_OCIDLESTATE. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_OC_SetIdleState().*/ +} LL_TIM_OC_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_LL_EC_IC_POLARITY. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_IC_SetPolarity().*/ + + uint32_t ICActiveInput; /*!< Specifies the input. + This parameter can be a value of @ref TIM_LL_EC_ACTIVEINPUT. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_IC_SetActiveInput().*/ + + uint32_t ICPrescaler; /*!< Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_LL_EC_ICPSC. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_IC_SetPrescaler().*/ + + uint32_t ICFilter; /*!< Specifies the input capture filter. + This parameter can be a value of @ref TIM_LL_EC_IC_FILTER. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_IC_SetFilter().*/ +} LL_TIM_IC_InitTypeDef; + + +/** + * @brief TIM Encoder interface configuration structure definition. + */ +typedef struct +{ + uint32_t EncoderMode; /*!< Specifies the encoder resolution (x2 or x4). + This parameter can be a value of @ref TIM_LL_EC_ENCODERMODE. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_SetEncoderMode().*/ + + uint32_t IC1Polarity; /*!< Specifies the active edge of TI1 input. + This parameter can be a value of @ref TIM_LL_EC_IC_POLARITY. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_IC_SetPolarity().*/ + + uint32_t IC1ActiveInput; /*!< Specifies the TI1 input source + This parameter can be a value of @ref TIM_LL_EC_ACTIVEINPUT. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_IC_SetActiveInput().*/ + + uint32_t IC1Prescaler; /*!< Specifies the TI1 input prescaler value. + This parameter can be a value of @ref TIM_LL_EC_ICPSC. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_IC_SetPrescaler().*/ + + uint32_t IC1Filter; /*!< Specifies the TI1 input filter. + This parameter can be a value of @ref TIM_LL_EC_IC_FILTER. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_IC_SetFilter().*/ + + uint32_t IC2Polarity; /*!< Specifies the active edge of TI2 input. + This parameter can be a value of @ref TIM_LL_EC_IC_POLARITY. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_IC_SetPolarity().*/ + + uint32_t IC2ActiveInput; /*!< Specifies the TI2 input source + This parameter can be a value of @ref TIM_LL_EC_ACTIVEINPUT. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_IC_SetActiveInput().*/ + + uint32_t IC2Prescaler; /*!< Specifies the TI2 input prescaler value. + This parameter can be a value of @ref TIM_LL_EC_ICPSC. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_IC_SetPrescaler().*/ + + uint32_t IC2Filter; /*!< Specifies the TI2 input filter. + This parameter can be a value of @ref TIM_LL_EC_IC_FILTER. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_IC_SetFilter().*/ + +} LL_TIM_ENCODER_InitTypeDef; + +/** + * @brief TIM Hall sensor interface configuration structure definition. + */ +typedef struct +{ + + uint32_t IC1Polarity; /*!< Specifies the active edge of TI1 input. + This parameter can be a value of @ref TIM_LL_EC_IC_POLARITY. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_IC_SetPolarity().*/ + + uint32_t IC1Prescaler; /*!< Specifies the TI1 input prescaler value. + Prescaler must be set to get a maximum counter period longer than the + time interval between 2 consecutive changes on the Hall inputs. + This parameter can be a value of @ref TIM_LL_EC_ICPSC. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_IC_SetPrescaler().*/ + + uint32_t IC1Filter; /*!< Specifies the TI1 input filter. + This parameter can be a value of + @ref TIM_LL_EC_IC_FILTER. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_IC_SetFilter().*/ + + uint32_t CommutationDelay; /*!< Specifies the compare value to be loaded into the Capture Compare Register. + A positive pulse (TRGO event) is generated with a programmable delay every time + a change occurs on the Hall inputs. + This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_OC_SetCompareCH2().*/ +} LL_TIM_HALLSENSOR_InitTypeDef; + +/** + * @brief BDTR (Break and Dead Time) structure definition + */ +typedef struct +{ + uint32_t OSSRState; /*!< Specifies the Off-State selection used in Run mode. + This parameter can be a value of @ref TIM_LL_EC_OSSR + + This feature can be modified afterwards using unitary function + @ref LL_TIM_SetOffStates() + + @note This bit-field cannot be modified as long as LOCK level 2 has been + programmed. */ + + uint32_t OSSIState; /*!< Specifies the Off-State used in Idle state. + This parameter can be a value of @ref TIM_LL_EC_OSSI + + This feature can be modified afterwards using unitary function + @ref LL_TIM_SetOffStates() + + @note This bit-field cannot be modified as long as LOCK level 2 has been + programmed. */ + + uint32_t LockLevel; /*!< Specifies the LOCK level parameters. + This parameter can be a value of @ref TIM_LL_EC_LOCKLEVEL + + @note The LOCK bits can be written only once after the reset. Once the TIMx_BDTR + register has been written, their content is frozen until the next reset.*/ + + uint8_t DeadTime; /*!< Specifies the delay time between the switching-off and the + switching-on of the outputs. + This parameter can be a number between Min_Data = 0x00 and Max_Data = 0xFF. + + This feature can be modified afterwards using unitary function + @ref LL_TIM_OC_SetDeadTime() + + @note This bit-field can not be modified as long as LOCK level 1, 2 or 3 has been + programmed. */ + + uint16_t BreakState; /*!< Specifies whether the TIM Break input is enabled or not. + This parameter can be a value of @ref TIM_LL_EC_BREAK_ENABLE + + This feature can be modified afterwards using unitary functions + @ref LL_TIM_EnableBRK() or @ref LL_TIM_DisableBRK() + + @note This bit-field can not be modified as long as LOCK level 1 has been + programmed. */ + + uint32_t BreakPolarity; /*!< Specifies the TIM Break Input pin polarity. + This parameter can be a value of @ref TIM_LL_EC_BREAK_POLARITY + + This feature can be modified afterwards using unitary function + @ref LL_TIM_ConfigBRK() + + @note This bit-field can not be modified as long as LOCK level 1 has been + programmed. */ + + uint32_t AutomaticOutput; /*!< Specifies whether the TIM Automatic Output feature is enabled or not. + This parameter can be a value of @ref TIM_LL_EC_AUTOMATICOUTPUT_ENABLE + + This feature can be modified afterwards using unitary functions + @ref LL_TIM_EnableAutomaticOutput() or @ref LL_TIM_DisableAutomaticOutput() + + @note This bit-field can not be modified as long as LOCK level 1 has been + programmed. */ +} LL_TIM_BDTR_InitTypeDef; + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup TIM_LL_Exported_Constants TIM Exported Constants + * @{ + */ + +/** @defgroup TIM_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_TIM_ReadReg function. + * @{ + */ +#define LL_TIM_SR_UIF TIM_SR_UIF /*!< Update interrupt flag */ +#define LL_TIM_SR_CC1IF TIM_SR_CC1IF /*!< Capture/compare 1 interrupt flag */ +#define LL_TIM_SR_CC2IF TIM_SR_CC2IF /*!< Capture/compare 2 interrupt flag */ +#define LL_TIM_SR_CC3IF TIM_SR_CC3IF /*!< Capture/compare 3 interrupt flag */ +#define LL_TIM_SR_CC4IF TIM_SR_CC4IF /*!< Capture/compare 4 interrupt flag */ +#define LL_TIM_SR_COMIF TIM_SR_COMIF /*!< COM interrupt flag */ +#define LL_TIM_SR_TIF TIM_SR_TIF /*!< Trigger interrupt flag */ +#define LL_TIM_SR_BIF TIM_SR_BIF /*!< Break interrupt flag */ +#define LL_TIM_SR_CC1OF TIM_SR_CC1OF /*!< Capture/Compare 1 overcapture flag */ +#define LL_TIM_SR_CC2OF TIM_SR_CC2OF /*!< Capture/Compare 2 overcapture flag */ +#define LL_TIM_SR_CC3OF TIM_SR_CC3OF /*!< Capture/Compare 3 overcapture flag */ +#define LL_TIM_SR_CC4OF TIM_SR_CC4OF /*!< Capture/Compare 4 overcapture flag */ +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup TIM_LL_EC_BREAK_ENABLE Break Enable + * @{ + */ +#define LL_TIM_BREAK_DISABLE 0x00000000U /*!< Break function disabled */ +#define LL_TIM_BREAK_ENABLE TIM_BDTR_BKE /*!< Break function enabled */ +/** + * @} + */ + +/** @defgroup TIM_LL_EC_AUTOMATICOUTPUT_ENABLE Automatic output enable + * @{ + */ +#define LL_TIM_AUTOMATICOUTPUT_DISABLE 0x00000000U /*!< MOE can be set only by software */ +#define LL_TIM_AUTOMATICOUTPUT_ENABLE TIM_BDTR_AOE /*!< MOE can be set by software or automatically at the next update event */ +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** @defgroup TIM_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_TIM_ReadReg and LL_TIM_WriteReg functions. + * @{ + */ +#define LL_TIM_DIER_UIE TIM_DIER_UIE /*!< Update interrupt enable */ +#define LL_TIM_DIER_CC1IE TIM_DIER_CC1IE /*!< Capture/compare 1 interrupt enable */ +#define LL_TIM_DIER_CC2IE TIM_DIER_CC2IE /*!< Capture/compare 2 interrupt enable */ +#define LL_TIM_DIER_CC3IE TIM_DIER_CC3IE /*!< Capture/compare 3 interrupt enable */ +#define LL_TIM_DIER_CC4IE TIM_DIER_CC4IE /*!< Capture/compare 4 interrupt enable */ +#define LL_TIM_DIER_COMIE TIM_DIER_COMIE /*!< COM interrupt enable */ +#define LL_TIM_DIER_TIE TIM_DIER_TIE /*!< Trigger interrupt enable */ +#define LL_TIM_DIER_BIE TIM_DIER_BIE /*!< Break interrupt enable */ +/** + * @} + */ + +/** @defgroup TIM_LL_EC_UPDATESOURCE Update Source + * @{ + */ +#define LL_TIM_UPDATESOURCE_REGULAR 0x00000000U /*!< Counter overflow/underflow, Setting the UG bit or Update generation through the slave mode controller generates an update request */ +#define LL_TIM_UPDATESOURCE_COUNTER TIM_CR1_URS /*!< Only counter overflow/underflow generates an update request */ +/** + * @} + */ + +/** @defgroup TIM_LL_EC_ONEPULSEMODE One Pulse Mode + * @{ + */ +#define LL_TIM_ONEPULSEMODE_SINGLE TIM_CR1_OPM /*!< Counter stops counting at the next update event */ +#define LL_TIM_ONEPULSEMODE_REPETITIVE 0x00000000U /*!< Counter is not stopped at update event */ +/** + * @} + */ + +/** @defgroup TIM_LL_EC_COUNTERMODE Counter Mode + * @{ + */ +#define LL_TIM_COUNTERMODE_UP 0x00000000U /*!< Counter used as upcounter */ +#define LL_TIM_COUNTERMODE_DOWN TIM_CR1_DIR /*!< Counter used as downcounter */ +#define LL_TIM_COUNTERMODE_CENTER_DOWN TIM_CR1_CMS_0 /*!< The counter counts up and down alternatively. Output compare interrupt flags of output channels are set only when the counter is counting down. */ +#define LL_TIM_COUNTERMODE_CENTER_UP TIM_CR1_CMS_1 /*!< The counter counts up and down alternatively. Output compare interrupt flags of output channels are set only when the counter is counting up */ +#define LL_TIM_COUNTERMODE_CENTER_UP_DOWN TIM_CR1_CMS /*!< The counter counts up and down alternatively. Output compare interrupt flags of output channels are set only when the counter is counting up or down. */ +/** + * @} + */ + +/** @defgroup TIM_LL_EC_CLOCKDIVISION Clock Division + * @{ + */ +#define LL_TIM_CLOCKDIVISION_DIV1 0x00000000U /*!< tDTS=tCK_INT */ +#define LL_TIM_CLOCKDIVISION_DIV2 TIM_CR1_CKD_0 /*!< tDTS=2*tCK_INT */ +#define LL_TIM_CLOCKDIVISION_DIV4 TIM_CR1_CKD_1 /*!< tDTS=4*tCK_INT */ +/** + * @} + */ + +/** @defgroup TIM_LL_EC_COUNTERDIRECTION Counter Direction + * @{ + */ +#define LL_TIM_COUNTERDIRECTION_UP 0x00000000U /*!< Timer counter counts up */ +#define LL_TIM_COUNTERDIRECTION_DOWN TIM_CR1_DIR /*!< Timer counter counts down */ +/** + * @} + */ + +/** @defgroup TIM_LL_EC_CCUPDATESOURCE Capture Compare Update Source + * @{ + */ +#define LL_TIM_CCUPDATESOURCE_COMG_ONLY 0x00000000U /*!< Capture/compare control bits are updated by setting the COMG bit only */ +#define LL_TIM_CCUPDATESOURCE_COMG_AND_TRGI TIM_CR2_CCUS /*!< Capture/compare control bits are updated by setting the COMG bit or when a rising edge occurs on trigger input (TRGI) */ +/** + * @} + */ + +/** @defgroup TIM_LL_EC_CCDMAREQUEST Capture Compare DMA Request + * @{ + */ +#define LL_TIM_CCDMAREQUEST_CC 0x00000000U /*!< CCx DMA request sent when CCx event occurs */ +#define LL_TIM_CCDMAREQUEST_UPDATE TIM_CR2_CCDS /*!< CCx DMA requests sent when update event occurs */ +/** + * @} + */ + +/** @defgroup TIM_LL_EC_LOCKLEVEL Lock Level + * @{ + */ +#define LL_TIM_LOCKLEVEL_OFF 0x00000000U /*!< LOCK OFF - No bit is write protected */ +#define LL_TIM_LOCKLEVEL_1 TIM_BDTR_LOCK_0 /*!< LOCK Level 1 */ +#define LL_TIM_LOCKLEVEL_2 TIM_BDTR_LOCK_1 /*!< LOCK Level 2 */ +#define LL_TIM_LOCKLEVEL_3 TIM_BDTR_LOCK /*!< LOCK Level 3 */ +/** + * @} + */ + +/** @defgroup TIM_LL_EC_CHANNEL Channel + * @{ + */ +#define LL_TIM_CHANNEL_CH1 TIM_CCER_CC1E /*!< Timer input/output channel 1 */ +#define LL_TIM_CHANNEL_CH1N TIM_CCER_CC1NE /*!< Timer complementary output channel 1 */ +#define LL_TIM_CHANNEL_CH2 TIM_CCER_CC2E /*!< Timer input/output channel 2 */ +#define LL_TIM_CHANNEL_CH2N TIM_CCER_CC2NE /*!< Timer complementary output channel 2 */ +#define LL_TIM_CHANNEL_CH3 TIM_CCER_CC3E /*!< Timer input/output channel 3 */ +#define LL_TIM_CHANNEL_CH3N TIM_CCER_CC3NE /*!< Timer complementary output channel 3 */ +#define LL_TIM_CHANNEL_CH4 TIM_CCER_CC4E /*!< Timer input/output channel 4 */ +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup TIM_LL_EC_OCSTATE Output Configuration State + * @{ + */ +#define LL_TIM_OCSTATE_DISABLE 0x00000000U /*!< OCx is not active */ +#define LL_TIM_OCSTATE_ENABLE TIM_CCER_CC1E /*!< OCx signal is output on the corresponding output pin */ +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** @defgroup TIM_LL_EC_OCMODE Output Configuration Mode + * @{ + */ +#define LL_TIM_OCMODE_FROZEN 0x00000000U /*!TIMx_CCRy else active.*/ +#define LL_TIM_OCMODE_PWM2 (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!TIMx_CCRy else inactive*/ +/** + * @} + */ + +/** @defgroup TIM_LL_EC_OCPOLARITY Output Configuration Polarity + * @{ + */ +#define LL_TIM_OCPOLARITY_HIGH 0x00000000U /*!< OCxactive high*/ +#define LL_TIM_OCPOLARITY_LOW TIM_CCER_CC1P /*!< OCxactive low*/ +/** + * @} + */ + +/** @defgroup TIM_LL_EC_OCIDLESTATE Output Configuration Idle State + * @{ + */ +#define LL_TIM_OCIDLESTATE_LOW 0x00000000U /*!__REG__, (__VALUE__)) + +/** + * @brief Read a value in TIM register. + * @param __INSTANCE__ TIM Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_TIM_ReadReg(__INSTANCE__, __REG__) READ_REG((__INSTANCE__)->__REG__) +/** + * @} + */ + +/** + * @brief HELPER macro calculating DTG[0:7] in the TIMx_BDTR register to achieve the requested dead time duration. + * @note ex: @ref __LL_TIM_CALC_DEADTIME (80000000, @ref LL_TIM_GetClockDivision (), 120); + * @param __TIMCLK__ timer input clock frequency (in Hz) + * @param __CKD__ This parameter can be one of the following values: + * @arg @ref LL_TIM_CLOCKDIVISION_DIV1 + * @arg @ref LL_TIM_CLOCKDIVISION_DIV2 + * @arg @ref LL_TIM_CLOCKDIVISION_DIV4 + * @param __DT__ deadtime duration (in ns) + * @retval DTG[0:7] + */ +#define __LL_TIM_CALC_DEADTIME(__TIMCLK__, __CKD__, __DT__) \ + ( (((uint64_t)((__DT__)*1000U)) < ((DT_DELAY_1+1U) * TIM_CALC_DTS((__TIMCLK__), (__CKD__)))) ? \ + (uint8_t)(((uint64_t)((__DT__)*1000U) / TIM_CALC_DTS((__TIMCLK__), (__CKD__))) & DT_DELAY_1) : \ + (((uint64_t)((__DT__)*1000U)) < ((64U + (DT_DELAY_2+1U)) * 2U * TIM_CALC_DTS((__TIMCLK__), (__CKD__)))) ? \ + (uint8_t)(DT_RANGE_2 | ((uint8_t)((uint8_t)((((uint64_t)((__DT__)*1000U))/ TIM_CALC_DTS((__TIMCLK__), \ + (__CKD__))) >> 1U) - (uint8_t) 64) & DT_DELAY_2)) :\ + (((uint64_t)((__DT__)*1000U)) < ((32U + (DT_DELAY_3+1U)) * 8U * TIM_CALC_DTS((__TIMCLK__), (__CKD__)))) ? \ + (uint8_t)(DT_RANGE_3 | ((uint8_t)((uint8_t)(((((uint64_t)(__DT__)*1000U))/ TIM_CALC_DTS((__TIMCLK__), \ + (__CKD__))) >> 3U) - (uint8_t) 32) & DT_DELAY_3)) :\ + (((uint64_t)((__DT__)*1000U)) < ((32U + (DT_DELAY_4+1U)) * 16U * TIM_CALC_DTS((__TIMCLK__), (__CKD__)))) ? \ + (uint8_t)(DT_RANGE_4 | ((uint8_t)((uint8_t)(((((uint64_t)(__DT__)*1000U))/ TIM_CALC_DTS((__TIMCLK__), \ + (__CKD__))) >> 4U) - (uint8_t) 32) & DT_DELAY_4)) :\ + 0U) + +/** + * @brief HELPER macro calculating the prescaler value to achieve the required counter clock frequency. + * @note ex: @ref __LL_TIM_CALC_PSC (80000000, 1000000); + * @param __TIMCLK__ timer input clock frequency (in Hz) + * @param __CNTCLK__ counter clock frequency (in Hz) + * @retval Prescaler value (between Min_Data=0 and Max_Data=65535) + */ +#define __LL_TIM_CALC_PSC(__TIMCLK__, __CNTCLK__) \ + (((__TIMCLK__) >= (__CNTCLK__)) ? (uint32_t)((((__TIMCLK__) + (__CNTCLK__)/2U)/(__CNTCLK__)) - 1U) : 0U) + +/** + * @brief HELPER macro calculating the auto-reload value to achieve the required output signal frequency. + * @note ex: @ref __LL_TIM_CALC_ARR (1000000, @ref LL_TIM_GetPrescaler (), 10000); + * @param __TIMCLK__ timer input clock frequency (in Hz) + * @param __PSC__ prescaler + * @param __FREQ__ output signal frequency (in Hz) + * @retval Auto-reload value (between Min_Data=0 and Max_Data=65535) + */ +#define __LL_TIM_CALC_ARR(__TIMCLK__, __PSC__, __FREQ__) \ + ((((__TIMCLK__)/((__PSC__) + 1U)) >= (__FREQ__)) ? (((__TIMCLK__)/((__FREQ__) * ((__PSC__) + 1U))) - 1U) : 0U) + +/** + * @brief HELPER macro calculating the compare value required to achieve the required timer output compare + * active/inactive delay. + * @note ex: @ref __LL_TIM_CALC_DELAY (1000000, @ref LL_TIM_GetPrescaler (), 10); + * @param __TIMCLK__ timer input clock frequency (in Hz) + * @param __PSC__ prescaler + * @param __DELAY__ timer output compare active/inactive delay (in us) + * @retval Compare value (between Min_Data=0 and Max_Data=65535) + */ +#define __LL_TIM_CALC_DELAY(__TIMCLK__, __PSC__, __DELAY__) \ + ((uint32_t)(((uint64_t)(__TIMCLK__) * (uint64_t)(__DELAY__)) \ + / ((uint64_t)1000000U * (uint64_t)((__PSC__) + 1U)))) + +/** + * @brief HELPER macro calculating the auto-reload value to achieve the required pulse duration + * (when the timer operates in one pulse mode). + * @note ex: @ref __LL_TIM_CALC_PULSE (1000000, @ref LL_TIM_GetPrescaler (), 10, 20); + * @param __TIMCLK__ timer input clock frequency (in Hz) + * @param __PSC__ prescaler + * @param __DELAY__ timer output compare active/inactive delay (in us) + * @param __PULSE__ pulse duration (in us) + * @retval Auto-reload value (between Min_Data=0 and Max_Data=65535) + */ +#define __LL_TIM_CALC_PULSE(__TIMCLK__, __PSC__, __DELAY__, __PULSE__) \ + ((uint32_t)(__LL_TIM_CALC_DELAY((__TIMCLK__), (__PSC__), (__PULSE__)) \ + + __LL_TIM_CALC_DELAY((__TIMCLK__), (__PSC__), (__DELAY__)))) + +/** + * @brief HELPER macro retrieving the ratio of the input capture prescaler + * @note ex: @ref __LL_TIM_GET_ICPSC_RATIO (@ref LL_TIM_IC_GetPrescaler ()); + * @param __ICPSC__ This parameter can be one of the following values: + * @arg @ref LL_TIM_ICPSC_DIV1 + * @arg @ref LL_TIM_ICPSC_DIV2 + * @arg @ref LL_TIM_ICPSC_DIV4 + * @arg @ref LL_TIM_ICPSC_DIV8 + * @retval Input capture prescaler ratio (1, 2, 4 or 8) + */ +#define __LL_TIM_GET_ICPSC_RATIO(__ICPSC__) \ + ((uint32_t)(0x01U << (((__ICPSC__) >> 16U) >> TIM_CCMR1_IC1PSC_Pos))) + + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup TIM_LL_Exported_Functions TIM Exported Functions + * @{ + */ + +/** @defgroup TIM_LL_EF_Time_Base Time Base configuration + * @{ + */ +/** + * @brief Enable timer counter. + * @rmtoll CR1 CEN LL_TIM_EnableCounter + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableCounter(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->CR1, TIM_CR1_CEN); +} + +/** + * @brief Disable timer counter. + * @rmtoll CR1 CEN LL_TIM_DisableCounter + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableCounter(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->CR1, TIM_CR1_CEN); +} + +/** + * @brief Indicates whether the timer counter is enabled. + * @rmtoll CR1 CEN LL_TIM_IsEnabledCounter + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledCounter(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->CR1, TIM_CR1_CEN) == (TIM_CR1_CEN)) ? 1UL : 0UL); +} + +/** + * @brief Enable update event generation. + * @rmtoll CR1 UDIS LL_TIM_EnableUpdateEvent + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableUpdateEvent(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->CR1, TIM_CR1_UDIS); +} + +/** + * @brief Disable update event generation. + * @rmtoll CR1 UDIS LL_TIM_DisableUpdateEvent + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableUpdateEvent(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->CR1, TIM_CR1_UDIS); +} + +/** + * @brief Indicates whether update event generation is enabled. + * @rmtoll CR1 UDIS LL_TIM_IsEnabledUpdateEvent + * @param TIMx Timer instance + * @retval Inverted state of bit (0 or 1). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledUpdateEvent(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->CR1, TIM_CR1_UDIS) == (uint32_t)RESET) ? 1UL : 0UL); +} + +/** + * @brief Set update event source + * @note Update event source set to LL_TIM_UPDATESOURCE_REGULAR: 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 + * @note Update event source set to LL_TIM_UPDATESOURCE_COUNTER: only counter + * overflow/underflow generates an update interrupt or DMA request if enabled. + * @rmtoll CR1 URS LL_TIM_SetUpdateSource + * @param TIMx Timer instance + * @param UpdateSource This parameter can be one of the following values: + * @arg @ref LL_TIM_UPDATESOURCE_REGULAR + * @arg @ref LL_TIM_UPDATESOURCE_COUNTER + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetUpdateSource(TIM_TypeDef *TIMx, uint32_t UpdateSource) +{ + MODIFY_REG(TIMx->CR1, TIM_CR1_URS, UpdateSource); +} + +/** + * @brief Get actual event update source + * @rmtoll CR1 URS LL_TIM_GetUpdateSource + * @param TIMx Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_UPDATESOURCE_REGULAR + * @arg @ref LL_TIM_UPDATESOURCE_COUNTER + */ +__STATIC_INLINE uint32_t LL_TIM_GetUpdateSource(const TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_URS)); +} + +/** + * @brief Set one pulse mode (one shot v.s. repetitive). + * @rmtoll CR1 OPM LL_TIM_SetOnePulseMode + * @param TIMx Timer instance + * @param OnePulseMode This parameter can be one of the following values: + * @arg @ref LL_TIM_ONEPULSEMODE_SINGLE + * @arg @ref LL_TIM_ONEPULSEMODE_REPETITIVE + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetOnePulseMode(TIM_TypeDef *TIMx, uint32_t OnePulseMode) +{ + MODIFY_REG(TIMx->CR1, TIM_CR1_OPM, OnePulseMode); +} + +/** + * @brief Get actual one pulse mode. + * @rmtoll CR1 OPM LL_TIM_GetOnePulseMode + * @param TIMx Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_ONEPULSEMODE_SINGLE + * @arg @ref LL_TIM_ONEPULSEMODE_REPETITIVE + */ +__STATIC_INLINE uint32_t LL_TIM_GetOnePulseMode(const TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_OPM)); +} + +/** + * @brief Set the timer counter counting mode. + * @note Macro IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx) can be used to + * check whether or not the counter mode selection feature is supported + * by a timer instance. + * @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. + * @rmtoll CR1 DIR LL_TIM_SetCounterMode\n + * CR1 CMS LL_TIM_SetCounterMode + * @param TIMx Timer instance + * @param CounterMode This parameter can be one of the following values: + * @arg @ref LL_TIM_COUNTERMODE_UP + * @arg @ref LL_TIM_COUNTERMODE_DOWN + * @arg @ref LL_TIM_COUNTERMODE_CENTER_UP + * @arg @ref LL_TIM_COUNTERMODE_CENTER_DOWN + * @arg @ref LL_TIM_COUNTERMODE_CENTER_UP_DOWN + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetCounterMode(TIM_TypeDef *TIMx, uint32_t CounterMode) +{ + MODIFY_REG(TIMx->CR1, (TIM_CR1_DIR | TIM_CR1_CMS), CounterMode); +} + +/** + * @brief Get actual counter mode. + * @note Macro IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx) can be used to + * check whether or not the counter mode selection feature is supported + * by a timer instance. + * @rmtoll CR1 DIR LL_TIM_GetCounterMode\n + * CR1 CMS LL_TIM_GetCounterMode + * @param TIMx Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_COUNTERMODE_UP + * @arg @ref LL_TIM_COUNTERMODE_DOWN + * @arg @ref LL_TIM_COUNTERMODE_CENTER_UP + * @arg @ref LL_TIM_COUNTERMODE_CENTER_DOWN + * @arg @ref LL_TIM_COUNTERMODE_CENTER_UP_DOWN + */ +__STATIC_INLINE uint32_t LL_TIM_GetCounterMode(const TIM_TypeDef *TIMx) +{ + uint32_t counter_mode; + + counter_mode = (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_CMS)); + + if (counter_mode == 0U) + { + counter_mode = (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_DIR)); + } + + return counter_mode; +} + +/** + * @brief Enable auto-reload (ARR) preload. + * @rmtoll CR1 ARPE LL_TIM_EnableARRPreload + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableARRPreload(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->CR1, TIM_CR1_ARPE); +} + +/** + * @brief Disable auto-reload (ARR) preload. + * @rmtoll CR1 ARPE LL_TIM_DisableARRPreload + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableARRPreload(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->CR1, TIM_CR1_ARPE); +} + +/** + * @brief Indicates whether auto-reload (ARR) preload is enabled. + * @rmtoll CR1 ARPE LL_TIM_IsEnabledARRPreload + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledARRPreload(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->CR1, TIM_CR1_ARPE) == (TIM_CR1_ARPE)) ? 1UL : 0UL); +} + +/** + * @brief Set the division ratio between the timer clock and the sampling clock used by the dead-time generators + * (when supported) and the digital filters. + * @note Macro IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx) can be used to check + * whether or not the clock division feature is supported by the timer + * instance. + * @rmtoll CR1 CKD LL_TIM_SetClockDivision + * @param TIMx Timer instance + * @param ClockDivision This parameter can be one of the following values: + * @arg @ref LL_TIM_CLOCKDIVISION_DIV1 + * @arg @ref LL_TIM_CLOCKDIVISION_DIV2 + * @arg @ref LL_TIM_CLOCKDIVISION_DIV4 + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetClockDivision(TIM_TypeDef *TIMx, uint32_t ClockDivision) +{ + MODIFY_REG(TIMx->CR1, TIM_CR1_CKD, ClockDivision); +} + +/** + * @brief Get the actual division ratio between the timer clock and the sampling clock used by the dead-time + * generators (when supported) and the digital filters. + * @note Macro IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx) can be used to check + * whether or not the clock division feature is supported by the timer + * instance. + * @rmtoll CR1 CKD LL_TIM_GetClockDivision + * @param TIMx Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_CLOCKDIVISION_DIV1 + * @arg @ref LL_TIM_CLOCKDIVISION_DIV2 + * @arg @ref LL_TIM_CLOCKDIVISION_DIV4 + */ +__STATIC_INLINE uint32_t LL_TIM_GetClockDivision(const TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_CKD)); +} + +/** + * @brief Set the counter value. + * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @rmtoll CNT CNT LL_TIM_SetCounter + * @param TIMx Timer instance + * @param Counter Counter value (between Min_Data=0 and Max_Data=0xFFFF or 0xFFFFFFFF) + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetCounter(TIM_TypeDef *TIMx, uint32_t Counter) +{ + WRITE_REG(TIMx->CNT, Counter); +} + +/** + * @brief Get the counter value. + * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @rmtoll CNT CNT LL_TIM_GetCounter + * @param TIMx Timer instance + * @retval Counter value (between Min_Data=0 and Max_Data=0xFFFF or 0xFFFFFFFF) + */ +__STATIC_INLINE uint32_t LL_TIM_GetCounter(const TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->CNT)); +} + +/** + * @brief Get the current direction of the counter + * @rmtoll CR1 DIR LL_TIM_GetDirection + * @param TIMx Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_COUNTERDIRECTION_UP + * @arg @ref LL_TIM_COUNTERDIRECTION_DOWN + */ +__STATIC_INLINE uint32_t LL_TIM_GetDirection(const TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_DIR)); +} + +/** + * @brief Set the prescaler value. + * @note The counter clock frequency CK_CNT is equal to fCK_PSC / (PSC[15:0] + 1). + * @note The prescaler can be changed on the fly as this control register is buffered. The new + * prescaler ratio is taken into account at the next update event. + * @note Helper macro @ref __LL_TIM_CALC_PSC can be used to calculate the Prescaler parameter + * @rmtoll PSC PSC LL_TIM_SetPrescaler + * @param TIMx Timer instance + * @param Prescaler between Min_Data=0 and Max_Data=65535 + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetPrescaler(TIM_TypeDef *TIMx, uint32_t Prescaler) +{ + WRITE_REG(TIMx->PSC, Prescaler); +} + +/** + * @brief Get the prescaler value. + * @rmtoll PSC PSC LL_TIM_GetPrescaler + * @param TIMx Timer instance + * @retval Prescaler value between Min_Data=0 and Max_Data=65535 + */ +__STATIC_INLINE uint32_t LL_TIM_GetPrescaler(const TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->PSC)); +} + +/** + * @brief Set the auto-reload value. + * @note The counter is blocked while the auto-reload value is null. + * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Helper macro @ref __LL_TIM_CALC_ARR can be used to calculate the AutoReload parameter + * @rmtoll ARR ARR LL_TIM_SetAutoReload + * @param TIMx Timer instance + * @param AutoReload between Min_Data=0 and Max_Data=65535 + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetAutoReload(TIM_TypeDef *TIMx, uint32_t AutoReload) +{ + WRITE_REG(TIMx->ARR, AutoReload); +} + +/** + * @brief Get the auto-reload value. + * @rmtoll ARR ARR LL_TIM_GetAutoReload + * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @param TIMx Timer instance + * @retval Auto-reload value + */ +__STATIC_INLINE uint32_t LL_TIM_GetAutoReload(const TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->ARR)); +} + +/** + * @brief Set the repetition counter value. + * @note Macro IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a repetition counter. + * @rmtoll RCR REP LL_TIM_SetRepetitionCounter + * @param TIMx Timer instance + * @param RepetitionCounter between Min_Data=0 and Max_Data=255 or 65535 for advanced timer. + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetRepetitionCounter(TIM_TypeDef *TIMx, uint32_t RepetitionCounter) +{ + WRITE_REG(TIMx->RCR, RepetitionCounter); +} + +/** + * @brief Get the repetition counter value. + * @note Macro IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a repetition counter. + * @rmtoll RCR REP LL_TIM_GetRepetitionCounter + * @param TIMx Timer instance + * @retval Repetition counter value + */ +__STATIC_INLINE uint32_t LL_TIM_GetRepetitionCounter(const TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->RCR)); +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_Capture_Compare Capture Compare configuration + * @{ + */ +/** + * @brief Enable the capture/compare control bits (CCxE, CCxNE and OCxM) preload. + * @note CCxE, CCxNE and OCxM bits are preloaded, after having been written, + * they are updated only when a commutation event (COM) occurs. + * @note Only on channels that have a complementary output. + * @note Macro IS_TIM_COMMUTATION_EVENT_INSTANCE(TIMx) can be used to check + * whether or not a timer instance is able to generate a commutation event. + * @rmtoll CR2 CCPC LL_TIM_CC_EnablePreload + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_CC_EnablePreload(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->CR2, TIM_CR2_CCPC); +} + +/** + * @brief Disable the capture/compare control bits (CCxE, CCxNE and OCxM) preload. + * @note Macro IS_TIM_COMMUTATION_EVENT_INSTANCE(TIMx) can be used to check + * whether or not a timer instance is able to generate a commutation event. + * @rmtoll CR2 CCPC LL_TIM_CC_DisablePreload + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_CC_DisablePreload(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->CR2, TIM_CR2_CCPC); +} + +/** + * @brief Indicates whether the capture/compare control bits (CCxE, CCxNE and OCxM) preload is enabled. + * @rmtoll CR2 CCPC LL_TIM_CC_IsEnabledPreload + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_CC_IsEnabledPreload(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->CR2, TIM_CR2_CCPC) == (TIM_CR2_CCPC)) ? 1UL : 0UL); +} + +/** + * @brief Set the updated source of the capture/compare control bits (CCxE, CCxNE and OCxM). + * @note Macro IS_TIM_COMMUTATION_EVENT_INSTANCE(TIMx) can be used to check + * whether or not a timer instance is able to generate a commutation event. + * @rmtoll CR2 CCUS LL_TIM_CC_SetUpdate + * @param TIMx Timer instance + * @param CCUpdateSource This parameter can be one of the following values: + * @arg @ref LL_TIM_CCUPDATESOURCE_COMG_ONLY + * @arg @ref LL_TIM_CCUPDATESOURCE_COMG_AND_TRGI + * @retval None + */ +__STATIC_INLINE void LL_TIM_CC_SetUpdate(TIM_TypeDef *TIMx, uint32_t CCUpdateSource) +{ + MODIFY_REG(TIMx->CR2, TIM_CR2_CCUS, CCUpdateSource); +} + +/** + * @brief Set the trigger of the capture/compare DMA request. + * @rmtoll CR2 CCDS LL_TIM_CC_SetDMAReqTrigger + * @param TIMx Timer instance + * @param DMAReqTrigger This parameter can be one of the following values: + * @arg @ref LL_TIM_CCDMAREQUEST_CC + * @arg @ref LL_TIM_CCDMAREQUEST_UPDATE + * @retval None + */ +__STATIC_INLINE void LL_TIM_CC_SetDMAReqTrigger(TIM_TypeDef *TIMx, uint32_t DMAReqTrigger) +{ + MODIFY_REG(TIMx->CR2, TIM_CR2_CCDS, DMAReqTrigger); +} + +/** + * @brief Get actual trigger of the capture/compare DMA request. + * @rmtoll CR2 CCDS LL_TIM_CC_GetDMAReqTrigger + * @param TIMx Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_CCDMAREQUEST_CC + * @arg @ref LL_TIM_CCDMAREQUEST_UPDATE + */ +__STATIC_INLINE uint32_t LL_TIM_CC_GetDMAReqTrigger(const TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR2, TIM_CR2_CCDS)); +} + +/** + * @brief Set the lock level to freeze the + * configuration of several capture/compare parameters. + * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * the lock mechanism is supported by a timer instance. + * @rmtoll BDTR LOCK LL_TIM_CC_SetLockLevel + * @param TIMx Timer instance + * @param LockLevel This parameter can be one of the following values: + * @arg @ref LL_TIM_LOCKLEVEL_OFF + * @arg @ref LL_TIM_LOCKLEVEL_1 + * @arg @ref LL_TIM_LOCKLEVEL_2 + * @arg @ref LL_TIM_LOCKLEVEL_3 + * @retval None + */ +__STATIC_INLINE void LL_TIM_CC_SetLockLevel(TIM_TypeDef *TIMx, uint32_t LockLevel) +{ + MODIFY_REG(TIMx->BDTR, TIM_BDTR_LOCK, LockLevel); +} + +/** + * @brief Enable capture/compare channels. + * @rmtoll CCER CC1E LL_TIM_CC_EnableChannel\n + * CCER CC1NE LL_TIM_CC_EnableChannel\n + * CCER CC2E LL_TIM_CC_EnableChannel\n + * CCER CC2NE LL_TIM_CC_EnableChannel\n + * CCER CC3E LL_TIM_CC_EnableChannel\n + * CCER CC3NE LL_TIM_CC_EnableChannel\n + * CCER CC4E LL_TIM_CC_EnableChannel + * @param TIMx Timer instance + * @param Channels This parameter can be a combination of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH1N + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH2N + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH3N + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval None + */ +__STATIC_INLINE void LL_TIM_CC_EnableChannel(TIM_TypeDef *TIMx, uint32_t Channels) +{ + SET_BIT(TIMx->CCER, Channels); +} + +/** + * @brief Disable capture/compare channels. + * @rmtoll CCER CC1E LL_TIM_CC_DisableChannel\n + * CCER CC1NE LL_TIM_CC_DisableChannel\n + * CCER CC2E LL_TIM_CC_DisableChannel\n + * CCER CC2NE LL_TIM_CC_DisableChannel\n + * CCER CC3E LL_TIM_CC_DisableChannel\n + * CCER CC3NE LL_TIM_CC_DisableChannel\n + * CCER CC4E LL_TIM_CC_DisableChannel + * @param TIMx Timer instance + * @param Channels This parameter can be a combination of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH1N + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH2N + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH3N + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval None + */ +__STATIC_INLINE void LL_TIM_CC_DisableChannel(TIM_TypeDef *TIMx, uint32_t Channels) +{ + CLEAR_BIT(TIMx->CCER, Channels); +} + +/** + * @brief Indicate whether channel(s) is(are) enabled. + * @rmtoll CCER CC1E LL_TIM_CC_IsEnabledChannel\n + * CCER CC1NE LL_TIM_CC_IsEnabledChannel\n + * CCER CC2E LL_TIM_CC_IsEnabledChannel\n + * CCER CC2NE LL_TIM_CC_IsEnabledChannel\n + * CCER CC3E LL_TIM_CC_IsEnabledChannel\n + * CCER CC3NE LL_TIM_CC_IsEnabledChannel\n + * CCER CC4E LL_TIM_CC_IsEnabledChannel + * @param TIMx Timer instance + * @param Channels This parameter can be a combination of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH1N + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH2N + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH3N + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_CC_IsEnabledChannel(const TIM_TypeDef *TIMx, uint32_t Channels) +{ + return ((READ_BIT(TIMx->CCER, Channels) == (Channels)) ? 1UL : 0UL); +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_Output_Channel Output channel configuration + * @{ + */ +/** + * @brief Configure an output channel. + * @rmtoll CCMR1 CC1S LL_TIM_OC_ConfigOutput\n + * CCMR1 CC2S LL_TIM_OC_ConfigOutput\n + * CCMR2 CC3S LL_TIM_OC_ConfigOutput\n + * CCMR2 CC4S LL_TIM_OC_ConfigOutput\n + * CCER CC1P LL_TIM_OC_ConfigOutput\n + * CCER CC2P LL_TIM_OC_ConfigOutput\n + * CCER CC3P LL_TIM_OC_ConfigOutput\n + * CCER CC4P LL_TIM_OC_ConfigOutput\n + * CR2 OIS1 LL_TIM_OC_ConfigOutput\n + * CR2 OIS2 LL_TIM_OC_ConfigOutput\n + * CR2 OIS3 LL_TIM_OC_ConfigOutput\n + * CR2 OIS4 LL_TIM_OC_ConfigOutput + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @param Configuration This parameter must be a combination of all the following values: + * @arg @ref LL_TIM_OCPOLARITY_HIGH or @ref LL_TIM_OCPOLARITY_LOW + * @arg @ref LL_TIM_OCIDLESTATE_LOW or @ref LL_TIM_OCIDLESTATE_HIGH + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_ConfigOutput(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t Configuration) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + CLEAR_BIT(*pReg, (TIM_CCMR1_CC1S << SHIFT_TAB_OCxx[iChannel])); + MODIFY_REG(TIMx->CCER, (TIM_CCER_CC1P << SHIFT_TAB_CCxP[iChannel]), + (Configuration & TIM_CCER_CC1P) << SHIFT_TAB_CCxP[iChannel]); + MODIFY_REG(TIMx->CR2, (TIM_CR2_OIS1 << SHIFT_TAB_OISx[iChannel]), + (Configuration & TIM_CR2_OIS1) << SHIFT_TAB_OISx[iChannel]); +} + +/** + * @brief Define the behavior of the output reference signal OCxREF from which + * OCx and OCxN (when relevant) are derived. + * @rmtoll CCMR1 OC1M LL_TIM_OC_SetMode\n + * CCMR1 OC2M LL_TIM_OC_SetMode\n + * CCMR2 OC3M LL_TIM_OC_SetMode\n + * CCMR2 OC4M LL_TIM_OC_SetMode + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @param Mode This parameter can be one of the following values: + * @arg @ref LL_TIM_OCMODE_FROZEN + * @arg @ref LL_TIM_OCMODE_ACTIVE + * @arg @ref LL_TIM_OCMODE_INACTIVE + * @arg @ref LL_TIM_OCMODE_TOGGLE + * @arg @ref LL_TIM_OCMODE_FORCED_INACTIVE + * @arg @ref LL_TIM_OCMODE_FORCED_ACTIVE + * @arg @ref LL_TIM_OCMODE_PWM1 + * @arg @ref LL_TIM_OCMODE_PWM2 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_SetMode(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t Mode) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + MODIFY_REG(*pReg, ((TIM_CCMR1_OC1M | TIM_CCMR1_CC1S) << SHIFT_TAB_OCxx[iChannel]), Mode << SHIFT_TAB_OCxx[iChannel]); +} + +/** + * @brief Get the output compare mode of an output channel. + * @rmtoll CCMR1 OC1M LL_TIM_OC_GetMode\n + * CCMR1 OC2M LL_TIM_OC_GetMode\n + * CCMR2 OC3M LL_TIM_OC_GetMode\n + * CCMR2 OC4M LL_TIM_OC_GetMode + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_OCMODE_FROZEN + * @arg @ref LL_TIM_OCMODE_ACTIVE + * @arg @ref LL_TIM_OCMODE_INACTIVE + * @arg @ref LL_TIM_OCMODE_TOGGLE + * @arg @ref LL_TIM_OCMODE_FORCED_INACTIVE + * @arg @ref LL_TIM_OCMODE_FORCED_ACTIVE + * @arg @ref LL_TIM_OCMODE_PWM1 + * @arg @ref LL_TIM_OCMODE_PWM2 + */ +__STATIC_INLINE uint32_t LL_TIM_OC_GetMode(const TIM_TypeDef *TIMx, uint32_t Channel) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + return (READ_BIT(*pReg, ((TIM_CCMR1_OC1M | TIM_CCMR1_CC1S) << SHIFT_TAB_OCxx[iChannel])) >> SHIFT_TAB_OCxx[iChannel]); +} + +/** + * @brief Set the polarity of an output channel. + * @rmtoll CCER CC1P LL_TIM_OC_SetPolarity\n + * CCER CC1NP LL_TIM_OC_SetPolarity\n + * CCER CC2P LL_TIM_OC_SetPolarity\n + * CCER CC2NP LL_TIM_OC_SetPolarity\n + * CCER CC3P LL_TIM_OC_SetPolarity\n + * CCER CC3NP LL_TIM_OC_SetPolarity\n + * CCER CC4P LL_TIM_OC_SetPolarity + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH1N + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH2N + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH3N + * @arg @ref LL_TIM_CHANNEL_CH4 + * @param Polarity This parameter can be one of the following values: + * @arg @ref LL_TIM_OCPOLARITY_HIGH + * @arg @ref LL_TIM_OCPOLARITY_LOW + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_SetPolarity(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t Polarity) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + MODIFY_REG(TIMx->CCER, (TIM_CCER_CC1P << SHIFT_TAB_CCxP[iChannel]), Polarity << SHIFT_TAB_CCxP[iChannel]); +} + +/** + * @brief Get the polarity of an output channel. + * @rmtoll CCER CC1P LL_TIM_OC_GetPolarity\n + * CCER CC1NP LL_TIM_OC_GetPolarity\n + * CCER CC2P LL_TIM_OC_GetPolarity\n + * CCER CC2NP LL_TIM_OC_GetPolarity\n + * CCER CC3P LL_TIM_OC_GetPolarity\n + * CCER CC3NP LL_TIM_OC_GetPolarity\n + * CCER CC4P LL_TIM_OC_GetPolarity + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH1N + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH2N + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH3N + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_OCPOLARITY_HIGH + * @arg @ref LL_TIM_OCPOLARITY_LOW + */ +__STATIC_INLINE uint32_t LL_TIM_OC_GetPolarity(const TIM_TypeDef *TIMx, uint32_t Channel) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + return (READ_BIT(TIMx->CCER, (TIM_CCER_CC1P << SHIFT_TAB_CCxP[iChannel])) >> SHIFT_TAB_CCxP[iChannel]); +} + +/** + * @brief Set the IDLE state of an output channel + * @note This function is significant only for the timer instances + * supporting the break feature. Macro IS_TIM_BREAK_INSTANCE(TIMx) + * can be used to check whether or not a timer instance provides + * a break input. + * @rmtoll CR2 OIS1 LL_TIM_OC_SetIdleState\n + * CR2 OIS1N LL_TIM_OC_SetIdleState\n + * CR2 OIS2 LL_TIM_OC_SetIdleState\n + * CR2 OIS2N LL_TIM_OC_SetIdleState\n + * CR2 OIS3 LL_TIM_OC_SetIdleState\n + * CR2 OIS3N LL_TIM_OC_SetIdleState\n + * CR2 OIS4 LL_TIM_OC_SetIdleState + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH1N + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH2N + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH3N + * @arg @ref LL_TIM_CHANNEL_CH4 + * @param IdleState This parameter can be one of the following values: + * @arg @ref LL_TIM_OCIDLESTATE_LOW + * @arg @ref LL_TIM_OCIDLESTATE_HIGH + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_SetIdleState(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t IdleState) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + MODIFY_REG(TIMx->CR2, (TIM_CR2_OIS1 << SHIFT_TAB_OISx[iChannel]), IdleState << SHIFT_TAB_OISx[iChannel]); +} + +/** + * @brief Get the IDLE state of an output channel + * @rmtoll CR2 OIS1 LL_TIM_OC_GetIdleState\n + * CR2 OIS1N LL_TIM_OC_GetIdleState\n + * CR2 OIS2 LL_TIM_OC_GetIdleState\n + * CR2 OIS2N LL_TIM_OC_GetIdleState\n + * CR2 OIS3 LL_TIM_OC_GetIdleState\n + * CR2 OIS3N LL_TIM_OC_GetIdleState\n + * CR2 OIS4 LL_TIM_OC_GetIdleState + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH1N + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH2N + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH3N + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_OCIDLESTATE_LOW + * @arg @ref LL_TIM_OCIDLESTATE_HIGH + */ +__STATIC_INLINE uint32_t LL_TIM_OC_GetIdleState(const TIM_TypeDef *TIMx, uint32_t Channel) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + return (READ_BIT(TIMx->CR2, (TIM_CR2_OIS1 << SHIFT_TAB_OISx[iChannel])) >> SHIFT_TAB_OISx[iChannel]); +} + +/** + * @brief Enable fast mode for the output channel. + * @note Acts only if the channel is configured in PWM1 or PWM2 mode. + * @rmtoll CCMR1 OC1FE LL_TIM_OC_EnableFast\n + * CCMR1 OC2FE LL_TIM_OC_EnableFast\n + * CCMR2 OC3FE LL_TIM_OC_EnableFast\n + * CCMR2 OC4FE LL_TIM_OC_EnableFast + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_EnableFast(TIM_TypeDef *TIMx, uint32_t Channel) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + SET_BIT(*pReg, (TIM_CCMR1_OC1FE << SHIFT_TAB_OCxx[iChannel])); + +} + +/** + * @brief Disable fast mode for the output channel. + * @rmtoll CCMR1 OC1FE LL_TIM_OC_DisableFast\n + * CCMR1 OC2FE LL_TIM_OC_DisableFast\n + * CCMR2 OC3FE LL_TIM_OC_DisableFast\n + * CCMR2 OC4FE LL_TIM_OC_DisableFast + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_DisableFast(TIM_TypeDef *TIMx, uint32_t Channel) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + CLEAR_BIT(*pReg, (TIM_CCMR1_OC1FE << SHIFT_TAB_OCxx[iChannel])); + +} + +/** + * @brief Indicates whether fast mode is enabled for the output channel. + * @rmtoll CCMR1 OC1FE LL_TIM_OC_IsEnabledFast\n + * CCMR1 OC2FE LL_TIM_OC_IsEnabledFast\n + * CCMR2 OC3FE LL_TIM_OC_IsEnabledFast\n + * CCMR2 OC4FE LL_TIM_OC_IsEnabledFast\n + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_OC_IsEnabledFast(const TIM_TypeDef *TIMx, uint32_t Channel) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + uint32_t bitfield = TIM_CCMR1_OC1FE << SHIFT_TAB_OCxx[iChannel]; + return ((READ_BIT(*pReg, bitfield) == bitfield) ? 1UL : 0UL); +} + +/** + * @brief Enable compare register (TIMx_CCRx) preload for the output channel. + * @rmtoll CCMR1 OC1PE LL_TIM_OC_EnablePreload\n + * CCMR1 OC2PE LL_TIM_OC_EnablePreload\n + * CCMR2 OC3PE LL_TIM_OC_EnablePreload\n + * CCMR2 OC4PE LL_TIM_OC_EnablePreload + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_EnablePreload(TIM_TypeDef *TIMx, uint32_t Channel) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + SET_BIT(*pReg, (TIM_CCMR1_OC1PE << SHIFT_TAB_OCxx[iChannel])); +} + +/** + * @brief Disable compare register (TIMx_CCRx) preload for the output channel. + * @rmtoll CCMR1 OC1PE LL_TIM_OC_DisablePreload\n + * CCMR1 OC2PE LL_TIM_OC_DisablePreload\n + * CCMR2 OC3PE LL_TIM_OC_DisablePreload\n + * CCMR2 OC4PE LL_TIM_OC_DisablePreload + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_DisablePreload(TIM_TypeDef *TIMx, uint32_t Channel) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + CLEAR_BIT(*pReg, (TIM_CCMR1_OC1PE << SHIFT_TAB_OCxx[iChannel])); +} + +/** + * @brief Indicates whether compare register (TIMx_CCRx) preload is enabled for the output channel. + * @rmtoll CCMR1 OC1PE LL_TIM_OC_IsEnabledPreload\n + * CCMR1 OC2PE LL_TIM_OC_IsEnabledPreload\n + * CCMR2 OC3PE LL_TIM_OC_IsEnabledPreload\n + * CCMR2 OC4PE LL_TIM_OC_IsEnabledPreload\n + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_OC_IsEnabledPreload(const TIM_TypeDef *TIMx, uint32_t Channel) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + uint32_t bitfield = TIM_CCMR1_OC1PE << SHIFT_TAB_OCxx[iChannel]; + return ((READ_BIT(*pReg, bitfield) == bitfield) ? 1UL : 0UL); +} + +/** + * @brief Enable clearing the output channel on an external event. + * @note This function can only be used in Output compare and PWM modes. It does not work in Forced mode. + * @note Macro IS_TIM_OCXREF_CLEAR_INSTANCE(TIMx) can be used to check whether + * or not a timer instance can clear the OCxREF signal on an external event. + * @rmtoll CCMR1 OC1CE LL_TIM_OC_EnableClear\n + * CCMR1 OC2CE LL_TIM_OC_EnableClear\n + * CCMR2 OC3CE LL_TIM_OC_EnableClear\n + * CCMR2 OC4CE LL_TIM_OC_EnableClear + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_EnableClear(TIM_TypeDef *TIMx, uint32_t Channel) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + SET_BIT(*pReg, (TIM_CCMR1_OC1CE << SHIFT_TAB_OCxx[iChannel])); +} + +/** + * @brief Disable clearing the output channel on an external event. + * @note Macro IS_TIM_OCXREF_CLEAR_INSTANCE(TIMx) can be used to check whether + * or not a timer instance can clear the OCxREF signal on an external event. + * @rmtoll CCMR1 OC1CE LL_TIM_OC_DisableClear\n + * CCMR1 OC2CE LL_TIM_OC_DisableClear\n + * CCMR2 OC3CE LL_TIM_OC_DisableClear\n + * CCMR2 OC4CE LL_TIM_OC_DisableClear + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_DisableClear(TIM_TypeDef *TIMx, uint32_t Channel) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + CLEAR_BIT(*pReg, (TIM_CCMR1_OC1CE << SHIFT_TAB_OCxx[iChannel])); +} + +/** + * @brief Indicates clearing the output channel on an external event is enabled for the output channel. + * @note This function enables clearing the output channel on an external event. + * @note This function can only be used in Output compare and PWM modes. It does not work in Forced mode. + * @note Macro IS_TIM_OCXREF_CLEAR_INSTANCE(TIMx) can be used to check whether + * or not a timer instance can clear the OCxREF signal on an external event. + * @rmtoll CCMR1 OC1CE LL_TIM_OC_IsEnabledClear\n + * CCMR1 OC2CE LL_TIM_OC_IsEnabledClear\n + * CCMR2 OC3CE LL_TIM_OC_IsEnabledClear\n + * CCMR2 OC4CE LL_TIM_OC_IsEnabledClear\n + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_OC_IsEnabledClear(const TIM_TypeDef *TIMx, uint32_t Channel) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + uint32_t bitfield = TIM_CCMR1_OC1CE << SHIFT_TAB_OCxx[iChannel]; + return ((READ_BIT(*pReg, bitfield) == bitfield) ? 1UL : 0UL); +} + +/** + * @brief Set the dead-time delay (delay inserted between the rising edge of the OCxREF signal and the rising edge of + * the Ocx and OCxN signals). + * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * dead-time insertion feature is supported by a timer instance. + * @note Helper macro @ref __LL_TIM_CALC_DEADTIME can be used to calculate the DeadTime parameter + * @rmtoll BDTR DTG LL_TIM_OC_SetDeadTime + * @param TIMx Timer instance + * @param DeadTime between Min_Data=0 and Max_Data=255 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_SetDeadTime(TIM_TypeDef *TIMx, uint32_t DeadTime) +{ + MODIFY_REG(TIMx->BDTR, TIM_BDTR_DTG, DeadTime); +} + +/** + * @brief Set compare value for output channel 1 (TIMx_CCR1). + * @note In 32-bit timer implementations compare value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro IS_TIM_CC1_INSTANCE(TIMx) can be used to check whether or not + * output channel 1 is supported by a timer instance. + * @rmtoll CCR1 CCR1 LL_TIM_OC_SetCompareCH1 + * @param TIMx Timer instance + * @param CompareValue between Min_Data=0 and Max_Data=65535 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_SetCompareCH1(TIM_TypeDef *TIMx, uint32_t CompareValue) +{ + WRITE_REG(TIMx->CCR1, CompareValue); +} + +/** + * @brief Set compare value for output channel 2 (TIMx_CCR2). + * @note In 32-bit timer implementations compare value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro IS_TIM_CC2_INSTANCE(TIMx) can be used to check whether or not + * output channel 2 is supported by a timer instance. + * @rmtoll CCR2 CCR2 LL_TIM_OC_SetCompareCH2 + * @param TIMx Timer instance + * @param CompareValue between Min_Data=0 and Max_Data=65535 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_SetCompareCH2(TIM_TypeDef *TIMx, uint32_t CompareValue) +{ + WRITE_REG(TIMx->CCR2, CompareValue); +} + +/** + * @brief Set compare value for output channel 3 (TIMx_CCR3). + * @note In 32-bit timer implementations compare value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro IS_TIM_CC3_INSTANCE(TIMx) can be used to check whether or not + * output channel is supported by a timer instance. + * @rmtoll CCR3 CCR3 LL_TIM_OC_SetCompareCH3 + * @param TIMx Timer instance + * @param CompareValue between Min_Data=0 and Max_Data=65535 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_SetCompareCH3(TIM_TypeDef *TIMx, uint32_t CompareValue) +{ + WRITE_REG(TIMx->CCR3, CompareValue); +} + +/** + * @brief Set compare value for output channel 4 (TIMx_CCR4). + * @note In 32-bit timer implementations compare value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro IS_TIM_CC4_INSTANCE(TIMx) can be used to check whether or not + * output channel 4 is supported by a timer instance. + * @rmtoll CCR4 CCR4 LL_TIM_OC_SetCompareCH4 + * @param TIMx Timer instance + * @param CompareValue between Min_Data=0 and Max_Data=65535 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_SetCompareCH4(TIM_TypeDef *TIMx, uint32_t CompareValue) +{ + WRITE_REG(TIMx->CCR4, CompareValue); +} + +/** + * @brief Get compare value (TIMx_CCR1) set for output channel 1. + * @note In 32-bit timer implementations returned compare value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro IS_TIM_CC1_INSTANCE(TIMx) can be used to check whether or not + * output channel 1 is supported by a timer instance. + * @rmtoll CCR1 CCR1 LL_TIM_OC_GetCompareCH1 + * @param TIMx Timer instance + * @retval CompareValue (between Min_Data=0 and Max_Data=65535) + */ +__STATIC_INLINE uint32_t LL_TIM_OC_GetCompareCH1(const TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->CCR1)); +} + +/** + * @brief Get compare value (TIMx_CCR2) set for output channel 2. + * @note In 32-bit timer implementations returned compare value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro IS_TIM_CC2_INSTANCE(TIMx) can be used to check whether or not + * output channel 2 is supported by a timer instance. + * @rmtoll CCR2 CCR2 LL_TIM_OC_GetCompareCH2 + * @param TIMx Timer instance + * @retval CompareValue (between Min_Data=0 and Max_Data=65535) + */ +__STATIC_INLINE uint32_t LL_TIM_OC_GetCompareCH2(const TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->CCR2)); +} + +/** + * @brief Get compare value (TIMx_CCR3) set for output channel 3. + * @note In 32-bit timer implementations returned compare value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro IS_TIM_CC3_INSTANCE(TIMx) can be used to check whether or not + * output channel 3 is supported by a timer instance. + * @rmtoll CCR3 CCR3 LL_TIM_OC_GetCompareCH3 + * @param TIMx Timer instance + * @retval CompareValue (between Min_Data=0 and Max_Data=65535) + */ +__STATIC_INLINE uint32_t LL_TIM_OC_GetCompareCH3(const TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->CCR3)); +} + +/** + * @brief Get compare value (TIMx_CCR4) set for output channel 4. + * @note In 32-bit timer implementations returned compare value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro IS_TIM_CC4_INSTANCE(TIMx) can be used to check whether or not + * output channel 4 is supported by a timer instance. + * @rmtoll CCR4 CCR4 LL_TIM_OC_GetCompareCH4 + * @param TIMx Timer instance + * @retval CompareValue (between Min_Data=0 and Max_Data=65535) + */ +__STATIC_INLINE uint32_t LL_TIM_OC_GetCompareCH4(const TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->CCR4)); +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_Input_Channel Input channel configuration + * @{ + */ +/** + * @brief Configure input channel. + * @rmtoll CCMR1 CC1S LL_TIM_IC_Config\n + * CCMR1 IC1PSC LL_TIM_IC_Config\n + * CCMR1 IC1F LL_TIM_IC_Config\n + * CCMR1 CC2S LL_TIM_IC_Config\n + * CCMR1 IC2PSC LL_TIM_IC_Config\n + * CCMR1 IC2F LL_TIM_IC_Config\n + * CCMR2 CC3S LL_TIM_IC_Config\n + * CCMR2 IC3PSC LL_TIM_IC_Config\n + * CCMR2 IC3F LL_TIM_IC_Config\n + * CCMR2 CC4S LL_TIM_IC_Config\n + * CCMR2 IC4PSC LL_TIM_IC_Config\n + * CCMR2 IC4F LL_TIM_IC_Config\n + * CCER CC1P LL_TIM_IC_Config\n + * CCER CC1NP LL_TIM_IC_Config\n + * CCER CC2P LL_TIM_IC_Config\n + * CCER CC2NP LL_TIM_IC_Config\n + * CCER CC3P LL_TIM_IC_Config\n + * CCER CC3NP LL_TIM_IC_Config\n + * CCER CC4P LL_TIM_IC_Config\n + * CCER CC4NP LL_TIM_IC_Config + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @param Configuration This parameter must be a combination of all the following values: + * @arg @ref LL_TIM_ACTIVEINPUT_DIRECTTI or @ref LL_TIM_ACTIVEINPUT_INDIRECTTI or @ref LL_TIM_ACTIVEINPUT_TRC + * @arg @ref LL_TIM_ICPSC_DIV1 or ... or @ref LL_TIM_ICPSC_DIV8 + * @arg @ref LL_TIM_IC_FILTER_FDIV1 or ... or @ref LL_TIM_IC_FILTER_FDIV32_N8 + * @arg @ref LL_TIM_IC_POLARITY_RISING or @ref LL_TIM_IC_POLARITY_FALLING or @ref LL_TIM_IC_POLARITY_BOTHEDGE + * @retval None + */ +__STATIC_INLINE void LL_TIM_IC_Config(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t Configuration) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + MODIFY_REG(*pReg, ((TIM_CCMR1_IC1F | TIM_CCMR1_IC1PSC | TIM_CCMR1_CC1S) << SHIFT_TAB_ICxx[iChannel]), + ((Configuration >> 16U) & (TIM_CCMR1_IC1F | TIM_CCMR1_IC1PSC | TIM_CCMR1_CC1S)) \ + << SHIFT_TAB_ICxx[iChannel]); + MODIFY_REG(TIMx->CCER, ((TIM_CCER_CC1NP | TIM_CCER_CC1P) << SHIFT_TAB_CCxP[iChannel]), + (Configuration & (TIM_CCER_CC1NP | TIM_CCER_CC1P)) << SHIFT_TAB_CCxP[iChannel]); +} + +/** + * @brief Set the active input. + * @rmtoll CCMR1 CC1S LL_TIM_IC_SetActiveInput\n + * CCMR1 CC2S LL_TIM_IC_SetActiveInput\n + * CCMR2 CC3S LL_TIM_IC_SetActiveInput\n + * CCMR2 CC4S LL_TIM_IC_SetActiveInput + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @param ICActiveInput This parameter can be one of the following values: + * @arg @ref LL_TIM_ACTIVEINPUT_DIRECTTI + * @arg @ref LL_TIM_ACTIVEINPUT_INDIRECTTI + * @arg @ref LL_TIM_ACTIVEINPUT_TRC + * @retval None + */ +__STATIC_INLINE void LL_TIM_IC_SetActiveInput(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ICActiveInput) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + MODIFY_REG(*pReg, ((TIM_CCMR1_CC1S) << SHIFT_TAB_ICxx[iChannel]), (ICActiveInput >> 16U) << SHIFT_TAB_ICxx[iChannel]); +} + +/** + * @brief Get the current active input. + * @rmtoll CCMR1 CC1S LL_TIM_IC_GetActiveInput\n + * CCMR1 CC2S LL_TIM_IC_GetActiveInput\n + * CCMR2 CC3S LL_TIM_IC_GetActiveInput\n + * CCMR2 CC4S LL_TIM_IC_GetActiveInput + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_ACTIVEINPUT_DIRECTTI + * @arg @ref LL_TIM_ACTIVEINPUT_INDIRECTTI + * @arg @ref LL_TIM_ACTIVEINPUT_TRC + */ +__STATIC_INLINE uint32_t LL_TIM_IC_GetActiveInput(const TIM_TypeDef *TIMx, uint32_t Channel) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + return ((READ_BIT(*pReg, ((TIM_CCMR1_CC1S) << SHIFT_TAB_ICxx[iChannel])) >> SHIFT_TAB_ICxx[iChannel]) << 16U); +} + +/** + * @brief Set the prescaler of input channel. + * @rmtoll CCMR1 IC1PSC LL_TIM_IC_SetPrescaler\n + * CCMR1 IC2PSC LL_TIM_IC_SetPrescaler\n + * CCMR2 IC3PSC LL_TIM_IC_SetPrescaler\n + * CCMR2 IC4PSC LL_TIM_IC_SetPrescaler + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @param ICPrescaler This parameter can be one of the following values: + * @arg @ref LL_TIM_ICPSC_DIV1 + * @arg @ref LL_TIM_ICPSC_DIV2 + * @arg @ref LL_TIM_ICPSC_DIV4 + * @arg @ref LL_TIM_ICPSC_DIV8 + * @retval None + */ +__STATIC_INLINE void LL_TIM_IC_SetPrescaler(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ICPrescaler) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + MODIFY_REG(*pReg, ((TIM_CCMR1_IC1PSC) << SHIFT_TAB_ICxx[iChannel]), (ICPrescaler >> 16U) << SHIFT_TAB_ICxx[iChannel]); +} + +/** + * @brief Get the current prescaler value acting on an input channel. + * @rmtoll CCMR1 IC1PSC LL_TIM_IC_GetPrescaler\n + * CCMR1 IC2PSC LL_TIM_IC_GetPrescaler\n + * CCMR2 IC3PSC LL_TIM_IC_GetPrescaler\n + * CCMR2 IC4PSC LL_TIM_IC_GetPrescaler + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_ICPSC_DIV1 + * @arg @ref LL_TIM_ICPSC_DIV2 + * @arg @ref LL_TIM_ICPSC_DIV4 + * @arg @ref LL_TIM_ICPSC_DIV8 + */ +__STATIC_INLINE uint32_t LL_TIM_IC_GetPrescaler(const TIM_TypeDef *TIMx, uint32_t Channel) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + return ((READ_BIT(*pReg, ((TIM_CCMR1_IC1PSC) << SHIFT_TAB_ICxx[iChannel])) >> SHIFT_TAB_ICxx[iChannel]) << 16U); +} + +/** + * @brief Set the input filter duration. + * @rmtoll CCMR1 IC1F LL_TIM_IC_SetFilter\n + * CCMR1 IC2F LL_TIM_IC_SetFilter\n + * CCMR2 IC3F LL_TIM_IC_SetFilter\n + * CCMR2 IC4F LL_TIM_IC_SetFilter + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @param ICFilter This parameter can be one of the following values: + * @arg @ref LL_TIM_IC_FILTER_FDIV1 + * @arg @ref LL_TIM_IC_FILTER_FDIV1_N2 + * @arg @ref LL_TIM_IC_FILTER_FDIV1_N4 + * @arg @ref LL_TIM_IC_FILTER_FDIV1_N8 + * @arg @ref LL_TIM_IC_FILTER_FDIV2_N6 + * @arg @ref LL_TIM_IC_FILTER_FDIV2_N8 + * @arg @ref LL_TIM_IC_FILTER_FDIV4_N6 + * @arg @ref LL_TIM_IC_FILTER_FDIV4_N8 + * @arg @ref LL_TIM_IC_FILTER_FDIV8_N6 + * @arg @ref LL_TIM_IC_FILTER_FDIV8_N8 + * @arg @ref LL_TIM_IC_FILTER_FDIV16_N5 + * @arg @ref LL_TIM_IC_FILTER_FDIV16_N6 + * @arg @ref LL_TIM_IC_FILTER_FDIV16_N8 + * @arg @ref LL_TIM_IC_FILTER_FDIV32_N5 + * @arg @ref LL_TIM_IC_FILTER_FDIV32_N6 + * @arg @ref LL_TIM_IC_FILTER_FDIV32_N8 + * @retval None + */ +__STATIC_INLINE void LL_TIM_IC_SetFilter(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ICFilter) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + MODIFY_REG(*pReg, ((TIM_CCMR1_IC1F) << SHIFT_TAB_ICxx[iChannel]), (ICFilter >> 16U) << SHIFT_TAB_ICxx[iChannel]); +} + +/** + * @brief Get the input filter duration. + * @rmtoll CCMR1 IC1F LL_TIM_IC_GetFilter\n + * CCMR1 IC2F LL_TIM_IC_GetFilter\n + * CCMR2 IC3F LL_TIM_IC_GetFilter\n + * CCMR2 IC4F LL_TIM_IC_GetFilter + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_IC_FILTER_FDIV1 + * @arg @ref LL_TIM_IC_FILTER_FDIV1_N2 + * @arg @ref LL_TIM_IC_FILTER_FDIV1_N4 + * @arg @ref LL_TIM_IC_FILTER_FDIV1_N8 + * @arg @ref LL_TIM_IC_FILTER_FDIV2_N6 + * @arg @ref LL_TIM_IC_FILTER_FDIV2_N8 + * @arg @ref LL_TIM_IC_FILTER_FDIV4_N6 + * @arg @ref LL_TIM_IC_FILTER_FDIV4_N8 + * @arg @ref LL_TIM_IC_FILTER_FDIV8_N6 + * @arg @ref LL_TIM_IC_FILTER_FDIV8_N8 + * @arg @ref LL_TIM_IC_FILTER_FDIV16_N5 + * @arg @ref LL_TIM_IC_FILTER_FDIV16_N6 + * @arg @ref LL_TIM_IC_FILTER_FDIV16_N8 + * @arg @ref LL_TIM_IC_FILTER_FDIV32_N5 + * @arg @ref LL_TIM_IC_FILTER_FDIV32_N6 + * @arg @ref LL_TIM_IC_FILTER_FDIV32_N8 + */ +__STATIC_INLINE uint32_t LL_TIM_IC_GetFilter(const TIM_TypeDef *TIMx, uint32_t Channel) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + return ((READ_BIT(*pReg, ((TIM_CCMR1_IC1F) << SHIFT_TAB_ICxx[iChannel])) >> SHIFT_TAB_ICxx[iChannel]) << 16U); +} + +/** + * @brief Set the input channel polarity. + * @rmtoll CCER CC1P LL_TIM_IC_SetPolarity\n + * CCER CC1NP LL_TIM_IC_SetPolarity\n + * CCER CC2P LL_TIM_IC_SetPolarity\n + * CCER CC2NP LL_TIM_IC_SetPolarity\n + * CCER CC3P LL_TIM_IC_SetPolarity\n + * CCER CC3NP LL_TIM_IC_SetPolarity\n + * CCER CC4P LL_TIM_IC_SetPolarity\n + * CCER CC4NP LL_TIM_IC_SetPolarity + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @param ICPolarity This parameter can be one of the following values: + * @arg @ref LL_TIM_IC_POLARITY_RISING + * @arg @ref LL_TIM_IC_POLARITY_FALLING + * @arg @ref LL_TIM_IC_POLARITY_BOTHEDGE + * @retval None + */ +__STATIC_INLINE void LL_TIM_IC_SetPolarity(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ICPolarity) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + MODIFY_REG(TIMx->CCER, ((TIM_CCER_CC1NP | TIM_CCER_CC1P) << SHIFT_TAB_CCxP[iChannel]), + ICPolarity << SHIFT_TAB_CCxP[iChannel]); +} + +/** + * @brief Get the current input channel polarity. + * @rmtoll CCER CC1P LL_TIM_IC_GetPolarity\n + * CCER CC1NP LL_TIM_IC_GetPolarity\n + * CCER CC2P LL_TIM_IC_GetPolarity\n + * CCER CC2NP LL_TIM_IC_GetPolarity\n + * CCER CC3P LL_TIM_IC_GetPolarity\n + * CCER CC3NP LL_TIM_IC_GetPolarity\n + * CCER CC4P LL_TIM_IC_GetPolarity\n + * CCER CC4NP LL_TIM_IC_GetPolarity + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_IC_POLARITY_RISING + * @arg @ref LL_TIM_IC_POLARITY_FALLING + * @arg @ref LL_TIM_IC_POLARITY_BOTHEDGE + */ +__STATIC_INLINE uint32_t LL_TIM_IC_GetPolarity(const TIM_TypeDef *TIMx, uint32_t Channel) +{ + uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + return (READ_BIT(TIMx->CCER, ((TIM_CCER_CC1NP | TIM_CCER_CC1P) << SHIFT_TAB_CCxP[iChannel])) >> + SHIFT_TAB_CCxP[iChannel]); +} + +/** + * @brief Connect the TIMx_CH1, CH2 and CH3 pins to the TI1 input (XOR combination). + * @note Macro IS_TIM_XOR_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides an XOR input. + * @rmtoll CR2 TI1S LL_TIM_IC_EnableXORCombination + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_IC_EnableXORCombination(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->CR2, TIM_CR2_TI1S); +} + +/** + * @brief Disconnect the TIMx_CH1, CH2 and CH3 pins from the TI1 input. + * @note Macro IS_TIM_XOR_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides an XOR input. + * @rmtoll CR2 TI1S LL_TIM_IC_DisableXORCombination + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_IC_DisableXORCombination(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->CR2, TIM_CR2_TI1S); +} + +/** + * @brief Indicates whether the TIMx_CH1, CH2 and CH3 pins are connectected to the TI1 input. + * @note Macro IS_TIM_XOR_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides an XOR input. + * @rmtoll CR2 TI1S LL_TIM_IC_IsEnabledXORCombination + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IC_IsEnabledXORCombination(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->CR2, TIM_CR2_TI1S) == (TIM_CR2_TI1S)) ? 1UL : 0UL); +} + +/** + * @brief Get captured value for input channel 1. + * @note In 32-bit timer implementations returned captured value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro IS_TIM_CC1_INSTANCE(TIMx) can be used to check whether or not + * input channel 1 is supported by a timer instance. + * @rmtoll CCR1 CCR1 LL_TIM_IC_GetCaptureCH1 + * @param TIMx Timer instance + * @retval CapturedValue (between Min_Data=0 and Max_Data=65535) + */ +__STATIC_INLINE uint32_t LL_TIM_IC_GetCaptureCH1(const TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->CCR1)); +} + +/** + * @brief Get captured value for input channel 2. + * @note In 32-bit timer implementations returned captured value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro IS_TIM_CC2_INSTANCE(TIMx) can be used to check whether or not + * input channel 2 is supported by a timer instance. + * @rmtoll CCR2 CCR2 LL_TIM_IC_GetCaptureCH2 + * @param TIMx Timer instance + * @retval CapturedValue (between Min_Data=0 and Max_Data=65535) + */ +__STATIC_INLINE uint32_t LL_TIM_IC_GetCaptureCH2(const TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->CCR2)); +} + +/** + * @brief Get captured value for input channel 3. + * @note In 32-bit timer implementations returned captured value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro IS_TIM_CC3_INSTANCE(TIMx) can be used to check whether or not + * input channel 3 is supported by a timer instance. + * @rmtoll CCR3 CCR3 LL_TIM_IC_GetCaptureCH3 + * @param TIMx Timer instance + * @retval CapturedValue (between Min_Data=0 and Max_Data=65535) + */ +__STATIC_INLINE uint32_t LL_TIM_IC_GetCaptureCH3(const TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->CCR3)); +} + +/** + * @brief Get captured value for input channel 4. + * @note In 32-bit timer implementations returned captured value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro IS_TIM_CC4_INSTANCE(TIMx) can be used to check whether or not + * input channel 4 is supported by a timer instance. + * @rmtoll CCR4 CCR4 LL_TIM_IC_GetCaptureCH4 + * @param TIMx Timer instance + * @retval CapturedValue (between Min_Data=0 and Max_Data=65535) + */ +__STATIC_INLINE uint32_t LL_TIM_IC_GetCaptureCH4(const TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->CCR4)); +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_Clock_Selection Counter clock selection + * @{ + */ +/** + * @brief Enable external clock mode 2. + * @note When external clock mode 2 is enabled the counter is clocked by any active edge on the ETRF signal. + * @note Macro IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports external clock mode2. + * @rmtoll SMCR ECE LL_TIM_EnableExternalClock + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableExternalClock(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->SMCR, TIM_SMCR_ECE); +} + +/** + * @brief Disable external clock mode 2. + * @note Macro IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports external clock mode2. + * @rmtoll SMCR ECE LL_TIM_DisableExternalClock + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableExternalClock(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->SMCR, TIM_SMCR_ECE); +} + +/** + * @brief Indicate whether external clock mode 2 is enabled. + * @note Macro IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports external clock mode2. + * @rmtoll SMCR ECE LL_TIM_IsEnabledExternalClock + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledExternalClock(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->SMCR, TIM_SMCR_ECE) == (TIM_SMCR_ECE)) ? 1UL : 0UL); +} + +/** + * @brief Set the clock source of the counter clock. + * @note when selected clock source is external clock mode 1, the timer input + * the external clock is applied is selected by calling the @ref LL_TIM_SetTriggerInput() + * function. This timer input must be configured by calling + * the @ref LL_TIM_IC_Config() function. + * @note Macro IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports external clock mode1. + * @note Macro IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports external clock mode2. + * @rmtoll SMCR SMS LL_TIM_SetClockSource\n + * SMCR ECE LL_TIM_SetClockSource + * @param TIMx Timer instance + * @param ClockSource This parameter can be one of the following values: + * @arg @ref LL_TIM_CLOCKSOURCE_INTERNAL + * @arg @ref LL_TIM_CLOCKSOURCE_EXT_MODE1 + * @arg @ref LL_TIM_CLOCKSOURCE_EXT_MODE2 + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetClockSource(TIM_TypeDef *TIMx, uint32_t ClockSource) +{ + MODIFY_REG(TIMx->SMCR, TIM_SMCR_SMS | TIM_SMCR_ECE, ClockSource); +} + +/** + * @brief Set the encoder interface mode. + * @note Macro IS_TIM_ENCODER_INTERFACE_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports the encoder mode. + * @rmtoll SMCR SMS LL_TIM_SetEncoderMode + * @param TIMx Timer instance + * @param EncoderMode This parameter can be one of the following values: + * @arg @ref LL_TIM_ENCODERMODE_X2_TI1 + * @arg @ref LL_TIM_ENCODERMODE_X2_TI2 + * @arg @ref LL_TIM_ENCODERMODE_X4_TI12 + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetEncoderMode(TIM_TypeDef *TIMx, uint32_t EncoderMode) +{ + MODIFY_REG(TIMx->SMCR, TIM_SMCR_SMS, EncoderMode); +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_Timer_Synchronization Timer synchronisation configuration + * @{ + */ +/** + * @brief Set the trigger output (TRGO) used for timer synchronization . + * @note Macro IS_TIM_MASTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance can operate as a master timer. + * @rmtoll CR2 MMS LL_TIM_SetTriggerOutput + * @param TIMx Timer instance + * @param TimerSynchronization This parameter can be one of the following values: + * @arg @ref LL_TIM_TRGO_RESET + * @arg @ref LL_TIM_TRGO_ENABLE + * @arg @ref LL_TIM_TRGO_UPDATE + * @arg @ref LL_TIM_TRGO_CC1IF + * @arg @ref LL_TIM_TRGO_OC1REF + * @arg @ref LL_TIM_TRGO_OC2REF + * @arg @ref LL_TIM_TRGO_OC3REF + * @arg @ref LL_TIM_TRGO_OC4REF + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetTriggerOutput(TIM_TypeDef *TIMx, uint32_t TimerSynchronization) +{ + MODIFY_REG(TIMx->CR2, TIM_CR2_MMS, TimerSynchronization); +} + +/** + * @brief Set the synchronization mode of a slave timer. + * @note Macro IS_TIM_SLAVE_INSTANCE(TIMx) can be used to check whether or not + * a timer instance can operate as a slave timer. + * @rmtoll SMCR SMS LL_TIM_SetSlaveMode + * @param TIMx Timer instance + * @param SlaveMode This parameter can be one of the following values: + * @arg @ref LL_TIM_SLAVEMODE_DISABLED + * @arg @ref LL_TIM_SLAVEMODE_RESET + * @arg @ref LL_TIM_SLAVEMODE_GATED + * @arg @ref LL_TIM_SLAVEMODE_TRIGGER + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetSlaveMode(TIM_TypeDef *TIMx, uint32_t SlaveMode) +{ + MODIFY_REG(TIMx->SMCR, TIM_SMCR_SMS, SlaveMode); +} + +/** + * @brief Set the selects the trigger input to be used to synchronize the counter. + * @note Macro IS_TIM_SLAVE_INSTANCE(TIMx) can be used to check whether or not + * a timer instance can operate as a slave timer. + * @rmtoll SMCR TS LL_TIM_SetTriggerInput + * @param TIMx Timer instance + * @param TriggerInput This parameter can be one of the following values: + * @arg @ref LL_TIM_TS_ITR0 + * @arg @ref LL_TIM_TS_ITR1 + * @arg @ref LL_TIM_TS_ITR2 + * @arg @ref LL_TIM_TS_ITR3 + * @arg @ref LL_TIM_TS_TI1F_ED + * @arg @ref LL_TIM_TS_TI1FP1 + * @arg @ref LL_TIM_TS_TI2FP2 + * @arg @ref LL_TIM_TS_ETRF + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetTriggerInput(TIM_TypeDef *TIMx, uint32_t TriggerInput) +{ + MODIFY_REG(TIMx->SMCR, TIM_SMCR_TS, TriggerInput); +} + +/** + * @brief Enable the Master/Slave mode. + * @note Macro IS_TIM_SLAVE_INSTANCE(TIMx) can be used to check whether or not + * a timer instance can operate as a slave timer. + * @rmtoll SMCR MSM LL_TIM_EnableMasterSlaveMode + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableMasterSlaveMode(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->SMCR, TIM_SMCR_MSM); +} + +/** + * @brief Disable the Master/Slave mode. + * @note Macro IS_TIM_SLAVE_INSTANCE(TIMx) can be used to check whether or not + * a timer instance can operate as a slave timer. + * @rmtoll SMCR MSM LL_TIM_DisableMasterSlaveMode + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableMasterSlaveMode(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->SMCR, TIM_SMCR_MSM); +} + +/** + * @brief Indicates whether the Master/Slave mode is enabled. + * @note Macro IS_TIM_SLAVE_INSTANCE(TIMx) can be used to check whether or not + * a timer instance can operate as a slave timer. + * @rmtoll SMCR MSM LL_TIM_IsEnabledMasterSlaveMode + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledMasterSlaveMode(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->SMCR, TIM_SMCR_MSM) == (TIM_SMCR_MSM)) ? 1UL : 0UL); +} + +/** + * @brief Configure the external trigger (ETR) input. + * @note Macro IS_TIM_ETR_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides an external trigger input. + * @rmtoll SMCR ETP LL_TIM_ConfigETR\n + * SMCR ETPS LL_TIM_ConfigETR\n + * SMCR ETF LL_TIM_ConfigETR + * @param TIMx Timer instance + * @param ETRPolarity This parameter can be one of the following values: + * @arg @ref LL_TIM_ETR_POLARITY_NONINVERTED + * @arg @ref LL_TIM_ETR_POLARITY_INVERTED + * @param ETRPrescaler This parameter can be one of the following values: + * @arg @ref LL_TIM_ETR_PRESCALER_DIV1 + * @arg @ref LL_TIM_ETR_PRESCALER_DIV2 + * @arg @ref LL_TIM_ETR_PRESCALER_DIV4 + * @arg @ref LL_TIM_ETR_PRESCALER_DIV8 + * @param ETRFilter This parameter can be one of the following values: + * @arg @ref LL_TIM_ETR_FILTER_FDIV1 + * @arg @ref LL_TIM_ETR_FILTER_FDIV1_N2 + * @arg @ref LL_TIM_ETR_FILTER_FDIV1_N4 + * @arg @ref LL_TIM_ETR_FILTER_FDIV1_N8 + * @arg @ref LL_TIM_ETR_FILTER_FDIV2_N6 + * @arg @ref LL_TIM_ETR_FILTER_FDIV2_N8 + * @arg @ref LL_TIM_ETR_FILTER_FDIV4_N6 + * @arg @ref LL_TIM_ETR_FILTER_FDIV4_N8 + * @arg @ref LL_TIM_ETR_FILTER_FDIV8_N6 + * @arg @ref LL_TIM_ETR_FILTER_FDIV8_N8 + * @arg @ref LL_TIM_ETR_FILTER_FDIV16_N5 + * @arg @ref LL_TIM_ETR_FILTER_FDIV16_N6 + * @arg @ref LL_TIM_ETR_FILTER_FDIV16_N8 + * @arg @ref LL_TIM_ETR_FILTER_FDIV32_N5 + * @arg @ref LL_TIM_ETR_FILTER_FDIV32_N6 + * @arg @ref LL_TIM_ETR_FILTER_FDIV32_N8 + * @retval None + */ +__STATIC_INLINE void LL_TIM_ConfigETR(TIM_TypeDef *TIMx, uint32_t ETRPolarity, uint32_t ETRPrescaler, + uint32_t ETRFilter) +{ + MODIFY_REG(TIMx->SMCR, TIM_SMCR_ETP | TIM_SMCR_ETPS | TIM_SMCR_ETF, ETRPolarity | ETRPrescaler | ETRFilter); +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_Break_Function Break function configuration + * @{ + */ +/** + * @brief Enable the break function. + * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a break input. + * @rmtoll BDTR BKE LL_TIM_EnableBRK + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableBRK(TIM_TypeDef *TIMx) +{ + __IO uint32_t tmpreg; + SET_BIT(TIMx->BDTR, TIM_BDTR_BKE); + /* Note: Any write operation to this bit takes a delay of 1 APB clock cycle to become effective. */ + tmpreg = READ_REG(TIMx->BDTR); + (void)(tmpreg); +} + +/** + * @brief Disable the break function. + * @rmtoll BDTR BKE LL_TIM_DisableBRK + * @param TIMx Timer instance + * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a break input. + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableBRK(TIM_TypeDef *TIMx) +{ + __IO uint32_t tmpreg; + CLEAR_BIT(TIMx->BDTR, TIM_BDTR_BKE); + /* Note: Any write operation to this bit takes a delay of 1 APB clock cycle to become effective. */ + tmpreg = READ_REG(TIMx->BDTR); + (void)(tmpreg); +} + +/** + * @brief Configure the break input. + * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a break input. + * @rmtoll BDTR BKP LL_TIM_ConfigBRK + * @param TIMx Timer instance + * @param BreakPolarity This parameter can be one of the following values: + * @arg @ref LL_TIM_BREAK_POLARITY_LOW + * @arg @ref LL_TIM_BREAK_POLARITY_HIGH + * @retval None + */ +__STATIC_INLINE void LL_TIM_ConfigBRK(TIM_TypeDef *TIMx, uint32_t BreakPolarity) +{ + __IO uint32_t tmpreg; + MODIFY_REG(TIMx->BDTR, TIM_BDTR_BKP, BreakPolarity); + /* Note: Any write operation to BKP bit takes a delay of 1 APB clock cycle to become effective. */ + tmpreg = READ_REG(TIMx->BDTR); + (void)(tmpreg); +} + +/** + * @brief Select the outputs off state (enabled v.s. disabled) in Idle and Run modes. + * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a break input. + * @rmtoll BDTR OSSI LL_TIM_SetOffStates\n + * BDTR OSSR LL_TIM_SetOffStates + * @param TIMx Timer instance + * @param OffStateIdle This parameter can be one of the following values: + * @arg @ref LL_TIM_OSSI_DISABLE + * @arg @ref LL_TIM_OSSI_ENABLE + * @param OffStateRun This parameter can be one of the following values: + * @arg @ref LL_TIM_OSSR_DISABLE + * @arg @ref LL_TIM_OSSR_ENABLE + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetOffStates(TIM_TypeDef *TIMx, uint32_t OffStateIdle, uint32_t OffStateRun) +{ + MODIFY_REG(TIMx->BDTR, TIM_BDTR_OSSI | TIM_BDTR_OSSR, OffStateIdle | OffStateRun); +} + +/** + * @brief Enable automatic output (MOE can be set by software or automatically when a break input is active). + * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a break input. + * @rmtoll BDTR AOE LL_TIM_EnableAutomaticOutput + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableAutomaticOutput(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->BDTR, TIM_BDTR_AOE); +} + +/** + * @brief Disable automatic output (MOE can be set only by software). + * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a break input. + * @rmtoll BDTR AOE LL_TIM_DisableAutomaticOutput + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableAutomaticOutput(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->BDTR, TIM_BDTR_AOE); +} + +/** + * @brief Indicate whether automatic output is enabled. + * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a break input. + * @rmtoll BDTR AOE LL_TIM_IsEnabledAutomaticOutput + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledAutomaticOutput(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->BDTR, TIM_BDTR_AOE) == (TIM_BDTR_AOE)) ? 1UL : 0UL); +} + +/** + * @brief Enable the outputs (set the MOE bit in TIMx_BDTR register). + * @note The MOE bit in TIMx_BDTR register allows to enable /disable the outputs by + * software and is reset in case of break or break2 event + * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a break input. + * @rmtoll BDTR MOE LL_TIM_EnableAllOutputs + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableAllOutputs(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->BDTR, TIM_BDTR_MOE); +} + +/** + * @brief Disable the outputs (reset the MOE bit in TIMx_BDTR register). + * @note The MOE bit in TIMx_BDTR register allows to enable /disable the outputs by + * software and is reset in case of break or break2 event. + * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a break input. + * @rmtoll BDTR MOE LL_TIM_DisableAllOutputs + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableAllOutputs(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->BDTR, TIM_BDTR_MOE); +} + +/** + * @brief Indicates whether outputs are enabled. + * @note Macro IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a break input. + * @rmtoll BDTR MOE LL_TIM_IsEnabledAllOutputs + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledAllOutputs(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->BDTR, TIM_BDTR_MOE) == (TIM_BDTR_MOE)) ? 1UL : 0UL); +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_DMA_Burst_Mode DMA burst mode configuration + * @{ + */ +/** + * @brief Configures the timer DMA burst feature. + * @note Macro IS_TIM_DMABURST_INSTANCE(TIMx) can be used to check whether or + * not a timer instance supports the DMA burst mode. + * @rmtoll DCR DBL LL_TIM_ConfigDMABurst\n + * DCR DBA LL_TIM_ConfigDMABurst + * @param TIMx Timer instance + * @param DMABurstBaseAddress This parameter can be one of the following values: + * @arg @ref LL_TIM_DMABURST_BASEADDR_CR1 + * @arg @ref LL_TIM_DMABURST_BASEADDR_CR2 + * @arg @ref LL_TIM_DMABURST_BASEADDR_SMCR + * @arg @ref LL_TIM_DMABURST_BASEADDR_DIER + * @arg @ref LL_TIM_DMABURST_BASEADDR_SR + * @arg @ref LL_TIM_DMABURST_BASEADDR_EGR + * @arg @ref LL_TIM_DMABURST_BASEADDR_CCMR1 + * @arg @ref LL_TIM_DMABURST_BASEADDR_CCMR2 + * @arg @ref LL_TIM_DMABURST_BASEADDR_CCER + * @arg @ref LL_TIM_DMABURST_BASEADDR_CNT + * @arg @ref LL_TIM_DMABURST_BASEADDR_PSC + * @arg @ref LL_TIM_DMABURST_BASEADDR_ARR + * @arg @ref LL_TIM_DMABURST_BASEADDR_RCR + * @arg @ref LL_TIM_DMABURST_BASEADDR_CCR1 + * @arg @ref LL_TIM_DMABURST_BASEADDR_CCR2 + * @arg @ref LL_TIM_DMABURST_BASEADDR_CCR3 + * @arg @ref LL_TIM_DMABURST_BASEADDR_CCR4 + * @arg @ref LL_TIM_DMABURST_BASEADDR_BDTR + * @param DMABurstLength This parameter can be one of the following values: + * @arg @ref LL_TIM_DMABURST_LENGTH_1TRANSFER + * @arg @ref LL_TIM_DMABURST_LENGTH_2TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_3TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_4TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_5TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_6TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_7TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_8TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_9TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_10TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_11TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_12TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_13TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_14TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_15TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_16TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_17TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_18TRANSFERS + * @retval None + */ +__STATIC_INLINE void LL_TIM_ConfigDMABurst(TIM_TypeDef *TIMx, uint32_t DMABurstBaseAddress, uint32_t DMABurstLength) +{ + MODIFY_REG(TIMx->DCR, (TIM_DCR_DBL | TIM_DCR_DBA), (DMABurstBaseAddress | DMABurstLength)); +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_Timer_Inputs_Remapping Timer input remapping + * @{ + */ +/** + * @brief Remap TIM inputs (input channel, internal/external triggers). + * @note Macro IS_TIM_REMAP_INSTANCE(TIMx) can be used to check whether or not + * a some timer inputs can be remapped. + * @rmtoll TIM1_OR ITR2_RMP LL_TIM_SetRemap\n + * TIM2_OR ITR1_RMP LL_TIM_SetRemap\n + * TIM5_OR ITR1_RMP LL_TIM_SetRemap\n + * TIM5_OR TI4_RMP LL_TIM_SetRemap\n + * TIM9_OR ITR1_RMP LL_TIM_SetRemap\n + * TIM11_OR TI1_RMP LL_TIM_SetRemap\n + * LPTIM1_OR OR LL_TIM_SetRemap + * @param TIMx Timer instance + * @param Remap Remap param depends on the TIMx. Description available only + * in CHM version of the User Manual (not in .pdf). + * Otherwise see Reference Manual description of OR registers. + * + * Below description summarizes "Timer Instance" and "Remap" param combinations: + * + * TIM1: one of the following values + * + * ITR2_RMP can be one of the following values + * @arg @ref LL_TIM_TIM1_ITR2_RMP_TIM3_TRGO (*) + * @arg @ref LL_TIM_TIM1_ITR2_RMP_LPTIM (*) + * + * TIM2: one of the following values + * + * ITR1_RMP can be one of the following values + * @arg @ref LL_TIM_TIM2_ITR1_RMP_TIM8_TRGO + * @arg @ref LL_TIM_TIM2_ITR1_RMP_OTG_FS_SOF + * @arg @ref LL_TIM_TIM2_ITR1_RMP_OTG_HS_SOF + * + * TIM5: one of the following values + * + * @arg @ref LL_TIM_TIM5_TI4_RMP_GPIO + * @arg @ref LL_TIM_TIM5_TI4_RMP_LSI + * @arg @ref LL_TIM_TIM5_TI4_RMP_LSE + * @arg @ref LL_TIM_TIM5_TI4_RMP_RTC + * @arg @ref LL_TIM_TIM5_ITR1_RMP_TIM3_TRGO (*) + * @arg @ref LL_TIM_TIM5_ITR1_RMP_LPTIM (*) + * + * TIM9: one of the following values + * + * ITR1_RMP can be one of the following values + * @arg @ref LL_TIM_TIM9_ITR1_RMP_TIM3_TRGO (*) + * @arg @ref LL_TIM_TIM9_ITR1_RMP_LPTIM (*) + * + * TIM11: one of the following values + * + * @arg @ref LL_TIM_TIM11_TI1_RMP_GPIO + * @arg @ref LL_TIM_TIM11_TI1_RMP_GPIO1 (*) + * @arg @ref LL_TIM_TIM11_TI1_RMP_HSE_RTC + * @arg @ref LL_TIM_TIM11_TI1_RMP_GPIO2 + * @arg @ref LL_TIM_TIM11_TI1_RMP_SPDIFRX (*) + * + * (*) Value not defined in all devices. \n + * + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetRemap(TIM_TypeDef *TIMx, uint32_t Remap) +{ +#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM9_ITR1_RMP) + if ((Remap & LL_TIM_LPTIM_REMAP_MASK) == LL_TIM_LPTIM_REMAP_MASK) + { + /* Connect TIMx internal trigger to LPTIM1 output */ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN); + MODIFY_REG(LPTIM1->OR, + (LPTIM_OR_TIM1_ITR2_RMP | LPTIM_OR_TIM5_ITR1_RMP | LPTIM_OR_TIM9_ITR1_RMP), + Remap & ~(LL_TIM_LPTIM_REMAP_MASK)); + } + else + { + MODIFY_REG(TIMx->OR, (Remap >> TIMx_OR_RMP_SHIFT), (Remap & TIMx_OR_RMP_MASK)); + } +#else + MODIFY_REG(TIMx->OR, (Remap >> TIMx_OR_RMP_SHIFT), (Remap & TIMx_OR_RMP_MASK)); +#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM9_ITR1_RMP */ +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_FLAG_Management FLAG-Management + * @{ + */ +/** + * @brief Clear the update interrupt flag (UIF). + * @rmtoll SR UIF LL_TIM_ClearFlag_UPDATE + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_UPDATE(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_UIF)); +} + +/** + * @brief Indicate whether update interrupt flag (UIF) is set (update interrupt is pending). + * @rmtoll SR UIF LL_TIM_IsActiveFlag_UPDATE + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_UPDATE(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->SR, TIM_SR_UIF) == (TIM_SR_UIF)) ? 1UL : 0UL); +} + +/** + * @brief Clear the Capture/Compare 1 interrupt flag (CC1F). + * @rmtoll SR CC1IF LL_TIM_ClearFlag_CC1 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_CC1(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_CC1IF)); +} + +/** + * @brief Indicate whether Capture/Compare 1 interrupt flag (CC1F) is set (Capture/Compare 1 interrupt is pending). + * @rmtoll SR CC1IF LL_TIM_IsActiveFlag_CC1 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC1(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->SR, TIM_SR_CC1IF) == (TIM_SR_CC1IF)) ? 1UL : 0UL); +} + +/** + * @brief Clear the Capture/Compare 2 interrupt flag (CC2F). + * @rmtoll SR CC2IF LL_TIM_ClearFlag_CC2 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_CC2(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_CC2IF)); +} + +/** + * @brief Indicate whether Capture/Compare 2 interrupt flag (CC2F) is set (Capture/Compare 2 interrupt is pending). + * @rmtoll SR CC2IF LL_TIM_IsActiveFlag_CC2 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC2(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->SR, TIM_SR_CC2IF) == (TIM_SR_CC2IF)) ? 1UL : 0UL); +} + +/** + * @brief Clear the Capture/Compare 3 interrupt flag (CC3F). + * @rmtoll SR CC3IF LL_TIM_ClearFlag_CC3 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_CC3(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_CC3IF)); +} + +/** + * @brief Indicate whether Capture/Compare 3 interrupt flag (CC3F) is set (Capture/Compare 3 interrupt is pending). + * @rmtoll SR CC3IF LL_TIM_IsActiveFlag_CC3 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC3(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->SR, TIM_SR_CC3IF) == (TIM_SR_CC3IF)) ? 1UL : 0UL); +} + +/** + * @brief Clear the Capture/Compare 4 interrupt flag (CC4F). + * @rmtoll SR CC4IF LL_TIM_ClearFlag_CC4 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_CC4(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_CC4IF)); +} + +/** + * @brief Indicate whether Capture/Compare 4 interrupt flag (CC4F) is set (Capture/Compare 4 interrupt is pending). + * @rmtoll SR CC4IF LL_TIM_IsActiveFlag_CC4 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC4(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->SR, TIM_SR_CC4IF) == (TIM_SR_CC4IF)) ? 1UL : 0UL); +} + +/** + * @brief Clear the commutation interrupt flag (COMIF). + * @rmtoll SR COMIF LL_TIM_ClearFlag_COM + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_COM(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_COMIF)); +} + +/** + * @brief Indicate whether commutation interrupt flag (COMIF) is set (commutation interrupt is pending). + * @rmtoll SR COMIF LL_TIM_IsActiveFlag_COM + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_COM(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->SR, TIM_SR_COMIF) == (TIM_SR_COMIF)) ? 1UL : 0UL); +} + +/** + * @brief Clear the trigger interrupt flag (TIF). + * @rmtoll SR TIF LL_TIM_ClearFlag_TRIG + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_TRIG(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_TIF)); +} + +/** + * @brief Indicate whether trigger interrupt flag (TIF) is set (trigger interrupt is pending). + * @rmtoll SR TIF LL_TIM_IsActiveFlag_TRIG + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_TRIG(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->SR, TIM_SR_TIF) == (TIM_SR_TIF)) ? 1UL : 0UL); +} + +/** + * @brief Clear the break interrupt flag (BIF). + * @rmtoll SR BIF LL_TIM_ClearFlag_BRK + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_BRK(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_BIF)); +} + +/** + * @brief Indicate whether break interrupt flag (BIF) is set (break interrupt is pending). + * @rmtoll SR BIF LL_TIM_IsActiveFlag_BRK + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_BRK(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->SR, TIM_SR_BIF) == (TIM_SR_BIF)) ? 1UL : 0UL); +} + +/** + * @brief Clear the Capture/Compare 1 over-capture interrupt flag (CC1OF). + * @rmtoll SR CC1OF LL_TIM_ClearFlag_CC1OVR + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_CC1OVR(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_CC1OF)); +} + +/** + * @brief Indicate whether Capture/Compare 1 over-capture interrupt flag (CC1OF) is set + * (Capture/Compare 1 interrupt is pending). + * @rmtoll SR CC1OF LL_TIM_IsActiveFlag_CC1OVR + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC1OVR(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->SR, TIM_SR_CC1OF) == (TIM_SR_CC1OF)) ? 1UL : 0UL); +} + +/** + * @brief Clear the Capture/Compare 2 over-capture interrupt flag (CC2OF). + * @rmtoll SR CC2OF LL_TIM_ClearFlag_CC2OVR + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_CC2OVR(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_CC2OF)); +} + +/** + * @brief Indicate whether Capture/Compare 2 over-capture interrupt flag (CC2OF) is set + * (Capture/Compare 2 over-capture interrupt is pending). + * @rmtoll SR CC2OF LL_TIM_IsActiveFlag_CC2OVR + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC2OVR(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->SR, TIM_SR_CC2OF) == (TIM_SR_CC2OF)) ? 1UL : 0UL); +} + +/** + * @brief Clear the Capture/Compare 3 over-capture interrupt flag (CC3OF). + * @rmtoll SR CC3OF LL_TIM_ClearFlag_CC3OVR + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_CC3OVR(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_CC3OF)); +} + +/** + * @brief Indicate whether Capture/Compare 3 over-capture interrupt flag (CC3OF) is set + * (Capture/Compare 3 over-capture interrupt is pending). + * @rmtoll SR CC3OF LL_TIM_IsActiveFlag_CC3OVR + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC3OVR(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->SR, TIM_SR_CC3OF) == (TIM_SR_CC3OF)) ? 1UL : 0UL); +} + +/** + * @brief Clear the Capture/Compare 4 over-capture interrupt flag (CC4OF). + * @rmtoll SR CC4OF LL_TIM_ClearFlag_CC4OVR + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_CC4OVR(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_CC4OF)); +} + +/** + * @brief Indicate whether Capture/Compare 4 over-capture interrupt flag (CC4OF) is set + * (Capture/Compare 4 over-capture interrupt is pending). + * @rmtoll SR CC4OF LL_TIM_IsActiveFlag_CC4OVR + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC4OVR(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->SR, TIM_SR_CC4OF) == (TIM_SR_CC4OF)) ? 1UL : 0UL); +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_IT_Management IT-Management + * @{ + */ +/** + * @brief Enable update interrupt (UIE). + * @rmtoll DIER UIE LL_TIM_EnableIT_UPDATE + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableIT_UPDATE(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_UIE); +} + +/** + * @brief Disable update interrupt (UIE). + * @rmtoll DIER UIE LL_TIM_DisableIT_UPDATE + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableIT_UPDATE(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_UIE); +} + +/** + * @brief Indicates whether the update interrupt (UIE) is enabled. + * @rmtoll DIER UIE LL_TIM_IsEnabledIT_UPDATE + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_UPDATE(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->DIER, TIM_DIER_UIE) == (TIM_DIER_UIE)) ? 1UL : 0UL); +} + +/** + * @brief Enable capture/compare 1 interrupt (CC1IE). + * @rmtoll DIER CC1IE LL_TIM_EnableIT_CC1 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableIT_CC1(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_CC1IE); +} + +/** + * @brief Disable capture/compare 1 interrupt (CC1IE). + * @rmtoll DIER CC1IE LL_TIM_DisableIT_CC1 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableIT_CC1(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_CC1IE); +} + +/** + * @brief Indicates whether the capture/compare 1 interrupt (CC1IE) is enabled. + * @rmtoll DIER CC1IE LL_TIM_IsEnabledIT_CC1 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_CC1(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->DIER, TIM_DIER_CC1IE) == (TIM_DIER_CC1IE)) ? 1UL : 0UL); +} + +/** + * @brief Enable capture/compare 2 interrupt (CC2IE). + * @rmtoll DIER CC2IE LL_TIM_EnableIT_CC2 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableIT_CC2(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_CC2IE); +} + +/** + * @brief Disable capture/compare 2 interrupt (CC2IE). + * @rmtoll DIER CC2IE LL_TIM_DisableIT_CC2 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableIT_CC2(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_CC2IE); +} + +/** + * @brief Indicates whether the capture/compare 2 interrupt (CC2IE) is enabled. + * @rmtoll DIER CC2IE LL_TIM_IsEnabledIT_CC2 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_CC2(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->DIER, TIM_DIER_CC2IE) == (TIM_DIER_CC2IE)) ? 1UL : 0UL); +} + +/** + * @brief Enable capture/compare 3 interrupt (CC3IE). + * @rmtoll DIER CC3IE LL_TIM_EnableIT_CC3 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableIT_CC3(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_CC3IE); +} + +/** + * @brief Disable capture/compare 3 interrupt (CC3IE). + * @rmtoll DIER CC3IE LL_TIM_DisableIT_CC3 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableIT_CC3(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_CC3IE); +} + +/** + * @brief Indicates whether the capture/compare 3 interrupt (CC3IE) is enabled. + * @rmtoll DIER CC3IE LL_TIM_IsEnabledIT_CC3 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_CC3(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->DIER, TIM_DIER_CC3IE) == (TIM_DIER_CC3IE)) ? 1UL : 0UL); +} + +/** + * @brief Enable capture/compare 4 interrupt (CC4IE). + * @rmtoll DIER CC4IE LL_TIM_EnableIT_CC4 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableIT_CC4(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_CC4IE); +} + +/** + * @brief Disable capture/compare 4 interrupt (CC4IE). + * @rmtoll DIER CC4IE LL_TIM_DisableIT_CC4 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableIT_CC4(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_CC4IE); +} + +/** + * @brief Indicates whether the capture/compare 4 interrupt (CC4IE) is enabled. + * @rmtoll DIER CC4IE LL_TIM_IsEnabledIT_CC4 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_CC4(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->DIER, TIM_DIER_CC4IE) == (TIM_DIER_CC4IE)) ? 1UL : 0UL); +} + +/** + * @brief Enable commutation interrupt (COMIE). + * @rmtoll DIER COMIE LL_TIM_EnableIT_COM + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableIT_COM(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_COMIE); +} + +/** + * @brief Disable commutation interrupt (COMIE). + * @rmtoll DIER COMIE LL_TIM_DisableIT_COM + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableIT_COM(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_COMIE); +} + +/** + * @brief Indicates whether the commutation interrupt (COMIE) is enabled. + * @rmtoll DIER COMIE LL_TIM_IsEnabledIT_COM + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_COM(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->DIER, TIM_DIER_COMIE) == (TIM_DIER_COMIE)) ? 1UL : 0UL); +} + +/** + * @brief Enable trigger interrupt (TIE). + * @rmtoll DIER TIE LL_TIM_EnableIT_TRIG + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableIT_TRIG(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_TIE); +} + +/** + * @brief Disable trigger interrupt (TIE). + * @rmtoll DIER TIE LL_TIM_DisableIT_TRIG + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableIT_TRIG(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_TIE); +} + +/** + * @brief Indicates whether the trigger interrupt (TIE) is enabled. + * @rmtoll DIER TIE LL_TIM_IsEnabledIT_TRIG + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_TRIG(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->DIER, TIM_DIER_TIE) == (TIM_DIER_TIE)) ? 1UL : 0UL); +} + +/** + * @brief Enable break interrupt (BIE). + * @rmtoll DIER BIE LL_TIM_EnableIT_BRK + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableIT_BRK(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_BIE); +} + +/** + * @brief Disable break interrupt (BIE). + * @rmtoll DIER BIE LL_TIM_DisableIT_BRK + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableIT_BRK(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_BIE); +} + +/** + * @brief Indicates whether the break interrupt (BIE) is enabled. + * @rmtoll DIER BIE LL_TIM_IsEnabledIT_BRK + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_BRK(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->DIER, TIM_DIER_BIE) == (TIM_DIER_BIE)) ? 1UL : 0UL); +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_DMA_Management DMA Management + * @{ + */ +/** + * @brief Enable update DMA request (UDE). + * @rmtoll DIER UDE LL_TIM_EnableDMAReq_UPDATE + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableDMAReq_UPDATE(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_UDE); +} + +/** + * @brief Disable update DMA request (UDE). + * @rmtoll DIER UDE LL_TIM_DisableDMAReq_UPDATE + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableDMAReq_UPDATE(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_UDE); +} + +/** + * @brief Indicates whether the update DMA request (UDE) is enabled. + * @rmtoll DIER UDE LL_TIM_IsEnabledDMAReq_UPDATE + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_UPDATE(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->DIER, TIM_DIER_UDE) == (TIM_DIER_UDE)) ? 1UL : 0UL); +} + +/** + * @brief Enable capture/compare 1 DMA request (CC1DE). + * @rmtoll DIER CC1DE LL_TIM_EnableDMAReq_CC1 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableDMAReq_CC1(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_CC1DE); +} + +/** + * @brief Disable capture/compare 1 DMA request (CC1DE). + * @rmtoll DIER CC1DE LL_TIM_DisableDMAReq_CC1 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableDMAReq_CC1(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_CC1DE); +} + +/** + * @brief Indicates whether the capture/compare 1 DMA request (CC1DE) is enabled. + * @rmtoll DIER CC1DE LL_TIM_IsEnabledDMAReq_CC1 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_CC1(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->DIER, TIM_DIER_CC1DE) == (TIM_DIER_CC1DE)) ? 1UL : 0UL); +} + +/** + * @brief Enable capture/compare 2 DMA request (CC2DE). + * @rmtoll DIER CC2DE LL_TIM_EnableDMAReq_CC2 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableDMAReq_CC2(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_CC2DE); +} + +/** + * @brief Disable capture/compare 2 DMA request (CC2DE). + * @rmtoll DIER CC2DE LL_TIM_DisableDMAReq_CC2 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableDMAReq_CC2(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_CC2DE); +} + +/** + * @brief Indicates whether the capture/compare 2 DMA request (CC2DE) is enabled. + * @rmtoll DIER CC2DE LL_TIM_IsEnabledDMAReq_CC2 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_CC2(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->DIER, TIM_DIER_CC2DE) == (TIM_DIER_CC2DE)) ? 1UL : 0UL); +} + +/** + * @brief Enable capture/compare 3 DMA request (CC3DE). + * @rmtoll DIER CC3DE LL_TIM_EnableDMAReq_CC3 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableDMAReq_CC3(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_CC3DE); +} + +/** + * @brief Disable capture/compare 3 DMA request (CC3DE). + * @rmtoll DIER CC3DE LL_TIM_DisableDMAReq_CC3 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableDMAReq_CC3(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_CC3DE); +} + +/** + * @brief Indicates whether the capture/compare 3 DMA request (CC3DE) is enabled. + * @rmtoll DIER CC3DE LL_TIM_IsEnabledDMAReq_CC3 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_CC3(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->DIER, TIM_DIER_CC3DE) == (TIM_DIER_CC3DE)) ? 1UL : 0UL); +} + +/** + * @brief Enable capture/compare 4 DMA request (CC4DE). + * @rmtoll DIER CC4DE LL_TIM_EnableDMAReq_CC4 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableDMAReq_CC4(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_CC4DE); +} + +/** + * @brief Disable capture/compare 4 DMA request (CC4DE). + * @rmtoll DIER CC4DE LL_TIM_DisableDMAReq_CC4 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableDMAReq_CC4(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_CC4DE); +} + +/** + * @brief Indicates whether the capture/compare 4 DMA request (CC4DE) is enabled. + * @rmtoll DIER CC4DE LL_TIM_IsEnabledDMAReq_CC4 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_CC4(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->DIER, TIM_DIER_CC4DE) == (TIM_DIER_CC4DE)) ? 1UL : 0UL); +} + +/** + * @brief Enable commutation DMA request (COMDE). + * @rmtoll DIER COMDE LL_TIM_EnableDMAReq_COM + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableDMAReq_COM(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_COMDE); +} + +/** + * @brief Disable commutation DMA request (COMDE). + * @rmtoll DIER COMDE LL_TIM_DisableDMAReq_COM + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableDMAReq_COM(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_COMDE); +} + +/** + * @brief Indicates whether the commutation DMA request (COMDE) is enabled. + * @rmtoll DIER COMDE LL_TIM_IsEnabledDMAReq_COM + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_COM(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->DIER, TIM_DIER_COMDE) == (TIM_DIER_COMDE)) ? 1UL : 0UL); +} + +/** + * @brief Enable trigger interrupt (TDE). + * @rmtoll DIER TDE LL_TIM_EnableDMAReq_TRIG + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableDMAReq_TRIG(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_TDE); +} + +/** + * @brief Disable trigger interrupt (TDE). + * @rmtoll DIER TDE LL_TIM_DisableDMAReq_TRIG + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableDMAReq_TRIG(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_TDE); +} + +/** + * @brief Indicates whether the trigger interrupt (TDE) is enabled. + * @rmtoll DIER TDE LL_TIM_IsEnabledDMAReq_TRIG + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_TRIG(const TIM_TypeDef *TIMx) +{ + return ((READ_BIT(TIMx->DIER, TIM_DIER_TDE) == (TIM_DIER_TDE)) ? 1UL : 0UL); +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_EVENT_Management EVENT-Management + * @{ + */ +/** + * @brief Generate an update event. + * @rmtoll EGR UG LL_TIM_GenerateEvent_UPDATE + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_GenerateEvent_UPDATE(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->EGR, TIM_EGR_UG); +} + +/** + * @brief Generate Capture/Compare 1 event. + * @rmtoll EGR CC1G LL_TIM_GenerateEvent_CC1 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_GenerateEvent_CC1(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->EGR, TIM_EGR_CC1G); +} + +/** + * @brief Generate Capture/Compare 2 event. + * @rmtoll EGR CC2G LL_TIM_GenerateEvent_CC2 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_GenerateEvent_CC2(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->EGR, TIM_EGR_CC2G); +} + +/** + * @brief Generate Capture/Compare 3 event. + * @rmtoll EGR CC3G LL_TIM_GenerateEvent_CC3 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_GenerateEvent_CC3(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->EGR, TIM_EGR_CC3G); +} + +/** + * @brief Generate Capture/Compare 4 event. + * @rmtoll EGR CC4G LL_TIM_GenerateEvent_CC4 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_GenerateEvent_CC4(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->EGR, TIM_EGR_CC4G); +} + +/** + * @brief Generate commutation event. + * @rmtoll EGR COMG LL_TIM_GenerateEvent_COM + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_GenerateEvent_COM(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->EGR, TIM_EGR_COMG); +} + +/** + * @brief Generate trigger event. + * @rmtoll EGR TG LL_TIM_GenerateEvent_TRIG + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_GenerateEvent_TRIG(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->EGR, TIM_EGR_TG); +} + +/** + * @brief Generate break event. + * @rmtoll EGR BG LL_TIM_GenerateEvent_BRK + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_GenerateEvent_BRK(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->EGR, TIM_EGR_BG); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup TIM_LL_EF_Init Initialisation and deinitialisation functions + * @{ + */ + +ErrorStatus LL_TIM_DeInit(const TIM_TypeDef *TIMx); +void LL_TIM_StructInit(LL_TIM_InitTypeDef *TIM_InitStruct); +ErrorStatus LL_TIM_Init(TIM_TypeDef *TIMx, const LL_TIM_InitTypeDef *TIM_InitStruct); +void LL_TIM_OC_StructInit(LL_TIM_OC_InitTypeDef *TIM_OC_InitStruct); +ErrorStatus LL_TIM_OC_Init(TIM_TypeDef *TIMx, uint32_t Channel, const LL_TIM_OC_InitTypeDef *TIM_OC_InitStruct); +void LL_TIM_IC_StructInit(LL_TIM_IC_InitTypeDef *TIM_ICInitStruct); +ErrorStatus LL_TIM_IC_Init(TIM_TypeDef *TIMx, uint32_t Channel, const LL_TIM_IC_InitTypeDef *TIM_IC_InitStruct); +void LL_TIM_ENCODER_StructInit(LL_TIM_ENCODER_InitTypeDef *TIM_EncoderInitStruct); +ErrorStatus LL_TIM_ENCODER_Init(TIM_TypeDef *TIMx, const LL_TIM_ENCODER_InitTypeDef *TIM_EncoderInitStruct); +void LL_TIM_HALLSENSOR_StructInit(LL_TIM_HALLSENSOR_InitTypeDef *TIM_HallSensorInitStruct); +ErrorStatus LL_TIM_HALLSENSOR_Init(TIM_TypeDef *TIMx, const LL_TIM_HALLSENSOR_InitTypeDef *TIM_HallSensorInitStruct); +void LL_TIM_BDTR_StructInit(LL_TIM_BDTR_InitTypeDef *TIM_BDTRInitStruct); +ErrorStatus LL_TIM_BDTR_Init(TIM_TypeDef *TIMx, const LL_TIM_BDTR_InitTypeDef *TIM_BDTRInitStruct); +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* TIM1 || TIM2 || TIM3 || TIM4 || TIM5 || TIM6 || TIM7 || TIM8 || TIM9 || TIM10 || TIM11 || TIM12 || TIM13 || TIM14 */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_TIM_H */ diff --git a/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h new file mode 100644 index 0000000..ed83b6c --- /dev/null +++ b/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(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_UE) == (USART_CR1_UE)); +} + +/** + * @brief Receiver Enable (Receiver is enabled and begins searching for a start bit) + * @rmtoll CR1 RE LL_USART_EnableDirectionRx + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableDirectionRx(USART_TypeDef *USARTx) +{ + ATOMIC_SET_BIT(USARTx->CR1, USART_CR1_RE); +} + +/** + * @brief Receiver Disable + * @rmtoll CR1 RE LL_USART_DisableDirectionRx + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableDirectionRx(USART_TypeDef *USARTx) +{ + ATOMIC_CLEAR_BIT(USARTx->CR1, USART_CR1_RE); +} + +/** + * @brief Transmitter Enable + * @rmtoll CR1 TE LL_USART_EnableDirectionTx + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableDirectionTx(USART_TypeDef *USARTx) +{ + ATOMIC_SET_BIT(USARTx->CR1, USART_CR1_TE); +} + +/** + * @brief Transmitter Disable + * @rmtoll CR1 TE LL_USART_DisableDirectionTx + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableDirectionTx(USART_TypeDef *USARTx) +{ + ATOMIC_CLEAR_BIT(USARTx->CR1, USART_CR1_TE); +} + +/** + * @brief Configure simultaneously enabled/disabled states + * of Transmitter and Receiver + * @rmtoll CR1 RE LL_USART_SetTransferDirection\n + * CR1 TE LL_USART_SetTransferDirection + * @param USARTx USART Instance + * @param TransferDirection This parameter can be one of the following values: + * @arg @ref LL_USART_DIRECTION_NONE + * @arg @ref LL_USART_DIRECTION_RX + * @arg @ref LL_USART_DIRECTION_TX + * @arg @ref LL_USART_DIRECTION_TX_RX + * @retval None + */ +__STATIC_INLINE void LL_USART_SetTransferDirection(USART_TypeDef *USARTx, uint32_t TransferDirection) +{ + ATOMIC_MODIFY_REG(USARTx->CR1, USART_CR1_RE | USART_CR1_TE, TransferDirection); +} + +/** + * @brief Return enabled/disabled states of Transmitter and Receiver + * @rmtoll CR1 RE LL_USART_GetTransferDirection\n + * CR1 TE LL_USART_GetTransferDirection + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_DIRECTION_NONE + * @arg @ref LL_USART_DIRECTION_RX + * @arg @ref LL_USART_DIRECTION_TX + * @arg @ref LL_USART_DIRECTION_TX_RX + */ +__STATIC_INLINE uint32_t LL_USART_GetTransferDirection(const USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR1, USART_CR1_RE | USART_CR1_TE)); +} + +/** + * @brief Configure Parity (enabled/disabled and parity mode if enabled). + * @note This function selects if hardware parity control (generation and detection) is enabled or disabled. + * When the parity control is enabled (Odd or Even), computed parity bit is inserted at the MSB position + * (9th or 8th bit depending on data width) and parity is checked on the received data. + * @rmtoll CR1 PS LL_USART_SetParity\n + * CR1 PCE LL_USART_SetParity + * @param USARTx USART Instance + * @param Parity This parameter can be one of the following values: + * @arg @ref LL_USART_PARITY_NONE + * @arg @ref LL_USART_PARITY_EVEN + * @arg @ref LL_USART_PARITY_ODD + * @retval None + */ +__STATIC_INLINE void LL_USART_SetParity(USART_TypeDef *USARTx, uint32_t Parity) +{ + MODIFY_REG(USARTx->CR1, USART_CR1_PS | USART_CR1_PCE, Parity); +} + +/** + * @brief Return Parity configuration (enabled/disabled and parity mode if enabled) + * @rmtoll CR1 PS LL_USART_GetParity\n + * CR1 PCE LL_USART_GetParity + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_PARITY_NONE + * @arg @ref LL_USART_PARITY_EVEN + * @arg @ref LL_USART_PARITY_ODD + */ +__STATIC_INLINE uint32_t LL_USART_GetParity(const USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR1, USART_CR1_PS | USART_CR1_PCE)); +} + +/** + * @brief Set Receiver Wake Up method from Mute mode. + * @rmtoll CR1 WAKE LL_USART_SetWakeUpMethod + * @param USARTx USART Instance + * @param Method This parameter can be one of the following values: + * @arg @ref LL_USART_WAKEUP_IDLELINE + * @arg @ref LL_USART_WAKEUP_ADDRESSMARK + * @retval None + */ +__STATIC_INLINE void LL_USART_SetWakeUpMethod(USART_TypeDef *USARTx, uint32_t Method) +{ + MODIFY_REG(USARTx->CR1, USART_CR1_WAKE, Method); +} + +/** + * @brief Return Receiver Wake Up method from Mute mode + * @rmtoll CR1 WAKE LL_USART_GetWakeUpMethod + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_WAKEUP_IDLELINE + * @arg @ref LL_USART_WAKEUP_ADDRESSMARK + */ +__STATIC_INLINE uint32_t LL_USART_GetWakeUpMethod(const USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR1, USART_CR1_WAKE)); +} + +/** + * @brief Set Word length (i.e. nb of data bits, excluding start and stop bits) + * @rmtoll CR1 M LL_USART_SetDataWidth + * @param USARTx USART Instance + * @param DataWidth This parameter can be one of the following values: + * @arg @ref LL_USART_DATAWIDTH_8B + * @arg @ref LL_USART_DATAWIDTH_9B + * @retval None + */ +__STATIC_INLINE void LL_USART_SetDataWidth(USART_TypeDef *USARTx, uint32_t DataWidth) +{ + MODIFY_REG(USARTx->CR1, USART_CR1_M, DataWidth); +} + +/** + * @brief Return Word length (i.e. nb of data bits, excluding start and stop bits) + * @rmtoll CR1 M LL_USART_GetDataWidth + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_DATAWIDTH_8B + * @arg @ref LL_USART_DATAWIDTH_9B + */ +__STATIC_INLINE uint32_t LL_USART_GetDataWidth(const USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR1, USART_CR1_M)); +} + +/** + * @brief Set Oversampling to 8-bit or 16-bit mode + * @rmtoll CR1 OVER8 LL_USART_SetOverSampling + * @param USARTx USART Instance + * @param OverSampling This parameter can be one of the following values: + * @arg @ref LL_USART_OVERSAMPLING_16 + * @arg @ref LL_USART_OVERSAMPLING_8 + * @retval None + */ +__STATIC_INLINE void LL_USART_SetOverSampling(USART_TypeDef *USARTx, uint32_t OverSampling) +{ + MODIFY_REG(USARTx->CR1, USART_CR1_OVER8, OverSampling); +} + +/** + * @brief Return Oversampling mode + * @rmtoll CR1 OVER8 LL_USART_GetOverSampling + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_OVERSAMPLING_16 + * @arg @ref LL_USART_OVERSAMPLING_8 + */ +__STATIC_INLINE uint32_t LL_USART_GetOverSampling(const USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR1, USART_CR1_OVER8)); +} + +/** + * @brief Configure if Clock pulse of the last data bit is output to the SCLK pin or not + * @note Macro IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 LBCL LL_USART_SetLastClkPulseOutput + * @param USARTx USART Instance + * @param LastBitClockPulse This parameter can be one of the following values: + * @arg @ref LL_USART_LASTCLKPULSE_NO_OUTPUT + * @arg @ref LL_USART_LASTCLKPULSE_OUTPUT + * @retval None + */ +__STATIC_INLINE void LL_USART_SetLastClkPulseOutput(USART_TypeDef *USARTx, uint32_t LastBitClockPulse) +{ + MODIFY_REG(USARTx->CR2, USART_CR2_LBCL, LastBitClockPulse); +} + +/** + * @brief Retrieve Clock pulse of the last data bit output configuration + * (Last bit Clock pulse output to the SCLK pin or not) + * @note Macro IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 LBCL LL_USART_GetLastClkPulseOutput + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_LASTCLKPULSE_NO_OUTPUT + * @arg @ref LL_USART_LASTCLKPULSE_OUTPUT + */ +__STATIC_INLINE uint32_t LL_USART_GetLastClkPulseOutput(const USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_LBCL)); +} + +/** + * @brief Select the phase of the clock output on the SCLK pin in synchronous mode + * @note Macro IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 CPHA LL_USART_SetClockPhase + * @param USARTx USART Instance + * @param ClockPhase This parameter can be one of the following values: + * @arg @ref LL_USART_PHASE_1EDGE + * @arg @ref LL_USART_PHASE_2EDGE + * @retval None + */ +__STATIC_INLINE void LL_USART_SetClockPhase(USART_TypeDef *USARTx, uint32_t ClockPhase) +{ + MODIFY_REG(USARTx->CR2, USART_CR2_CPHA, ClockPhase); +} + +/** + * @brief Return phase of the clock output on the SCLK pin in synchronous mode + * @note Macro IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 CPHA LL_USART_GetClockPhase + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_PHASE_1EDGE + * @arg @ref LL_USART_PHASE_2EDGE + */ +__STATIC_INLINE uint32_t LL_USART_GetClockPhase(const USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_CPHA)); +} + +/** + * @brief Select the polarity of the clock output on the SCLK pin in synchronous mode + * @note Macro IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 CPOL LL_USART_SetClockPolarity + * @param USARTx USART Instance + * @param ClockPolarity This parameter can be one of the following values: + * @arg @ref LL_USART_POLARITY_LOW + * @arg @ref LL_USART_POLARITY_HIGH + * @retval None + */ +__STATIC_INLINE void LL_USART_SetClockPolarity(USART_TypeDef *USARTx, uint32_t ClockPolarity) +{ + MODIFY_REG(USARTx->CR2, USART_CR2_CPOL, ClockPolarity); +} + +/** + * @brief Return polarity of the clock output on the SCLK pin in synchronous mode + * @note Macro IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 CPOL LL_USART_GetClockPolarity + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_POLARITY_LOW + * @arg @ref LL_USART_POLARITY_HIGH + */ +__STATIC_INLINE uint32_t LL_USART_GetClockPolarity(const USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_CPOL)); +} + +/** + * @brief Configure Clock signal format (Phase Polarity and choice about output of last bit clock pulse) + * @note Macro IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @note Call of this function is equivalent to following function call sequence : + * - Clock Phase configuration using @ref LL_USART_SetClockPhase() function + * - Clock Polarity configuration using @ref LL_USART_SetClockPolarity() function + * - Output of Last bit Clock pulse configuration using @ref LL_USART_SetLastClkPulseOutput() function + * @rmtoll CR2 CPHA LL_USART_ConfigClock\n + * CR2 CPOL LL_USART_ConfigClock\n + * CR2 LBCL LL_USART_ConfigClock + * @param USARTx USART Instance + * @param Phase This parameter can be one of the following values: + * @arg @ref LL_USART_PHASE_1EDGE + * @arg @ref LL_USART_PHASE_2EDGE + * @param Polarity This parameter can be one of the following values: + * @arg @ref LL_USART_POLARITY_LOW + * @arg @ref LL_USART_POLARITY_HIGH + * @param LBCPOutput This parameter can be one of the following values: + * @arg @ref LL_USART_LASTCLKPULSE_NO_OUTPUT + * @arg @ref LL_USART_LASTCLKPULSE_OUTPUT + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigClock(USART_TypeDef *USARTx, uint32_t Phase, uint32_t Polarity, uint32_t LBCPOutput) +{ + MODIFY_REG(USARTx->CR2, USART_CR2_CPHA | USART_CR2_CPOL | USART_CR2_LBCL, Phase | Polarity | LBCPOutput); +} + +/** + * @brief Enable Clock output on SCLK pin + * @note Macro IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 CLKEN LL_USART_EnableSCLKOutput + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableSCLKOutput(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR2, USART_CR2_CLKEN); +} + +/** + * @brief Disable Clock output on SCLK pin + * @note Macro IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 CLKEN LL_USART_DisableSCLKOutput + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableSCLKOutput(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR2, USART_CR2_CLKEN); +} + +/** + * @brief Indicate if Clock output on SCLK pin is enabled + * @note Macro IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 CLKEN LL_USART_IsEnabledSCLKOutput + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledSCLKOutput(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR2, USART_CR2_CLKEN) == (USART_CR2_CLKEN)); +} + +/** + * @brief Set the length of the stop bits + * @rmtoll CR2 STOP LL_USART_SetStopBitsLength + * @param USARTx USART Instance + * @param StopBits This parameter can be one of the following values: + * @arg @ref LL_USART_STOPBITS_0_5 + * @arg @ref LL_USART_STOPBITS_1 + * @arg @ref LL_USART_STOPBITS_1_5 + * @arg @ref LL_USART_STOPBITS_2 + * @retval None + */ +__STATIC_INLINE void LL_USART_SetStopBitsLength(USART_TypeDef *USARTx, uint32_t StopBits) +{ + MODIFY_REG(USARTx->CR2, USART_CR2_STOP, StopBits); +} + +/** + * @brief Retrieve the length of the stop bits + * @rmtoll CR2 STOP LL_USART_GetStopBitsLength + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_STOPBITS_0_5 + * @arg @ref LL_USART_STOPBITS_1 + * @arg @ref LL_USART_STOPBITS_1_5 + * @arg @ref LL_USART_STOPBITS_2 + */ +__STATIC_INLINE uint32_t LL_USART_GetStopBitsLength(const USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_STOP)); +} + +/** + * @brief Configure Character frame format (Datawidth, Parity control, Stop Bits) + * @note Call of this function is equivalent to following function call sequence : + * - Data Width configuration using @ref LL_USART_SetDataWidth() function + * - Parity Control and mode configuration using @ref LL_USART_SetParity() function + * - Stop bits configuration using @ref LL_USART_SetStopBitsLength() function + * @rmtoll CR1 PS LL_USART_ConfigCharacter\n + * CR1 PCE LL_USART_ConfigCharacter\n + * CR1 M LL_USART_ConfigCharacter\n + * CR2 STOP LL_USART_ConfigCharacter + * @param USARTx USART Instance + * @param DataWidth This parameter can be one of the following values: + * @arg @ref LL_USART_DATAWIDTH_8B + * @arg @ref LL_USART_DATAWIDTH_9B + * @param Parity This parameter can be one of the following values: + * @arg @ref LL_USART_PARITY_NONE + * @arg @ref LL_USART_PARITY_EVEN + * @arg @ref LL_USART_PARITY_ODD + * @param StopBits This parameter can be one of the following values: + * @arg @ref LL_USART_STOPBITS_0_5 + * @arg @ref LL_USART_STOPBITS_1 + * @arg @ref LL_USART_STOPBITS_1_5 + * @arg @ref LL_USART_STOPBITS_2 + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigCharacter(USART_TypeDef *USARTx, uint32_t DataWidth, uint32_t Parity, + uint32_t StopBits) +{ + MODIFY_REG(USARTx->CR1, USART_CR1_PS | USART_CR1_PCE | USART_CR1_M, Parity | DataWidth); + MODIFY_REG(USARTx->CR2, USART_CR2_STOP, StopBits); +} + +/** + * @brief Set Address of the USART node. + * @note This is used in multiprocessor communication during Mute mode or Stop mode, + * for wake up with address mark detection. + * @rmtoll CR2 ADD LL_USART_SetNodeAddress + * @param USARTx USART Instance + * @param NodeAddress 4 bit Address of the USART node. + * @retval None + */ +__STATIC_INLINE void LL_USART_SetNodeAddress(USART_TypeDef *USARTx, uint32_t NodeAddress) +{ + MODIFY_REG(USARTx->CR2, USART_CR2_ADD, (NodeAddress & USART_CR2_ADD)); +} + +/** + * @brief Return 4 bit Address of the USART node as set in ADD field of CR2. + * @note only 4bits (b3-b0) of returned value are relevant (b31-b4 are not relevant) + * @rmtoll CR2 ADD LL_USART_GetNodeAddress + * @param USARTx USART Instance + * @retval Address of the USART node (Value between Min_Data=0 and Max_Data=255) + */ +__STATIC_INLINE uint32_t LL_USART_GetNodeAddress(const USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_ADD)); +} + +/** + * @brief Enable RTS HW Flow Control + * @note Macro IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 RTSE LL_USART_EnableRTSHWFlowCtrl + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableRTSHWFlowCtrl(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_RTSE); +} + +/** + * @brief Disable RTS HW Flow Control + * @note Macro IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 RTSE LL_USART_DisableRTSHWFlowCtrl + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableRTSHWFlowCtrl(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_RTSE); +} + +/** + * @brief Enable CTS HW Flow Control + * @note Macro IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 CTSE LL_USART_EnableCTSHWFlowCtrl + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableCTSHWFlowCtrl(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_CTSE); +} + +/** + * @brief Disable CTS HW Flow Control + * @note Macro IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 CTSE LL_USART_DisableCTSHWFlowCtrl + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableCTSHWFlowCtrl(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_CTSE); +} + +/** + * @brief Configure HW Flow Control mode (both CTS and RTS) + * @note Macro IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 RTSE LL_USART_SetHWFlowCtrl\n + * CR3 CTSE LL_USART_SetHWFlowCtrl + * @param USARTx USART Instance + * @param HardwareFlowControl This parameter can be one of the following values: + * @arg @ref LL_USART_HWCONTROL_NONE + * @arg @ref LL_USART_HWCONTROL_RTS + * @arg @ref LL_USART_HWCONTROL_CTS + * @arg @ref LL_USART_HWCONTROL_RTS_CTS + * @retval None + */ +__STATIC_INLINE void LL_USART_SetHWFlowCtrl(USART_TypeDef *USARTx, uint32_t HardwareFlowControl) +{ + MODIFY_REG(USARTx->CR3, USART_CR3_RTSE | USART_CR3_CTSE, HardwareFlowControl); +} + +/** + * @brief Return HW Flow Control configuration (both CTS and RTS) + * @note Macro IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 RTSE LL_USART_GetHWFlowCtrl\n + * CR3 CTSE LL_USART_GetHWFlowCtrl + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_HWCONTROL_NONE + * @arg @ref LL_USART_HWCONTROL_RTS + * @arg @ref LL_USART_HWCONTROL_CTS + * @arg @ref LL_USART_HWCONTROL_RTS_CTS + */ +__STATIC_INLINE uint32_t LL_USART_GetHWFlowCtrl(const USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR3, USART_CR3_RTSE | USART_CR3_CTSE)); +} + +/** + * @brief Enable One bit sampling method + * @rmtoll CR3 ONEBIT LL_USART_EnableOneBitSamp + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableOneBitSamp(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_ONEBIT); +} + +/** + * @brief Disable One bit sampling method + * @rmtoll CR3 ONEBIT LL_USART_DisableOneBitSamp + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableOneBitSamp(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_ONEBIT); +} + +/** + * @brief Indicate if One bit sampling method is enabled + * @rmtoll CR3 ONEBIT LL_USART_IsEnabledOneBitSamp + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledOneBitSamp(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_ONEBIT) == (USART_CR3_ONEBIT)); +} + +/** + * @brief Configure USART BRR register for achieving expected Baud Rate value. + * @note Compute and set USARTDIV value in BRR Register (full BRR content) + * according to used Peripheral Clock, Oversampling mode, and expected Baud Rate values + * @note Peripheral clock and Baud rate values provided as function parameters should be valid + * (Baud rate value != 0) + * @rmtoll BRR BRR LL_USART_SetBaudRate + * @param USARTx USART Instance + * @param PeriphClk Peripheral Clock + * @param OverSampling This parameter can be one of the following values: + * @arg @ref LL_USART_OVERSAMPLING_16 + * @arg @ref LL_USART_OVERSAMPLING_8 + * @param BaudRate Baud Rate + * @retval None + */ +__STATIC_INLINE void LL_USART_SetBaudRate(USART_TypeDef *USARTx, uint32_t PeriphClk, uint32_t OverSampling, + uint32_t BaudRate) +{ + if (OverSampling == LL_USART_OVERSAMPLING_8) + { + USARTx->BRR = (uint16_t)(__LL_USART_DIV_SAMPLING8(PeriphClk, BaudRate)); + } + else + { + USARTx->BRR = (uint16_t)(__LL_USART_DIV_SAMPLING16(PeriphClk, BaudRate)); + } +} + +/** + * @brief Return current Baud Rate value, according to USARTDIV present in BRR register + * (full BRR content), and to used Peripheral Clock and Oversampling mode values + * @note In case of non-initialized or invalid value stored in BRR register, value 0 will be returned. + * @rmtoll BRR BRR LL_USART_GetBaudRate + * @param USARTx USART Instance + * @param PeriphClk Peripheral Clock + * @param OverSampling This parameter can be one of the following values: + * @arg @ref LL_USART_OVERSAMPLING_16 + * @arg @ref LL_USART_OVERSAMPLING_8 + * @retval Baud Rate + */ +__STATIC_INLINE uint32_t LL_USART_GetBaudRate(const USART_TypeDef *USARTx, uint32_t PeriphClk, uint32_t OverSampling) +{ + uint32_t usartdiv = 0x0U; + uint32_t brrresult = 0x0U; + + usartdiv = USARTx->BRR; + + if (OverSampling == LL_USART_OVERSAMPLING_8) + { + if ((usartdiv & 0xFFF7U) != 0U) + { + usartdiv = (uint16_t)((usartdiv & 0xFFF0U) | ((usartdiv & 0x0007U) << 1U)) ; + brrresult = (PeriphClk * 2U) / usartdiv; + } + } + else + { + if ((usartdiv & 0xFFFFU) != 0U) + { + brrresult = PeriphClk / usartdiv; + } + } + return (brrresult); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_Configuration_IRDA Configuration functions related to Irda feature + * @{ + */ + +/** + * @brief Enable IrDA mode + * @note Macro IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @rmtoll CR3 IREN LL_USART_EnableIrda + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIrda(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_IREN); +} + +/** + * @brief Disable IrDA mode + * @note Macro IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @rmtoll CR3 IREN LL_USART_DisableIrda + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIrda(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_IREN); +} + +/** + * @brief Indicate if IrDA mode is enabled + * @note Macro IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @rmtoll CR3 IREN LL_USART_IsEnabledIrda + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIrda(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_IREN) == (USART_CR3_IREN)); +} + +/** + * @brief Configure IrDA Power Mode (Normal or Low Power) + * @note Macro IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @rmtoll CR3 IRLP LL_USART_SetIrdaPowerMode + * @param USARTx USART Instance + * @param PowerMode This parameter can be one of the following values: + * @arg @ref LL_USART_IRDA_POWER_NORMAL + * @arg @ref LL_USART_IRDA_POWER_LOW + * @retval None + */ +__STATIC_INLINE void LL_USART_SetIrdaPowerMode(USART_TypeDef *USARTx, uint32_t PowerMode) +{ + MODIFY_REG(USARTx->CR3, USART_CR3_IRLP, PowerMode); +} + +/** + * @brief Retrieve IrDA Power Mode configuration (Normal or Low Power) + * @note Macro IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @rmtoll CR3 IRLP LL_USART_GetIrdaPowerMode + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_IRDA_POWER_NORMAL + * @arg @ref LL_USART_PHASE_2EDGE + */ +__STATIC_INLINE uint32_t LL_USART_GetIrdaPowerMode(const USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR3, USART_CR3_IRLP)); +} + +/** + * @brief Set Irda prescaler value, used for dividing the USART clock source + * to achieve the Irda Low Power frequency (8 bits value) + * @note Macro IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @rmtoll GTPR PSC LL_USART_SetIrdaPrescaler + * @param USARTx USART Instance + * @param PrescalerValue Value between Min_Data=0x00 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_USART_SetIrdaPrescaler(USART_TypeDef *USARTx, uint32_t PrescalerValue) +{ + MODIFY_REG(USARTx->GTPR, USART_GTPR_PSC, PrescalerValue); +} + +/** + * @brief Return Irda prescaler value, used for dividing the USART clock source + * to achieve the Irda Low Power frequency (8 bits value) + * @note Macro IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @rmtoll GTPR PSC LL_USART_GetIrdaPrescaler + * @param USARTx USART Instance + * @retval Irda prescaler value (Value between Min_Data=0x00 and Max_Data=0xFF) + */ +__STATIC_INLINE uint32_t LL_USART_GetIrdaPrescaler(const USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->GTPR, USART_GTPR_PSC)); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_Configuration_Smartcard Configuration functions related to Smartcard feature + * @{ + */ + +/** + * @brief Enable Smartcard NACK transmission + * @note Macro IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll CR3 NACK LL_USART_EnableSmartcardNACK + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableSmartcardNACK(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_NACK); +} + +/** + * @brief Disable Smartcard NACK transmission + * @note Macro IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll CR3 NACK LL_USART_DisableSmartcardNACK + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableSmartcardNACK(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_NACK); +} + +/** + * @brief Indicate if Smartcard NACK transmission is enabled + * @note Macro IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll CR3 NACK LL_USART_IsEnabledSmartcardNACK + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledSmartcardNACK(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_NACK) == (USART_CR3_NACK)); +} + +/** + * @brief Enable Smartcard mode + * @note Macro IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll CR3 SCEN LL_USART_EnableSmartcard + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableSmartcard(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_SCEN); +} + +/** + * @brief Disable Smartcard mode + * @note Macro IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll CR3 SCEN LL_USART_DisableSmartcard + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableSmartcard(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_SCEN); +} + +/** + * @brief Indicate if Smartcard mode is enabled + * @note Macro IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll CR3 SCEN LL_USART_IsEnabledSmartcard + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledSmartcard(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_SCEN) == (USART_CR3_SCEN)); +} + +/** + * @brief Set Smartcard prescaler value, used for dividing the USART clock + * source to provide the SMARTCARD Clock (5 bits value) + * @note Macro IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll GTPR PSC LL_USART_SetSmartcardPrescaler + * @param USARTx USART Instance + * @param PrescalerValue Value between Min_Data=0 and Max_Data=31 + * @retval None + */ +__STATIC_INLINE void LL_USART_SetSmartcardPrescaler(USART_TypeDef *USARTx, uint32_t PrescalerValue) +{ + MODIFY_REG(USARTx->GTPR, USART_GTPR_PSC, PrescalerValue); +} + +/** + * @brief Return Smartcard prescaler value, used for dividing the USART clock + * source to provide the SMARTCARD Clock (5 bits value) + * @note Macro IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll GTPR PSC LL_USART_GetSmartcardPrescaler + * @param USARTx USART Instance + * @retval Smartcard prescaler value (Value between Min_Data=0 and Max_Data=31) + */ +__STATIC_INLINE uint32_t LL_USART_GetSmartcardPrescaler(const USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->GTPR, USART_GTPR_PSC)); +} + +/** + * @brief Set Smartcard Guard time value, expressed in nb of baud clocks periods + * (GT[7:0] bits : Guard time value) + * @note Macro IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll GTPR GT LL_USART_SetSmartcardGuardTime + * @param USARTx USART Instance + * @param GuardTime Value between Min_Data=0x00 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_USART_SetSmartcardGuardTime(USART_TypeDef *USARTx, uint32_t GuardTime) +{ + MODIFY_REG(USARTx->GTPR, USART_GTPR_GT, GuardTime << USART_POSITION_GTPR_GT); +} + +/** + * @brief Return Smartcard Guard time value, expressed in nb of baud clocks periods + * (GT[7:0] bits : Guard time value) + * @note Macro IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll GTPR GT LL_USART_GetSmartcardGuardTime + * @param USARTx USART Instance + * @retval Smartcard Guard time value (Value between Min_Data=0x00 and Max_Data=0xFF) + */ +__STATIC_INLINE uint32_t LL_USART_GetSmartcardGuardTime(const USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->GTPR, USART_GTPR_GT) >> USART_POSITION_GTPR_GT); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_Configuration_HalfDuplex Configuration functions related to Half Duplex feature + * @{ + */ + +/** + * @brief Enable Single Wire Half-Duplex mode + * @note Macro IS_UART_HALFDUPLEX_INSTANCE(USARTx) can be used to check whether or not + * Half-Duplex mode is supported by the USARTx instance. + * @rmtoll CR3 HDSEL LL_USART_EnableHalfDuplex + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableHalfDuplex(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_HDSEL); +} + +/** + * @brief Disable Single Wire Half-Duplex mode + * @note Macro IS_UART_HALFDUPLEX_INSTANCE(USARTx) can be used to check whether or not + * Half-Duplex mode is supported by the USARTx instance. + * @rmtoll CR3 HDSEL LL_USART_DisableHalfDuplex + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableHalfDuplex(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_HDSEL); +} + +/** + * @brief Indicate if Single Wire Half-Duplex mode is enabled + * @note Macro IS_UART_HALFDUPLEX_INSTANCE(USARTx) can be used to check whether or not + * Half-Duplex mode is supported by the USARTx instance. + * @rmtoll CR3 HDSEL LL_USART_IsEnabledHalfDuplex + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledHalfDuplex(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_HDSEL) == (USART_CR3_HDSEL)); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_Configuration_LIN Configuration functions related to LIN feature + * @{ + */ + +/** + * @brief Set LIN Break Detection Length + * @note Macro IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LBDL LL_USART_SetLINBrkDetectionLen + * @param USARTx USART Instance + * @param LINBDLength This parameter can be one of the following values: + * @arg @ref LL_USART_LINBREAK_DETECT_10B + * @arg @ref LL_USART_LINBREAK_DETECT_11B + * @retval None + */ +__STATIC_INLINE void LL_USART_SetLINBrkDetectionLen(USART_TypeDef *USARTx, uint32_t LINBDLength) +{ + MODIFY_REG(USARTx->CR2, USART_CR2_LBDL, LINBDLength); +} + +/** + * @brief Return LIN Break Detection Length + * @note Macro IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LBDL LL_USART_GetLINBrkDetectionLen + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_LINBREAK_DETECT_10B + * @arg @ref LL_USART_LINBREAK_DETECT_11B + */ +__STATIC_INLINE uint32_t LL_USART_GetLINBrkDetectionLen(const USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_LBDL)); +} + +/** + * @brief Enable LIN mode + * @note Macro IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LINEN LL_USART_EnableLIN + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableLIN(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR2, USART_CR2_LINEN); +} + +/** + * @brief Disable LIN mode + * @note Macro IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LINEN LL_USART_DisableLIN + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableLIN(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR2, USART_CR2_LINEN); +} + +/** + * @brief Indicate if LIN mode is enabled + * @note Macro IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LINEN LL_USART_IsEnabledLIN + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledLIN(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR2, USART_CR2_LINEN) == (USART_CR2_LINEN)); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_AdvancedConfiguration Advanced Configurations services + * @{ + */ + +/** + * @brief Perform basic configuration of USART for enabling use in Asynchronous Mode (UART) + * @note In UART mode, the following bits must be kept cleared: + * - LINEN bit in the USART_CR2 register, + * - CLKEN bit in the USART_CR2 register, + * - SCEN bit in the USART_CR3 register, + * - IREN bit in the USART_CR3 register, + * - HDSEL bit in the USART_CR3 register. + * @note Call of this function is equivalent to following function call sequence : + * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function + * - Clear CLKEN in CR2 using @ref LL_USART_DisableSCLKOutput() function + * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function + * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function + * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function + * @note Other remaining configurations items related to Asynchronous Mode + * (as Baud Rate, Word length, Parity, ...) should be set using + * dedicated functions + * @rmtoll CR2 LINEN LL_USART_ConfigAsyncMode\n + * CR2 CLKEN LL_USART_ConfigAsyncMode\n + * CR3 SCEN LL_USART_ConfigAsyncMode\n + * CR3 IREN LL_USART_ConfigAsyncMode\n + * CR3 HDSEL LL_USART_ConfigAsyncMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigAsyncMode(USART_TypeDef *USARTx) +{ + /* In Asynchronous mode, the following bits must be kept cleared: + - LINEN, CLKEN bits in the USART_CR2 register, + - SCEN, IREN and HDSEL bits in the USART_CR3 register.*/ + CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); + CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN | USART_CR3_HDSEL)); +} + +/** + * @brief Perform basic configuration of USART for enabling use in Synchronous Mode + * @note In Synchronous mode, the following bits must be kept cleared: + * - LINEN bit in the USART_CR2 register, + * - SCEN bit in the USART_CR3 register, + * - IREN bit in the USART_CR3 register, + * - HDSEL bit in the USART_CR3 register. + * This function also sets the USART in Synchronous mode. + * @note Macro IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @note Call of this function is equivalent to following function call sequence : + * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function + * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function + * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function + * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function + * - Set CLKEN in CR2 using @ref LL_USART_EnableSCLKOutput() function + * @note Other remaining configurations items related to Synchronous Mode + * (as Baud Rate, Word length, Parity, Clock Polarity, ...) should be set using + * dedicated functions + * @rmtoll CR2 LINEN LL_USART_ConfigSyncMode\n + * CR2 CLKEN LL_USART_ConfigSyncMode\n + * CR3 SCEN LL_USART_ConfigSyncMode\n + * CR3 IREN LL_USART_ConfigSyncMode\n + * CR3 HDSEL LL_USART_ConfigSyncMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigSyncMode(USART_TypeDef *USARTx) +{ + /* In Synchronous mode, the following bits must be kept cleared: + - LINEN bit in the USART_CR2 register, + - SCEN, IREN and HDSEL bits in the USART_CR3 register.*/ + CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN)); + CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN | USART_CR3_HDSEL)); + /* set the UART/USART in Synchronous mode */ + SET_BIT(USARTx->CR2, USART_CR2_CLKEN); +} + +/** + * @brief Perform basic configuration of USART for enabling use in LIN Mode + * @note In LIN mode, the following bits must be kept cleared: + * - STOP and CLKEN bits in the USART_CR2 register, + * - SCEN bit in the USART_CR3 register, + * - IREN bit in the USART_CR3 register, + * - HDSEL bit in the USART_CR3 register. + * This function also set the UART/USART in LIN mode. + * @note Macro IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @note Call of this function is equivalent to following function call sequence : + * - Clear CLKEN in CR2 using @ref LL_USART_DisableSCLKOutput() function + * - Clear STOP in CR2 using @ref LL_USART_SetStopBitsLength() function + * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function + * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function + * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function + * - Set LINEN in CR2 using @ref LL_USART_EnableLIN() function + * @note Other remaining configurations items related to LIN Mode + * (as Baud Rate, Word length, LIN Break Detection Length, ...) should be set using + * dedicated functions + * @rmtoll CR2 CLKEN LL_USART_ConfigLINMode\n + * CR2 STOP LL_USART_ConfigLINMode\n + * CR2 LINEN LL_USART_ConfigLINMode\n + * CR3 IREN LL_USART_ConfigLINMode\n + * CR3 SCEN LL_USART_ConfigLINMode\n + * CR3 HDSEL LL_USART_ConfigLINMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigLINMode(USART_TypeDef *USARTx) +{ + /* In LIN mode, the following bits must be kept cleared: + - STOP and CLKEN bits in the USART_CR2 register, + - IREN, SCEN and HDSEL bits in the USART_CR3 register.*/ + CLEAR_BIT(USARTx->CR2, (USART_CR2_CLKEN | USART_CR2_STOP)); + CLEAR_BIT(USARTx->CR3, (USART_CR3_IREN | USART_CR3_SCEN | USART_CR3_HDSEL)); + /* Set the UART/USART in LIN mode */ + SET_BIT(USARTx->CR2, USART_CR2_LINEN); +} + +/** + * @brief Perform basic configuration of USART for enabling use in Half Duplex Mode + * @note In Half Duplex mode, the following bits must be kept cleared: + * - LINEN bit in the USART_CR2 register, + * - CLKEN bit in the USART_CR2 register, + * - SCEN bit in the USART_CR3 register, + * - IREN bit in the USART_CR3 register, + * This function also sets the UART/USART in Half Duplex mode. + * @note Macro IS_UART_HALFDUPLEX_INSTANCE(USARTx) can be used to check whether or not + * Half-Duplex mode is supported by the USARTx instance. + * @note Call of this function is equivalent to following function call sequence : + * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function + * - Clear CLKEN in CR2 using @ref LL_USART_DisableSCLKOutput() function + * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function + * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function + * - Set HDSEL in CR3 using @ref LL_USART_EnableHalfDuplex() function + * @note Other remaining configurations items related to Half Duplex Mode + * (as Baud Rate, Word length, Parity, ...) should be set using + * dedicated functions + * @rmtoll CR2 LINEN LL_USART_ConfigHalfDuplexMode\n + * CR2 CLKEN LL_USART_ConfigHalfDuplexMode\n + * CR3 HDSEL LL_USART_ConfigHalfDuplexMode\n + * CR3 SCEN LL_USART_ConfigHalfDuplexMode\n + * CR3 IREN LL_USART_ConfigHalfDuplexMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigHalfDuplexMode(USART_TypeDef *USARTx) +{ + /* In Half Duplex mode, the following bits must be kept cleared: + - LINEN and CLKEN bits in the USART_CR2 register, + - SCEN and IREN bits in the USART_CR3 register.*/ + CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); + CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN)); + /* set the UART/USART in Half Duplex mode */ + SET_BIT(USARTx->CR3, USART_CR3_HDSEL); +} + +/** + * @brief Perform basic configuration of USART for enabling use in Smartcard Mode + * @note In Smartcard mode, the following bits must be kept cleared: + * - LINEN bit in the USART_CR2 register, + * - IREN bit in the USART_CR3 register, + * - HDSEL bit in the USART_CR3 register. + * This function also configures Stop bits to 1.5 bits and + * sets the USART in Smartcard mode (SCEN bit). + * Clock Output is also enabled (CLKEN). + * @note Macro IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @note Call of this function is equivalent to following function call sequence : + * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function + * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function + * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function + * - Configure STOP in CR2 using @ref LL_USART_SetStopBitsLength() function + * - Set CLKEN in CR2 using @ref LL_USART_EnableSCLKOutput() function + * - Set SCEN in CR3 using @ref LL_USART_EnableSmartcard() function + * @note Other remaining configurations items related to Smartcard Mode + * (as Baud Rate, Word length, Parity, ...) should be set using + * dedicated functions + * @rmtoll CR2 LINEN LL_USART_ConfigSmartcardMode\n + * CR2 STOP LL_USART_ConfigSmartcardMode\n + * CR2 CLKEN LL_USART_ConfigSmartcardMode\n + * CR3 HDSEL LL_USART_ConfigSmartcardMode\n + * CR3 SCEN LL_USART_ConfigSmartcardMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigSmartcardMode(USART_TypeDef *USARTx) +{ + /* In Smartcard mode, the following bits must be kept cleared: + - LINEN bit in the USART_CR2 register, + - IREN and HDSEL bits in the USART_CR3 register.*/ + CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN)); + CLEAR_BIT(USARTx->CR3, (USART_CR3_IREN | USART_CR3_HDSEL)); + /* Configure Stop bits to 1.5 bits */ + /* Synchronous mode is activated by default */ + SET_BIT(USARTx->CR2, (USART_CR2_STOP_0 | USART_CR2_STOP_1 | USART_CR2_CLKEN)); + /* set the UART/USART in Smartcard mode */ + SET_BIT(USARTx->CR3, USART_CR3_SCEN); +} + +/** + * @brief Perform basic configuration of USART for enabling use in Irda Mode + * @note In IRDA mode, the following bits must be kept cleared: + * - LINEN bit in the USART_CR2 register, + * - STOP and CLKEN bits in the USART_CR2 register, + * - SCEN bit in the USART_CR3 register, + * - HDSEL bit in the USART_CR3 register. + * This function also sets the UART/USART in IRDA mode (IREN bit). + * @note Macro IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @note Call of this function is equivalent to following function call sequence : + * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function + * - Clear CLKEN in CR2 using @ref LL_USART_DisableSCLKOutput() function + * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function + * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function + * - Configure STOP in CR2 using @ref LL_USART_SetStopBitsLength() function + * - Set IREN in CR3 using @ref LL_USART_EnableIrda() function + * @note Other remaining configurations items related to Irda Mode + * (as Baud Rate, Word length, Power mode, ...) should be set using + * dedicated functions + * @rmtoll CR2 LINEN LL_USART_ConfigIrdaMode\n + * CR2 CLKEN LL_USART_ConfigIrdaMode\n + * CR2 STOP LL_USART_ConfigIrdaMode\n + * CR3 SCEN LL_USART_ConfigIrdaMode\n + * CR3 HDSEL LL_USART_ConfigIrdaMode\n + * CR3 IREN LL_USART_ConfigIrdaMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigIrdaMode(USART_TypeDef *USARTx) +{ + /* In IRDA mode, the following bits must be kept cleared: + - LINEN, STOP and CLKEN bits in the USART_CR2 register, + - SCEN and HDSEL bits in the USART_CR3 register.*/ + CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN | USART_CR2_STOP)); + CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL)); + /* set the UART/USART in IRDA mode */ + SET_BIT(USARTx->CR3, USART_CR3_IREN); +} + +/** + * @brief Perform basic configuration of USART for enabling use in Multi processor Mode + * (several USARTs connected in a network, one of the USARTs can be the master, + * its TX output connected to the RX inputs of the other slaves USARTs). + * @note In MultiProcessor mode, the following bits must be kept cleared: + * - LINEN bit in the USART_CR2 register, + * - CLKEN bit in the USART_CR2 register, + * - SCEN bit in the USART_CR3 register, + * - IREN bit in the USART_CR3 register, + * - HDSEL bit in the USART_CR3 register. + * @note Call of this function is equivalent to following function call sequence : + * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function + * - Clear CLKEN in CR2 using @ref LL_USART_DisableSCLKOutput() function + * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function + * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function + * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function + * @note Other remaining configurations items related to Multi processor Mode + * (as Baud Rate, Wake Up Method, Node address, ...) should be set using + * dedicated functions + * @rmtoll CR2 LINEN LL_USART_ConfigMultiProcessMode\n + * CR2 CLKEN LL_USART_ConfigMultiProcessMode\n + * CR3 SCEN LL_USART_ConfigMultiProcessMode\n + * CR3 HDSEL LL_USART_ConfigMultiProcessMode\n + * CR3 IREN LL_USART_ConfigMultiProcessMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigMultiProcessMode(USART_TypeDef *USARTx) +{ + /* In Multi Processor mode, the following bits must be kept cleared: + - LINEN and CLKEN bits in the USART_CR2 register, + - IREN, SCEN and HDSEL bits in the USART_CR3 register.*/ + CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); + CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_FLAG_Management FLAG_Management + * @{ + */ + +/** + * @brief Check if the USART Parity Error Flag is set or not + * @rmtoll SR PE LL_USART_IsActiveFlag_PE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_PE(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_PE) == (USART_SR_PE)); +} + +/** + * @brief Check if the USART Framing Error Flag is set or not + * @rmtoll SR FE LL_USART_IsActiveFlag_FE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_FE(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_FE) == (USART_SR_FE)); +} + +/** + * @brief Check if the USART Noise error detected Flag is set or not + * @rmtoll SR NF LL_USART_IsActiveFlag_NE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_NE(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_NE) == (USART_SR_NE)); +} + +/** + * @brief Check if the USART OverRun Error Flag is set or not + * @rmtoll SR ORE LL_USART_IsActiveFlag_ORE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_ORE(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_ORE) == (USART_SR_ORE)); +} + +/** + * @brief Check if the USART IDLE line detected Flag is set or not + * @rmtoll SR IDLE LL_USART_IsActiveFlag_IDLE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_IDLE(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_IDLE) == (USART_SR_IDLE)); +} + +/** + * @brief Check if the USART Read Data Register Not Empty Flag is set or not + * @rmtoll SR RXNE LL_USART_IsActiveFlag_RXNE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_RXNE(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_RXNE) == (USART_SR_RXNE)); +} + +/** + * @brief Check if the USART Transmission Complete Flag is set or not + * @rmtoll SR TC LL_USART_IsActiveFlag_TC + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_TC(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_TC) == (USART_SR_TC)); +} + +/** + * @brief Check if the USART Transmit Data Register Empty Flag is set or not + * @rmtoll SR TXE LL_USART_IsActiveFlag_TXE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_TXE(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_TXE) == (USART_SR_TXE)); +} + +/** + * @brief Check if the USART LIN Break Detection Flag is set or not + * @note Macro IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll SR LBD LL_USART_IsActiveFlag_LBD + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_LBD(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_LBD) == (USART_SR_LBD)); +} + +/** + * @brief Check if the USART CTS Flag is set or not + * @note Macro IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll SR CTS LL_USART_IsActiveFlag_nCTS + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_nCTS(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_CTS) == (USART_SR_CTS)); +} + +/** + * @brief Check if the USART Send Break Flag is set or not + * @rmtoll CR1 SBK LL_USART_IsActiveFlag_SBK + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_SBK(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_SBK) == (USART_CR1_SBK)); +} + +/** + * @brief Check if the USART Receive Wake Up from mute mode Flag is set or not + * @rmtoll CR1 RWU LL_USART_IsActiveFlag_RWU + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_RWU(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_RWU) == (USART_CR1_RWU)); +} + +/** + * @brief Clear Parity Error Flag + * @note Clearing this flag is done by a read access to the USARTx_SR + * register followed by a read access to the USARTx_DR register. + * @note Please also consider that when clearing this flag, other flags as + * NE, FE, ORE, IDLE would also be cleared. + * @rmtoll SR PE LL_USART_ClearFlag_PE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_PE(USART_TypeDef *USARTx) +{ + __IO uint32_t tmpreg; + tmpreg = USARTx->SR; + (void) tmpreg; + tmpreg = USARTx->DR; + (void) tmpreg; +} + +/** + * @brief Clear Framing Error Flag + * @note Clearing this flag is done by a read access to the USARTx_SR + * register followed by a read access to the USARTx_DR register. + * @note Please also consider that when clearing this flag, other flags as + * PE, NE, ORE, IDLE would also be cleared. + * @rmtoll SR FE LL_USART_ClearFlag_FE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_FE(USART_TypeDef *USARTx) +{ + __IO uint32_t tmpreg; + tmpreg = USARTx->SR; + (void) tmpreg; + tmpreg = USARTx->DR; + (void) tmpreg; +} + +/** + * @brief Clear Noise detected Flag + * @note Clearing this flag is done by a read access to the USARTx_SR + * register followed by a read access to the USARTx_DR register. + * @note Please also consider that when clearing this flag, other flags as + * PE, FE, ORE, IDLE would also be cleared. + * @rmtoll SR NF LL_USART_ClearFlag_NE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_NE(USART_TypeDef *USARTx) +{ + __IO uint32_t tmpreg; + tmpreg = USARTx->SR; + (void) tmpreg; + tmpreg = USARTx->DR; + (void) tmpreg; +} + +/** + * @brief Clear OverRun Error Flag + * @note Clearing this flag is done by a read access to the USARTx_SR + * register followed by a read access to the USARTx_DR register. + * @note Please also consider that when clearing this flag, other flags as + * PE, NE, FE, IDLE would also be cleared. + * @rmtoll SR ORE LL_USART_ClearFlag_ORE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_ORE(USART_TypeDef *USARTx) +{ + __IO uint32_t tmpreg; + tmpreg = USARTx->SR; + (void) tmpreg; + tmpreg = USARTx->DR; + (void) tmpreg; +} + +/** + * @brief Clear IDLE line detected Flag + * @note Clearing this flag is done by a read access to the USARTx_SR + * register followed by a read access to the USARTx_DR register. + * @note Please also consider that when clearing this flag, other flags as + * PE, NE, FE, ORE would also be cleared. + * @rmtoll SR IDLE LL_USART_ClearFlag_IDLE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_IDLE(USART_TypeDef *USARTx) +{ + __IO uint32_t tmpreg; + tmpreg = USARTx->SR; + (void) tmpreg; + tmpreg = USARTx->DR; + (void) tmpreg; +} + +/** + * @brief Clear Transmission Complete Flag + * @rmtoll SR TC LL_USART_ClearFlag_TC + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_TC(USART_TypeDef *USARTx) +{ + WRITE_REG(USARTx->SR, ~(USART_SR_TC)); +} + +/** + * @brief Clear RX Not Empty Flag + * @rmtoll SR RXNE LL_USART_ClearFlag_RXNE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_RXNE(USART_TypeDef *USARTx) +{ + WRITE_REG(USARTx->SR, ~(USART_SR_RXNE)); +} + +/** + * @brief Clear LIN Break Detection Flag + * @note Macro IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll SR LBD LL_USART_ClearFlag_LBD + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_LBD(USART_TypeDef *USARTx) +{ + WRITE_REG(USARTx->SR, ~(USART_SR_LBD)); +} + +/** + * @brief Clear CTS Interrupt Flag + * @note Macro IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll SR CTS LL_USART_ClearFlag_nCTS + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_nCTS(USART_TypeDef *USARTx) +{ + WRITE_REG(USARTx->SR, ~(USART_SR_CTS)); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_IT_Management IT_Management + * @{ + */ + +/** + * @brief Enable IDLE Interrupt + * @rmtoll CR1 IDLEIE LL_USART_EnableIT_IDLE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_IDLE(USART_TypeDef *USARTx) +{ + ATOMIC_SET_BIT(USARTx->CR1, USART_CR1_IDLEIE); +} + +/** + * @brief Enable RX Not Empty Interrupt + * @rmtoll CR1 RXNEIE LL_USART_EnableIT_RXNE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_RXNE(USART_TypeDef *USARTx) +{ + ATOMIC_SET_BIT(USARTx->CR1, USART_CR1_RXNEIE); +} + +/** + * @brief Enable Transmission Complete Interrupt + * @rmtoll CR1 TCIE LL_USART_EnableIT_TC + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_TC(USART_TypeDef *USARTx) +{ + ATOMIC_SET_BIT(USARTx->CR1, USART_CR1_TCIE); +} + +/** + * @brief Enable TX Empty Interrupt + * @rmtoll CR1 TXEIE LL_USART_EnableIT_TXE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_TXE(USART_TypeDef *USARTx) +{ + ATOMIC_SET_BIT(USARTx->CR1, USART_CR1_TXEIE); +} + +/** + * @brief Enable Parity Error Interrupt + * @rmtoll CR1 PEIE LL_USART_EnableIT_PE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_PE(USART_TypeDef *USARTx) +{ + ATOMIC_SET_BIT(USARTx->CR1, USART_CR1_PEIE); +} + +/** + * @brief Enable LIN Break Detection Interrupt + * @note Macro IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LBDIE LL_USART_EnableIT_LBD + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_LBD(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR2, USART_CR2_LBDIE); +} + +/** + * @brief Enable Error Interrupt + * @note When set, Error Interrupt Enable Bit is enabling interrupt generation in case of a framing + * error, overrun error or noise flag (FE=1 or ORE=1 or NF=1 in the USARTx_SR register). + * 0: Interrupt is inhibited + * 1: An interrupt is generated when FE=1 or ORE=1 or NF=1 in the USARTx_SR register. + * @rmtoll CR3 EIE LL_USART_EnableIT_ERROR + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_ERROR(USART_TypeDef *USARTx) +{ + ATOMIC_SET_BIT(USARTx->CR3, USART_CR3_EIE); +} + +/** + * @brief Enable CTS Interrupt + * @note Macro IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 CTSIE LL_USART_EnableIT_CTS + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_CTS(USART_TypeDef *USARTx) +{ + ATOMIC_SET_BIT(USARTx->CR3, USART_CR3_CTSIE); +} + +/** + * @brief Disable IDLE Interrupt + * @rmtoll CR1 IDLEIE LL_USART_DisableIT_IDLE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_IDLE(USART_TypeDef *USARTx) +{ + ATOMIC_CLEAR_BIT(USARTx->CR1, USART_CR1_IDLEIE); +} + +/** + * @brief Disable RX Not Empty Interrupt + * @rmtoll CR1 RXNEIE LL_USART_DisableIT_RXNE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_RXNE(USART_TypeDef *USARTx) +{ + ATOMIC_CLEAR_BIT(USARTx->CR1, USART_CR1_RXNEIE); +} + +/** + * @brief Disable Transmission Complete Interrupt + * @rmtoll CR1 TCIE LL_USART_DisableIT_TC + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_TC(USART_TypeDef *USARTx) +{ + ATOMIC_CLEAR_BIT(USARTx->CR1, USART_CR1_TCIE); +} + +/** + * @brief Disable TX Empty Interrupt + * @rmtoll CR1 TXEIE LL_USART_DisableIT_TXE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_TXE(USART_TypeDef *USARTx) +{ + ATOMIC_CLEAR_BIT(USARTx->CR1, USART_CR1_TXEIE); +} + +/** + * @brief Disable Parity Error Interrupt + * @rmtoll CR1 PEIE LL_USART_DisableIT_PE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_PE(USART_TypeDef *USARTx) +{ + ATOMIC_CLEAR_BIT(USARTx->CR1, USART_CR1_PEIE); +} + +/** + * @brief Disable LIN Break Detection Interrupt + * @note Macro IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LBDIE LL_USART_DisableIT_LBD + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_LBD(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR2, USART_CR2_LBDIE); +} + +/** + * @brief Disable Error Interrupt + * @note When set, Error Interrupt Enable Bit is enabling interrupt generation in case of a framing + * error, overrun error or noise flag (FE=1 or ORE=1 or NF=1 in the USARTx_SR register). + * 0: Interrupt is inhibited + * 1: An interrupt is generated when FE=1 or ORE=1 or NF=1 in the USARTx_SR register. + * @rmtoll CR3 EIE LL_USART_DisableIT_ERROR + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_ERROR(USART_TypeDef *USARTx) +{ + ATOMIC_CLEAR_BIT(USARTx->CR3, USART_CR3_EIE); +} + +/** + * @brief Disable CTS Interrupt + * @note Macro IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 CTSIE LL_USART_DisableIT_CTS + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_CTS(USART_TypeDef *USARTx) +{ + ATOMIC_CLEAR_BIT(USARTx->CR3, USART_CR3_CTSIE); +} + +/** + * @brief Check if the USART IDLE Interrupt source is enabled or disabled. + * @rmtoll CR1 IDLEIE LL_USART_IsEnabledIT_IDLE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_IDLE(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_IDLEIE) == (USART_CR1_IDLEIE)); +} + +/** + * @brief Check if the USART RX Not Empty Interrupt is enabled or disabled. + * @rmtoll CR1 RXNEIE LL_USART_IsEnabledIT_RXNE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_RXNE(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_RXNEIE) == (USART_CR1_RXNEIE)); +} + +/** + * @brief Check if the USART Transmission Complete Interrupt is enabled or disabled. + * @rmtoll CR1 TCIE LL_USART_IsEnabledIT_TC + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_TC(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_TCIE) == (USART_CR1_TCIE)); +} + +/** + * @brief Check if the USART TX Empty Interrupt is enabled or disabled. + * @rmtoll CR1 TXEIE LL_USART_IsEnabledIT_TXE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_TXE(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_TXEIE) == (USART_CR1_TXEIE)); +} + +/** + * @brief Check if the USART Parity Error Interrupt is enabled or disabled. + * @rmtoll CR1 PEIE LL_USART_IsEnabledIT_PE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_PE(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_PEIE) == (USART_CR1_PEIE)); +} + +/** + * @brief Check if the USART LIN Break Detection Interrupt is enabled or disabled. + * @note Macro IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LBDIE LL_USART_IsEnabledIT_LBD + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_LBD(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR2, USART_CR2_LBDIE) == (USART_CR2_LBDIE)); +} + +/** + * @brief Check if the USART Error Interrupt is enabled or disabled. + * @rmtoll CR3 EIE LL_USART_IsEnabledIT_ERROR + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_ERROR(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_EIE) == (USART_CR3_EIE)); +} + +/** + * @brief Check if the USART CTS Interrupt is enabled or disabled. + * @note Macro IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 CTSIE LL_USART_IsEnabledIT_CTS + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_CTS(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_CTSIE) == (USART_CR3_CTSIE)); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_DMA_Management DMA_Management + * @{ + */ + +/** + * @brief Enable DMA Mode for reception + * @rmtoll CR3 DMAR LL_USART_EnableDMAReq_RX + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableDMAReq_RX(USART_TypeDef *USARTx) +{ + ATOMIC_SET_BIT(USARTx->CR3, USART_CR3_DMAR); +} + +/** + * @brief Disable DMA Mode for reception + * @rmtoll CR3 DMAR LL_USART_DisableDMAReq_RX + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableDMAReq_RX(USART_TypeDef *USARTx) +{ + ATOMIC_CLEAR_BIT(USARTx->CR3, USART_CR3_DMAR); +} + +/** + * @brief Check if DMA Mode is enabled for reception + * @rmtoll CR3 DMAR LL_USART_IsEnabledDMAReq_RX + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledDMAReq_RX(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_DMAR) == (USART_CR3_DMAR)); +} + +/** + * @brief Enable DMA Mode for transmission + * @rmtoll CR3 DMAT LL_USART_EnableDMAReq_TX + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableDMAReq_TX(USART_TypeDef *USARTx) +{ + ATOMIC_SET_BIT(USARTx->CR3, USART_CR3_DMAT); +} + +/** + * @brief Disable DMA Mode for transmission + * @rmtoll CR3 DMAT LL_USART_DisableDMAReq_TX + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableDMAReq_TX(USART_TypeDef *USARTx) +{ + ATOMIC_CLEAR_BIT(USARTx->CR3, USART_CR3_DMAT); +} + +/** + * @brief Check if DMA Mode is enabled for transmission + * @rmtoll CR3 DMAT LL_USART_IsEnabledDMAReq_TX + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledDMAReq_TX(const USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_DMAT) == (USART_CR3_DMAT)); +} + +/** + * @brief Get the data register address used for DMA transfer + * @rmtoll DR DR LL_USART_DMA_GetRegAddr + * @note Address of Data Register is valid for both Transmit and Receive transfers. + * @param USARTx USART Instance + * @retval Address of data register + */ +__STATIC_INLINE uint32_t LL_USART_DMA_GetRegAddr(const USART_TypeDef *USARTx) +{ + /* return address of DR register */ + return ((uint32_t) &(USARTx->DR)); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_Data_Management Data_Management + * @{ + */ + +/** + * @brief Read Receiver Data register (Receive Data value, 8 bits) + * @rmtoll DR DR LL_USART_ReceiveData8 + * @param USARTx USART Instance + * @retval Value between Min_Data=0x00 and Max_Data=0xFF + */ +__STATIC_INLINE uint8_t LL_USART_ReceiveData8(const USART_TypeDef *USARTx) +{ + return (uint8_t)(READ_BIT(USARTx->DR, USART_DR_DR)); +} + +/** + * @brief Read Receiver Data register (Receive Data value, 9 bits) + * @rmtoll DR DR LL_USART_ReceiveData9 + * @param USARTx USART Instance + * @retval Value between Min_Data=0x00 and Max_Data=0x1FF + */ +__STATIC_INLINE uint16_t LL_USART_ReceiveData9(const USART_TypeDef *USARTx) +{ + return (uint16_t)(READ_BIT(USARTx->DR, USART_DR_DR)); +} + +/** + * @brief Write in Transmitter Data Register (Transmit Data value, 8 bits) + * @rmtoll DR DR LL_USART_TransmitData8 + * @param USARTx USART Instance + * @param Value between Min_Data=0x00 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_USART_TransmitData8(USART_TypeDef *USARTx, uint8_t Value) +{ + USARTx->DR = Value; +} + +/** + * @brief Write in Transmitter Data Register (Transmit Data value, 9 bits) + * @rmtoll DR DR LL_USART_TransmitData9 + * @param USARTx USART Instance + * @param Value between Min_Data=0x00 and Max_Data=0x1FF + * @retval None + */ +__STATIC_INLINE void LL_USART_TransmitData9(USART_TypeDef *USARTx, uint16_t Value) +{ + USARTx->DR = Value & 0x1FFU; +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_Execution Execution + * @{ + */ + +/** + * @brief Request Break sending + * @rmtoll CR1 SBK LL_USART_RequestBreakSending + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_RequestBreakSending(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR1, USART_CR1_SBK); +} + +/** + * @brief Put USART in Mute mode + * @rmtoll CR1 RWU LL_USART_RequestEnterMuteMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_RequestEnterMuteMode(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR1, USART_CR1_RWU); +} + +/** + * @brief Put USART in Active mode + * @rmtoll CR1 RWU LL_USART_RequestExitMuteMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_RequestExitMuteMode(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR1, USART_CR1_RWU); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup USART_LL_EF_Init Initialization and de-initialization functions + * @{ + */ +ErrorStatus LL_USART_DeInit(const USART_TypeDef *USARTx); +ErrorStatus LL_USART_Init(USART_TypeDef *USARTx, const LL_USART_InitTypeDef *USART_InitStruct); +void LL_USART_StructInit(LL_USART_InitTypeDef *USART_InitStruct); +ErrorStatus LL_USART_ClockInit(USART_TypeDef *USARTx, const LL_USART_ClockInitTypeDef *USART_ClockInitStruct); +void LL_USART_ClockStructInit(LL_USART_ClockInitTypeDef *USART_ClockInitStruct); +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* USART1 || USART2 || USART3 || USART6 || UART4 || UART5 || UART7 || UART8 || UART9 || UART10 */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_USART_H */ + diff --git a/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h b/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h new file mode 100644 index 0000000..accdac7 --- /dev/null +++ b/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 Frequency of Ticks (Hz) + * @retval None + */ +__STATIC_INLINE void LL_InitTick(uint32_t HCLKFrequency, uint32_t Ticks) +{ + /* Configure the SysTick to have interrupt in 1ms time base */ + SysTick->LOAD = (uint32_t)((HCLKFrequency / Ticks) - 1UL); /* set reload register */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable the Systick Timer */ +} + +void LL_Init1msTick(uint32_t HCLKFrequency); +void LL_mDelay(uint32_t Delay); + +/** + * @} + */ + +/** @defgroup UTILS_EF_SYSTEM SYSTEM + * @{ + */ + +void LL_SetSystemCoreClock(uint32_t HCLKFrequency); +ErrorStatus LL_SetFlashLatency(uint32_t HCLK_Frequency); +ErrorStatus LL_PLL_ConfigSystemClock_HSI(LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, + LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct); +ErrorStatus LL_PLL_ConfigSystemClock_HSE(uint32_t HSEFrequency, uint32_t HSEBypass, + LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_UTILS_H */ diff --git a/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt b/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt new file mode 100644 index 0000000..3edc4d1 --- /dev/null +++ b/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/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c new file mode 100644 index 0000000..862ec73 --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c @@ -0,0 +1,616 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal.c + * @author MCD Application Team + * @brief HAL module driver. + * This is the common part of the HAL initialization + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The common HAL driver contains a set of generic and common APIs that can be + used by the PPP peripheral drivers and the user to start using the HAL. + [..] + The HAL contains two APIs' categories: + (+) Common HAL APIs + (+) Services HAL APIs + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup HAL HAL + * @brief HAL module driver. + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup HAL_Private_Constants + * @{ + */ +/** + * @brief STM32F4xx HAL Driver version number V1.8.5 + */ +#define __STM32F4xx_HAL_VERSION_MAIN (0x01U) /*!< [31:24] main version */ +#define __STM32F4xx_HAL_VERSION_SUB1 (0x08U) /*!< [23:16] sub1 version */ +#define __STM32F4xx_HAL_VERSION_SUB2 (0x05U) /*!< [15:8] sub2 version */ +#define __STM32F4xx_HAL_VERSION_RC (0x00U) /*!< [7:0] release candidate */ +#define __STM32F4xx_HAL_VERSION ((__STM32F4xx_HAL_VERSION_MAIN << 24U)\ + |(__STM32F4xx_HAL_VERSION_SUB1 << 16U)\ + |(__STM32F4xx_HAL_VERSION_SUB2 << 8U )\ + |(__STM32F4xx_HAL_VERSION_RC)) + +#define IDCODE_DEVID_MASK 0x00000FFFU + +/* ------------ RCC registers bit address in the alias region ----------- */ +#define SYSCFG_OFFSET (SYSCFG_BASE - PERIPH_BASE) +/* --- MEMRMP Register ---*/ +/* Alias word address of UFB_MODE bit */ +#define MEMRMP_OFFSET SYSCFG_OFFSET +#define UFB_MODE_BIT_NUMBER SYSCFG_MEMRMP_UFB_MODE_Pos +#define UFB_MODE_BB (uint32_t)(PERIPH_BB_BASE + (MEMRMP_OFFSET * 32U) + (UFB_MODE_BIT_NUMBER * 4U)) + +/* --- CMPCR Register ---*/ +/* Alias word address of CMP_PD bit */ +#define CMPCR_OFFSET (SYSCFG_OFFSET + 0x20U) +#define CMP_PD_BIT_NUMBER SYSCFG_CMPCR_CMP_PD_Pos +#define CMPCR_CMP_PD_BB (uint32_t)(PERIPH_BB_BASE + (CMPCR_OFFSET * 32U) + (CMP_PD_BIT_NUMBER * 4U)) + +/* --- MCHDLYCR Register ---*/ +/* Alias word address of BSCKSEL bit */ +#define MCHDLYCR_OFFSET (SYSCFG_OFFSET + 0x30U) +#define BSCKSEL_BIT_NUMBER SYSCFG_MCHDLYCR_BSCKSEL_Pos +#define MCHDLYCR_BSCKSEL_BB (uint32_t)(PERIPH_BB_BASE + (MCHDLYCR_OFFSET * 32U) + (BSCKSEL_BIT_NUMBER * 4U)) +/** + * @} + */ + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @addtogroup HAL_Private_Variables + * @{ + */ +__IO uint32_t uwTick; +uint32_t uwTickPrio = (1UL << __NVIC_PRIO_BITS); /* Invalid PRIO */ +HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT; /* 1KHz */ +/** + * @} + */ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup HAL_Exported_Functions HAL Exported Functions + * @{ + */ + +/** @defgroup HAL_Exported_Functions_Group1 Initialization and de-initialization Functions + * @brief Initialization and de-initialization functions + * +@verbatim + =============================================================================== + ##### Initialization and Configuration functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Initializes the Flash interface the NVIC allocation and initial clock + configuration. It initializes the systick also when timeout is needed + and the backup domain when enabled. + (+) De-Initializes common part of the HAL. + (+) Configure the time base source to have 1ms time base with a dedicated + Tick interrupt priority. + (++) SysTick timer is used by default as source of time base, but user + can eventually implement his proper time base source (a general purpose + timer for example or other time source), keeping in mind that Time base + duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and + handled in milliseconds basis. + (++) Time base configuration function (HAL_InitTick ()) is called automatically + at the beginning of the program after reset by HAL_Init() or at any time + when clock is configured, by HAL_RCC_ClockConfig(). + (++) Source of time base is configured to generate interrupts at regular + time intervals. Care must be taken if HAL_Delay() is called from a + peripheral ISR process, the Tick interrupt line must have higher priority + (numerically lower) than the peripheral interrupt. Otherwise the caller + ISR process will be blocked. + (++) functions affecting time base configurations are declared as __weak + to make override possible in case of other implementations in user file. +@endverbatim + * @{ + */ + +/** + * @brief This function is used to initialize the HAL Library; it must be the first + * instruction to be executed in the main program (before to call any other + * HAL function), it performs the following: + * Configure the Flash prefetch, instruction and Data caches. + * Configures the SysTick to generate an interrupt each 1 millisecond, + * which is clocked by the HSI (at this stage, the clock is not yet + * configured and thus the system is running from the internal HSI at 16 MHz). + * Set NVIC Group Priority to 4. + * Calls the HAL_MspInit() callback function defined in user file + * "stm32f4xx_hal_msp.c" to do the global low level hardware initialization + * + * @note SysTick is used as time base for the HAL_Delay() function, the application + * need to ensure that the SysTick time base is always set to 1 millisecond + * to have correct HAL operation. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_Init(void) +{ + /* Configure Flash prefetch, Instruction cache, Data cache */ +#if (INSTRUCTION_CACHE_ENABLE != 0U) + __HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); +#endif /* INSTRUCTION_CACHE_ENABLE */ + +#if (DATA_CACHE_ENABLE != 0U) + __HAL_FLASH_DATA_CACHE_ENABLE(); +#endif /* DATA_CACHE_ENABLE */ + +#if (PREFETCH_ENABLE != 0U) + __HAL_FLASH_PREFETCH_BUFFER_ENABLE(); +#endif /* PREFETCH_ENABLE */ + + /* Set Interrupt Group Priority */ + HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); + + /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */ + HAL_InitTick(TICK_INT_PRIORITY); + + /* Init the low level hardware */ + HAL_MspInit(); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief This function de-Initializes common part of the HAL and stops the systick. + * This function is optional. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DeInit(void) +{ + /* Reset of all peripherals */ + __HAL_RCC_APB1_FORCE_RESET(); + __HAL_RCC_APB1_RELEASE_RESET(); + + __HAL_RCC_APB2_FORCE_RESET(); + __HAL_RCC_APB2_RELEASE_RESET(); + + __HAL_RCC_AHB1_FORCE_RESET(); + __HAL_RCC_AHB1_RELEASE_RESET(); + + __HAL_RCC_AHB2_FORCE_RESET(); + __HAL_RCC_AHB2_RELEASE_RESET(); + + __HAL_RCC_AHB3_FORCE_RESET(); + __HAL_RCC_AHB3_RELEASE_RESET(); + + /* De-Init the low level hardware */ + HAL_MspDeInit(); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Initialize the MSP. + * @retval None + */ +__weak void HAL_MspInit(void) +{ + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes the MSP. + * @retval None + */ +__weak void HAL_MspDeInit(void) +{ + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief This function configures the source of the time base. + * The time source is configured to have 1ms time base with a dedicated + * Tick interrupt priority. + * @note This function is called automatically at the beginning of program after + * reset by HAL_Init() or at any time when clock is reconfigured by HAL_RCC_ClockConfig(). + * @note In the default implementation, SysTick timer is the source of time base. + * It is used to generate interrupts at regular time intervals. + * Care must be taken if HAL_Delay() is called from a peripheral ISR process, + * The SysTick interrupt must have higher priority (numerically lower) + * than the peripheral interrupt. Otherwise the caller ISR process will be blocked. + * The function is declared as __weak to be overwritten in case of other + * implementation in user file. + * @param TickPriority Tick interrupt priority. + * @retval HAL status + */ +__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) +{ + /* Configure the SysTick to have interrupt in 1ms time basis*/ + if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U) + { + return HAL_ERROR; + } + + /* Configure the SysTick IRQ priority */ + if (TickPriority < (1UL << __NVIC_PRIO_BITS)) + { + HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U); + uwTickPrio = TickPriority; + } + else + { + return HAL_ERROR; + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup HAL_Exported_Functions_Group2 HAL Control functions + * @brief HAL Control functions + * +@verbatim + =============================================================================== + ##### HAL Control functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Provide a tick value in millisecond + (+) Provide a blocking delay in millisecond + (+) Suspend the time base source interrupt + (+) Resume the time base source interrupt + (+) Get the HAL API driver version + (+) Get the device identifier + (+) Get the device revision identifier + (+) Enable/Disable Debug module during SLEEP mode + (+) Enable/Disable Debug module during STOP mode + (+) Enable/Disable Debug module during STANDBY mode + +@endverbatim + * @{ + */ + +/** + * @brief This function is called to increment a global variable "uwTick" + * used as application time base. + * @note In the default implementation, this variable is incremented each 1ms + * in SysTick ISR. + * @note This function is declared as __weak to be overwritten in case of other + * implementations in user file. + * @retval None + */ +__weak void HAL_IncTick(void) +{ + uwTick += uwTickFreq; +} + +/** + * @brief Provides a tick value in millisecond. + * @note This function is declared as __weak to be overwritten in case of other + * implementations in user file. + * @retval tick value + */ +__weak uint32_t HAL_GetTick(void) +{ + return uwTick; +} + +/** + * @brief This function returns a tick priority. + * @retval tick priority + */ +uint32_t HAL_GetTickPrio(void) +{ + return uwTickPrio; +} + +/** + * @brief Set new tick Freq. + * @retval Status + */ +HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq) +{ + HAL_StatusTypeDef status = HAL_OK; + HAL_TickFreqTypeDef prevTickFreq; + + assert_param(IS_TICKFREQ(Freq)); + + if (uwTickFreq != Freq) + { + /* Back up uwTickFreq frequency */ + prevTickFreq = uwTickFreq; + + /* Update uwTickFreq global variable used by HAL_InitTick() */ + uwTickFreq = Freq; + + /* Apply the new tick Freq */ + status = HAL_InitTick(uwTickPrio); + + if (status != HAL_OK) + { + /* Restore previous tick frequency */ + uwTickFreq = prevTickFreq; + } + } + + return status; +} + +/** + * @brief Return tick frequency. + * @retval Tick frequency. + * Value of @ref HAL_TickFreqTypeDef. + */ +HAL_TickFreqTypeDef HAL_GetTickFreq(void) +{ + return uwTickFreq; +} + +/** + * @brief This function provides minimum delay (in milliseconds) based + * on variable incremented. + * @note In the default implementation , SysTick timer is the source of time base. + * It is used to generate interrupts at regular time intervals where uwTick + * is incremented. + * @note This function is declared as __weak to be overwritten in case of other + * implementations in user file. + * @param Delay specifies the delay time length, in milliseconds. + * @retval None + */ +__weak void HAL_Delay(uint32_t Delay) +{ + uint32_t tickstart = HAL_GetTick(); + uint32_t wait = Delay; + + /* Add a freq to guarantee minimum wait */ + if (wait < HAL_MAX_DELAY) + { + wait += (uint32_t)(uwTickFreq); + } + + while((HAL_GetTick() - tickstart) < wait) + { + } +} + +/** + * @brief Suspend Tick increment. + * @note In the default implementation , SysTick timer is the source of time base. It is + * used to generate interrupts at regular time intervals. Once HAL_SuspendTick() + * is called, the SysTick interrupt will be disabled and so Tick increment + * is suspended. + * @note This function is declared as __weak to be overwritten in case of other + * implementations in user file. + * @retval None + */ +__weak void HAL_SuspendTick(void) +{ + /* Disable SysTick Interrupt */ + SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; +} + +/** + * @brief Resume Tick increment. + * @note In the default implementation , SysTick timer is the source of time base. It is + * used to generate interrupts at regular time intervals. Once HAL_ResumeTick() + * is called, the SysTick interrupt will be enabled and so Tick increment + * is resumed. + * @note This function is declared as __weak to be overwritten in case of other + * implementations in user file. + * @retval None + */ +__weak void HAL_ResumeTick(void) +{ + /* Enable SysTick Interrupt */ + SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; +} + +/** + * @brief Returns the HAL revision + * @retval version : 0xXYZR (8bits for each decimal, R for RC) + */ +uint32_t HAL_GetHalVersion(void) +{ + return __STM32F4xx_HAL_VERSION; +} + +/** + * @brief Returns the device revision identifier. + * @retval Device revision identifier + */ +uint32_t HAL_GetREVID(void) +{ + return((DBGMCU->IDCODE) >> 16U); +} + +/** + * @brief Returns the device identifier. + * @retval Device identifier + */ +uint32_t HAL_GetDEVID(void) +{ + return((DBGMCU->IDCODE) & IDCODE_DEVID_MASK); +} + +/** + * @brief Enable the Debug Module during SLEEP mode + * @retval None + */ +void HAL_DBGMCU_EnableDBGSleepMode(void) +{ + SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); +} + +/** + * @brief Disable the Debug Module during SLEEP mode + * @retval None + */ +void HAL_DBGMCU_DisableDBGSleepMode(void) +{ + CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); +} + +/** + * @brief Enable the Debug Module during STOP mode + * @retval None + */ +void HAL_DBGMCU_EnableDBGStopMode(void) +{ + SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); +} + +/** + * @brief Disable the Debug Module during STOP mode + * @retval None + */ +void HAL_DBGMCU_DisableDBGStopMode(void) +{ + CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); +} + +/** + * @brief Enable the Debug Module during STANDBY mode + * @retval None + */ +void HAL_DBGMCU_EnableDBGStandbyMode(void) +{ + SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); +} + +/** + * @brief Disable the Debug Module during STANDBY mode + * @retval None + */ +void HAL_DBGMCU_DisableDBGStandbyMode(void) +{ + CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); +} + +/** + * @brief Enables the I/O Compensation Cell. + * @note The I/O compensation cell can be used only when the device supply + * voltage ranges from 2.4 to 3.6 V. + * @retval None + */ +void HAL_EnableCompensationCell(void) +{ + *(__IO uint32_t *)CMPCR_CMP_PD_BB = (uint32_t)ENABLE; +} + +/** + * @brief Power-down the I/O Compensation Cell. + * @note The I/O compensation cell can be used only when the device supply + * voltage ranges from 2.4 to 3.6 V. + * @retval None + */ +void HAL_DisableCompensationCell(void) +{ + *(__IO uint32_t *)CMPCR_CMP_PD_BB = (uint32_t)DISABLE; +} + +/** + * @brief Returns first word of the unique device identifier (UID based on 96 bits) + * @retval Device identifier + */ +uint32_t HAL_GetUIDw0(void) +{ + return (READ_REG(*((uint32_t *)UID_BASE))); +} + +/** + * @brief Returns second word of the unique device identifier (UID based on 96 bits) + * @retval Device identifier + */ +uint32_t HAL_GetUIDw1(void) +{ + return (READ_REG(*((uint32_t *)(UID_BASE + 4U)))); +} + +/** + * @brief Returns third word of the unique device identifier (UID based on 96 bits) + * @retval Device identifier + */ +uint32_t HAL_GetUIDw2(void) +{ + return (READ_REG(*((uint32_t *)(UID_BASE + 8U)))); +} + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Enables the Internal FLASH Bank Swapping. + * + * @note This function can be used only for STM32F42xxx/43xxx/469xx/479xx devices. + * + * @note Flash Bank2 mapped at 0x08000000 (and aliased @0x00000000) + * and Flash Bank1 mapped at 0x08100000 (and aliased at 0x00100000) + * + * @retval None + */ +void HAL_EnableMemorySwappingBank(void) +{ + *(__IO uint32_t *)UFB_MODE_BB = (uint32_t)ENABLE; +} + +/** + * @brief Disables the Internal FLASH Bank Swapping. + * + * @note This function can be used only for STM32F42xxx/43xxx/469xx/479xx devices. + * + * @note The default state : Flash Bank1 mapped at 0x08000000 (and aliased @0x00000000) + * and Flash Bank2 mapped at 0x08100000 (and aliased at 0x00100000) + * + * @retval None + */ +void HAL_DisableMemorySwappingBank(void) +{ + *(__IO uint32_t *)UFB_MODE_BB = (uint32_t)DISABLE; +} +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + + diff --git a/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c new file mode 100644 index 0000000..c3d2ba8 --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c @@ -0,0 +1,538 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_cortex.c + * @author MCD Application Team + * @brief CORTEX HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the CORTEX: + * + Initialization and de-initialization functions + * + Peripheral Control functions + * + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + + [..] + *** How to configure Interrupts using CORTEX HAL driver *** + =========================================================== + [..] + This section provides functions allowing to configure the NVIC interrupts (IRQ). + The Cortex-M4 exceptions are managed by CMSIS functions. + + (#) Configure the NVIC Priority Grouping using HAL_NVIC_SetPriorityGrouping() + function according to the following table. + (#) Configure the priority of the selected IRQ Channels using HAL_NVIC_SetPriority(). + (#) Enable the selected IRQ Channels using HAL_NVIC_EnableIRQ(). + (#) please refer to programming manual for details in how to configure priority. + + -@- When the NVIC_PRIORITYGROUP_0 is selected, IRQ preemption is no more possible. + The pending IRQ priority will be managed only by the sub priority. + + -@- IRQ priority order (sorted by highest to lowest priority): + (+@) Lowest preemption priority + (+@) Lowest sub priority + (+@) Lowest hardware priority (IRQ number) + + [..] + *** How to configure Systick using CORTEX HAL driver *** + ======================================================== + [..] + Setup SysTick Timer for time base. + + (+) The HAL_SYSTICK_Config() function calls the SysTick_Config() function which + is a CMSIS function that: + (++) Configures the SysTick Reload register with value passed as function parameter. + (++) Configures the SysTick IRQ priority to the lowest value 0x0F. + (++) Resets the SysTick Counter register. + (++) Configures the SysTick Counter clock source to be Core Clock Source (HCLK). + (++) Enables the SysTick Interrupt. + (++) Starts the SysTick Counter. + + (+) You can change the SysTick Clock source to be HCLK_Div8 by calling the macro + __HAL_CORTEX_SYSTICKCLK_CONFIG(SYSTICK_CLKSOURCE_HCLK_DIV8) just after the + HAL_SYSTICK_Config() function call. The __HAL_CORTEX_SYSTICKCLK_CONFIG() macro is defined + inside the stm32f4xx_hal_cortex.h file. + + (+) You can change the SysTick IRQ priority by calling the + HAL_NVIC_SetPriority(SysTick_IRQn,...) function just after the HAL_SYSTICK_Config() function + call. The HAL_NVIC_SetPriority() call the NVIC_SetPriority() function which is a CMSIS function. + + (+) To adjust the SysTick time base, use the following formula: + + Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s) + (++) Reload Value is the parameter to be passed for HAL_SYSTICK_Config() function + (++) Reload Value should not exceed 0xFFFFFF + + @endverbatim + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup CORTEX CORTEX + * @brief CORTEX HAL module driver + * @{ + */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup CORTEX_Exported_Functions CORTEX Exported Functions + * @{ + */ + + +/** @defgroup CORTEX_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + ============================================================================== + ##### Initialization and de-initialization functions ##### + ============================================================================== + [..] + This section provides the CORTEX HAL driver functions allowing to configure Interrupts + Systick functionalities + +@endverbatim + * @{ + */ + + +/** + * @brief Sets the priority grouping field (preemption priority and subpriority) + * using the required unlock sequence. + * @param PriorityGroup The priority grouping bits length. + * This parameter can be one of the following values: + * @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority + * 4 bits for subpriority + * @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority + * 3 bits for subpriority + * @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority + * 2 bits for subpriority + * @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority + * 1 bits for subpriority + * @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority + * 0 bits for subpriority + * @note When the NVIC_PriorityGroup_0 is selected, IRQ preemption is no more possible. + * The pending IRQ priority will be managed only by the subpriority. + * @retval None + */ +void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + /* Check the parameters */ + assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); + + /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */ + NVIC_SetPriorityGrouping(PriorityGroup); +} + +/** + * @brief Sets the priority of an interrupt. + * @param IRQn External interrupt number. + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @param PreemptPriority The preemption priority for the IRQn channel. + * This parameter can be a value between 0 and 15 + * A lower priority value indicates a higher priority + * @param SubPriority the subpriority level for the IRQ channel. + * This parameter can be a value between 0 and 15 + * A lower priority value indicates a higher priority. + * @retval None + */ +void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t prioritygroup = 0x00U; + + /* Check the parameters */ + assert_param(IS_NVIC_SUB_PRIORITY(SubPriority)); + assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority)); + + prioritygroup = NVIC_GetPriorityGrouping(); + + NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority)); +} + +/** + * @brief Enables a device specific interrupt in the NVIC interrupt controller. + * @note To configure interrupts priority correctly, the NVIC_PriorityGroupConfig() + * function should be called before. + * @param IRQn External interrupt number. + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @retval None + */ +void HAL_NVIC_EnableIRQ(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Enable interrupt */ + NVIC_EnableIRQ(IRQn); +} + +/** + * @brief Disables a device specific interrupt in the NVIC interrupt controller. + * @param IRQn External interrupt number. + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @retval None + */ +void HAL_NVIC_DisableIRQ(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Disable interrupt */ + NVIC_DisableIRQ(IRQn); +} + +/** + * @brief Initiates a system reset request to reset the MCU. + * @retval None + */ +void HAL_NVIC_SystemReset(void) +{ + /* System Reset */ + NVIC_SystemReset(); +} + +/** + * @brief Initializes the System Timer and its interrupt, and starts the System Tick Timer. + * Counter is in free running mode to generate periodic interrupts. + * @param TicksNumb Specifies the ticks Number of ticks between two interrupts. + * @retval status: - 0 Function succeeded. + * - 1 Function failed. + */ +uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb) +{ + return SysTick_Config(TicksNumb); +} +/** + * @} + */ + +/** @defgroup CORTEX_Exported_Functions_Group2 Peripheral Control functions + * @brief Cortex control functions + * +@verbatim + ============================================================================== + ##### Peripheral Control functions ##### + ============================================================================== + [..] + This subsection provides a set of functions allowing to control the CORTEX + (NVIC, SYSTICK, MPU) functionalities. + + +@endverbatim + * @{ + */ + +#if (__MPU_PRESENT == 1U) +/** + * @brief Disables the MPU + * @retval None + */ +void HAL_MPU_Disable(void) +{ + /* Make sure outstanding transfers are done */ + __DMB(); + + /* Disable fault exceptions */ + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; + + /* Disable the MPU and clear the control register*/ + MPU->CTRL = 0U; +} + +/** + * @brief Enable the MPU. + * @param MPU_Control Specifies the control mode of the MPU during hard fault, + * NMI, FAULTMASK and privileged access to the default memory + * This parameter can be one of the following values: + * @arg MPU_HFNMI_PRIVDEF_NONE + * @arg MPU_HARDFAULT_NMI + * @arg MPU_PRIVILEGED_DEFAULT + * @arg MPU_HFNMI_PRIVDEF + * @retval None + */ +void HAL_MPU_Enable(uint32_t MPU_Control) +{ + /* Enable the MPU */ + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; + + /* Enable fault exceptions */ + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; + + /* Ensure MPU setting take effects */ + __DSB(); + __ISB(); +} + +/** + * @brief Enables the MPU Region. + * @retval None + */ +void HAL_MPU_EnableRegion(uint32_t RegionNumber) +{ + /* Check the parameters */ + assert_param(IS_MPU_REGION_NUMBER(RegionNumber)); + + /* Set the Region number */ + MPU->RNR = RegionNumber; + + /* Enable the Region */ + SET_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); +} + +/** + * @brief Disables the MPU Region. + * @retval None + */ +void HAL_MPU_DisableRegion(uint32_t RegionNumber) +{ + /* Check the parameters */ + assert_param(IS_MPU_REGION_NUMBER(RegionNumber)); + + /* Set the Region number */ + MPU->RNR = RegionNumber; + + /* Disable the Region */ + CLEAR_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); +} + +/** + * @brief Initializes and configures the Region and the memory to be protected. + * @param MPU_Init Pointer to a MPU_Region_InitTypeDef structure that contains + * the initialization and configuration information. + * @retval None + */ +void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_Init) +{ + /* Check the parameters */ + assert_param(IS_MPU_REGION_NUMBER(MPU_Init->Number)); + assert_param(IS_MPU_REGION_ENABLE(MPU_Init->Enable)); + assert_param(IS_MPU_INSTRUCTION_ACCESS(MPU_Init->DisableExec)); + assert_param(IS_MPU_REGION_PERMISSION_ATTRIBUTE(MPU_Init->AccessPermission)); + assert_param(IS_MPU_TEX_LEVEL(MPU_Init->TypeExtField)); + assert_param(IS_MPU_ACCESS_SHAREABLE(MPU_Init->IsShareable)); + assert_param(IS_MPU_ACCESS_CACHEABLE(MPU_Init->IsCacheable)); + assert_param(IS_MPU_ACCESS_BUFFERABLE(MPU_Init->IsBufferable)); + assert_param(IS_MPU_SUB_REGION_DISABLE(MPU_Init->SubRegionDisable)); + assert_param(IS_MPU_REGION_SIZE(MPU_Init->Size)); + + /* Set the Region number */ + MPU->RNR = MPU_Init->Number; + + /* Disable the Region */ + CLEAR_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); + + /* Apply configuration */ + MPU->RBAR = MPU_Init->BaseAddress; + MPU->RASR = ((uint32_t)MPU_Init->DisableExec << MPU_RASR_XN_Pos) | + ((uint32_t)MPU_Init->AccessPermission << MPU_RASR_AP_Pos) | + ((uint32_t)MPU_Init->TypeExtField << MPU_RASR_TEX_Pos) | + ((uint32_t)MPU_Init->IsShareable << MPU_RASR_S_Pos) | + ((uint32_t)MPU_Init->IsCacheable << MPU_RASR_C_Pos) | + ((uint32_t)MPU_Init->IsBufferable << MPU_RASR_B_Pos) | + ((uint32_t)MPU_Init->SubRegionDisable << MPU_RASR_SRD_Pos) | + ((uint32_t)MPU_Init->Size << MPU_RASR_SIZE_Pos) | + ((uint32_t)MPU_Init->Enable << MPU_RASR_ENABLE_Pos); +} +#endif /* __MPU_PRESENT */ + +/** + * @brief Clear pending events. + * @retval None + */ +void HAL_CORTEX_ClearEvent(void) +{ + __SEV(); + __WFE(); +} + +/** + * @brief Gets the priority grouping field from the NVIC Interrupt Controller. + * @retval Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field) + */ +uint32_t HAL_NVIC_GetPriorityGrouping(void) +{ + /* Get the PRIGROUP[10:8] field value */ + return NVIC_GetPriorityGrouping(); +} + +/** + * @brief Gets the priority of an interrupt. + * @param IRQn External interrupt number. + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @param PriorityGroup the priority grouping bits length. + * This parameter can be one of the following values: + * @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority + * 4 bits for subpriority + * @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority + * 3 bits for subpriority + * @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority + * 2 bits for subpriority + * @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority + * 1 bits for subpriority + * @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority + * 0 bits for subpriority + * @param pPreemptPriority Pointer on the Preemptive priority value (starting from 0). + * @param pSubPriority Pointer on the Subpriority value (starting from 0). + * @retval None + */ +void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t *pPreemptPriority, uint32_t *pSubPriority) +{ + /* Check the parameters */ + assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); + /* Get priority for Cortex-M system or device specific interrupts */ + NVIC_DecodePriority(NVIC_GetPriority(IRQn), PriorityGroup, pPreemptPriority, pSubPriority); +} + +/** + * @brief Sets Pending bit of an external interrupt. + * @param IRQn External interrupt number + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @retval None + */ +void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Set interrupt pending */ + NVIC_SetPendingIRQ(IRQn); +} + +/** + * @brief Gets Pending Interrupt (reads the pending register in the NVIC + * and returns the pending bit for the specified interrupt). + * @param IRQn External interrupt number. + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @retval status: - 0 Interrupt status is not pending. + * - 1 Interrupt status is pending. + */ +uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Return 1 if pending else 0 */ + return NVIC_GetPendingIRQ(IRQn); +} + +/** + * @brief Clears the pending bit of an external interrupt. + * @param IRQn External interrupt number. + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @retval None + */ +void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Clear pending interrupt */ + NVIC_ClearPendingIRQ(IRQn); +} + +/** + * @brief Gets active interrupt ( reads the active register in NVIC and returns the active bit). + * @param IRQn External interrupt number + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @retval status: - 0 Interrupt status is not pending. + * - 1 Interrupt status is pending. + */ +uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Return 1 if active else 0 */ + return NVIC_GetActive(IRQn); +} + +/** + * @brief Configures the SysTick clock source. + * @param CLKSource specifies the SysTick clock source. + * This parameter can be one of the following values: + * @arg SYSTICK_CLKSOURCE_HCLK_DIV8: AHB clock divided by 8 selected as SysTick clock source. + * @arg SYSTICK_CLKSOURCE_HCLK: AHB clock selected as SysTick clock source. + * @retval None + */ +void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource) +{ + /* Check the parameters */ + assert_param(IS_SYSTICK_CLK_SOURCE(CLKSource)); + if (CLKSource == SYSTICK_CLKSOURCE_HCLK) + { + SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK; + } + else + { + SysTick->CTRL &= ~SYSTICK_CLKSOURCE_HCLK; + } +} + +/** + * @brief This function handles SYSTICK interrupt request. + * @retval None + */ +void HAL_SYSTICK_IRQHandler(void) +{ + HAL_SYSTICK_Callback(); +} + +/** + * @brief SYSTICK callback. + * @retval None + */ +__weak void HAL_SYSTICK_Callback(void) +{ + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_SYSTICK_Callback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_CORTEX_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + diff --git a/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c new file mode 100644 index 0000000..3dbb477 --- /dev/null +++ b/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/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c new file mode 100644 index 0000000..7167e77 --- /dev/null +++ b/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/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c new file mode 100644 index 0000000..3e46312 --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c @@ -0,0 +1,553 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_exti.c + * @author MCD Application Team + * @brief EXTI HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Extended Interrupts and events controller (EXTI) peripheral: + * + Initialization and de-initialization functions + * + IO operation functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### EXTI Peripheral features ##### + ============================================================================== + [..] + (+) Each Exti line can be configured within this driver. + + (+) Exti line can be configured in 3 different modes + (++) Interrupt + (++) Event + (++) Both of them + + (+) Configurable Exti lines can be configured with 3 different triggers + (++) Rising + (++) Falling + (++) Both of them + + (+) When set in interrupt mode, configurable Exti lines have two different + interrupts pending registers which allow to distinguish which transition + occurs: + (++) Rising edge pending interrupt + (++) Falling + + (+) Exti lines 0 to 15 are linked to gpio pin number 0 to 15. Gpio port can + be selected through multiplexer. + + ##### How to use this driver ##### + ============================================================================== + [..] + + (#) Configure the EXTI line using HAL_EXTI_SetConfigLine(). + (++) Choose the interrupt line number by setting "Line" member from + EXTI_ConfigTypeDef structure. + (++) Configure the interrupt and/or event mode using "Mode" member from + EXTI_ConfigTypeDef structure. + (++) For configurable lines, configure rising and/or falling trigger + "Trigger" member from EXTI_ConfigTypeDef structure. + (++) For Exti lines linked to gpio, choose gpio port using "GPIOSel" + member from GPIO_InitTypeDef structure. + + (#) Get current Exti configuration of a dedicated line using + HAL_EXTI_GetConfigLine(). + (++) Provide exiting handle as parameter. + (++) Provide pointer on EXTI_ConfigTypeDef structure as second parameter. + + (#) Clear Exti configuration of a dedicated line using HAL_EXTI_ClearConfigLine(). + (++) Provide exiting handle as parameter. + + (#) Register callback to treat Exti interrupts using HAL_EXTI_RegisterCallback(). + (++) Provide exiting handle as first parameter. + (++) Provide which callback will be registered using one value from + EXTI_CallbackIDTypeDef. + (++) Provide callback function pointer. + + (#) Get interrupt pending bit using HAL_EXTI_GetPending(). + + (#) Clear interrupt pending bit using HAL_EXTI_ClearPending(). + + (#) Generate software interrupt using HAL_EXTI_GenerateSWI(). + + @endverbatim + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup EXTI + * @{ + */ +/** MISRA C:2012 deviation rule has been granted for following rule: + * Rule-18.1_b - Medium: Array `EXTICR' 1st subscript interval [0,7] may be out + * of bounds [0,3] in following API : + * HAL_EXTI_SetConfigLine + * HAL_EXTI_GetConfigLine + * HAL_EXTI_ClearConfigLine + */ + +#ifdef HAL_EXTI_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private defines -----------------------------------------------------------*/ +/** @defgroup EXTI_Private_Constants EXTI Private Constants + * @{ + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @addtogroup EXTI_Exported_Functions + * @{ + */ + +/** @addtogroup EXTI_Exported_Functions_Group1 + * @brief Configuration functions + * +@verbatim + =============================================================================== + ##### Configuration functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Set configuration of a dedicated Exti line. + * @param hexti Exti handle. + * @param pExtiConfig Pointer on EXTI configuration to be set. + * @retval HAL Status. + */ +HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) +{ + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + + /* Check null pointer */ + if ((hexti == NULL) || (pExtiConfig == NULL)) + { + return HAL_ERROR; + } + + /* Check parameters */ + assert_param(IS_EXTI_LINE(pExtiConfig->Line)); + assert_param(IS_EXTI_MODE(pExtiConfig->Mode)); + + /* Assign line number to handle */ + hexti->Line = pExtiConfig->Line; + + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* Configure triggers for configurable lines */ + if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) + { + assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); + + /* Configure rising trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00u) + { + EXTI->RTSR |= maskline; + } + else + { + EXTI->RTSR &= ~maskline; + } + + /* Configure falling trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00u) + { + EXTI->FTSR |= maskline; + } + else + { + EXTI->FTSR &= ~maskline; + } + + + /* Configure gpio port selection in case of gpio exti line */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PORT(pExtiConfig->GPIOSel)); + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } + + /* Configure interrupt mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00u) + { + EXTI->IMR |= maskline; + } + else + { + EXTI->IMR &= ~maskline; + } + + /* Configure event mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00u) + { + EXTI->EMR |= maskline; + } + else + { + EXTI->EMR &= ~maskline; + } + + return HAL_OK; +} + +/** + * @brief Get configuration of a dedicated Exti line. + * @param hexti Exti handle. + * @param pExtiConfig Pointer on structure to store Exti configuration. + * @retval HAL Status. + */ +HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) +{ + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + + /* Check null pointer */ + if ((hexti == NULL) || (pExtiConfig == NULL)) + { + return HAL_ERROR; + } + + /* Check the parameter */ + assert_param(IS_EXTI_LINE(hexti->Line)); + + /* Store handle line number to configuration structure */ + pExtiConfig->Line = hexti->Line; + + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* 1] Get core mode : interrupt */ + + /* Check if selected line is enable */ + if ((EXTI->IMR & maskline) != 0x00u) + { + pExtiConfig->Mode = EXTI_MODE_INTERRUPT; + } + else + { + pExtiConfig->Mode = EXTI_MODE_NONE; + } + + /* Get event mode */ + /* Check if selected line is enable */ + if ((EXTI->EMR & maskline) != 0x00u) + { + pExtiConfig->Mode |= EXTI_MODE_EVENT; + } + + /* Get default Trigger and GPIOSel configuration */ + pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + pExtiConfig->GPIOSel = 0x00u; + + /* 2] Get trigger for configurable lines : rising */ + if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) + { + /* Check if configuration of selected line is enable */ + if ((EXTI->RTSR & maskline) != 0x00u) + { + pExtiConfig->Trigger = EXTI_TRIGGER_RISING; + } + + /* Get falling configuration */ + /* Check if configuration of selected line is enable */ + if ((EXTI->FTSR & maskline) != 0x00u) + { + pExtiConfig->Trigger |= EXTI_TRIGGER_FALLING; + } + + /* Get Gpio port selection for gpio lines */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + pExtiConfig->GPIOSel = (regval >> (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))) & SYSCFG_EXTICR1_EXTI0; + } + } + + return HAL_OK; +} + +/** + * @brief Clear whole configuration of a dedicated Exti line. + * @param hexti Exti handle. + * @retval HAL Status. + */ +HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) +{ + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + + /* Check null pointer */ + if (hexti == NULL) + { + return HAL_ERROR; + } + + /* Check the parameter */ + assert_param(IS_EXTI_LINE(hexti->Line)); + + /* compute line mask */ + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* 1] Clear interrupt mode */ + EXTI->IMR = (EXTI->IMR & ~maskline); + + /* 2] Clear event mode */ + EXTI->EMR = (EXTI->EMR & ~maskline); + + /* 3] Clear triggers in case of configurable lines */ + if ((hexti->Line & EXTI_CONFIG) != 0x00u) + { + EXTI->RTSR = (EXTI->RTSR & ~maskline); + EXTI->FTSR = (EXTI->FTSR & ~maskline); + + /* Get Gpio port selection for gpio lines */ + if ((hexti->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } + + return HAL_OK; +} + +/** + * @brief Register callback for a dedicated Exti line. + * @param hexti Exti handle. + * @param CallbackID User callback identifier. + * This parameter can be one of @arg @ref EXTI_CallbackIDTypeDef values. + * @param pPendingCbfn function pointer to be stored as callback. + * @retval HAL Status. + */ +HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef CallbackID, void (*pPendingCbfn)(void)) +{ + HAL_StatusTypeDef status = HAL_OK; + + switch (CallbackID) + { + case HAL_EXTI_COMMON_CB_ID: + hexti->PendingCallback = pPendingCbfn; + break; + + default: + status = HAL_ERROR; + break; + } + + return status; +} + +/** + * @brief Store line number as handle private field. + * @param hexti Exti handle. + * @param ExtiLine Exti line number. + * This parameter can be from 0 to @ref EXTI_LINE_NB. + * @retval HAL Status. + */ +HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine) +{ + /* Check the parameters */ + assert_param(IS_EXTI_LINE(ExtiLine)); + + /* Check null pointer */ + if (hexti == NULL) + { + return HAL_ERROR; + } + else + { + /* Store line number as handle private field */ + hexti->Line = ExtiLine; + + return HAL_OK; + } +} + +/** + * @} + */ + +/** @addtogroup EXTI_Exported_Functions_Group2 + * @brief EXTI IO functions. + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Handle EXTI interrupt request. + * @param hexti Exti handle. + * @retval none. + */ +void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) +{ + uint32_t regval; + uint32_t maskline; + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + + /* Get pending bit */ + regval = (EXTI->PR & maskline); + if (regval != 0x00u) + { + /* Clear pending bit */ + EXTI->PR = maskline; + + /* Call callback */ + if (hexti->PendingCallback != NULL) + { + hexti->PendingCallback(); + } + } +} + +/** + * @brief Get interrupt pending bit of a dedicated line. + * @param hexti Exti handle. + * @param Edge Specify which pending edge as to be checked. + * This parameter can be one of the following values: + * @arg @ref EXTI_TRIGGER_RISING_FALLING + * This parameter is kept for compatibility with other series. + * @retval 1 if interrupt is pending else 0. + */ +uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) +{ + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + + /* Prevent unused argument(s) compilation warning */ + UNUSED(Edge); + + /* Check parameters */ + assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); + assert_param(IS_EXTI_PENDING_EDGE(Edge)); + + /* Compute line mask */ + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* return 1 if bit is set else 0 */ + regval = ((EXTI->PR & maskline) >> linepos); + return regval; +} + +/** + * @brief Clear interrupt pending bit of a dedicated line. + * @param hexti Exti handle. + * @param Edge Specify which pending edge as to be clear. + * This parameter can be one of the following values: + * @arg @ref EXTI_TRIGGER_RISING_FALLING + * This parameter is kept for compatibility with other series. + * @retval None. + */ +void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) +{ + uint32_t maskline; + + /* Prevent unused argument(s) compilation warning */ + UNUSED(Edge); + + /* Check parameters */ + assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); + assert_param(IS_EXTI_PENDING_EDGE(Edge)); + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + + /* Clear Pending bit */ + EXTI->PR = maskline; +} + +/** + * @brief Generate a software interrupt for a dedicated line. + * @param hexti Exti handle. + * @retval None. + */ +void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti) +{ + uint32_t maskline; + + /* Check parameters */ + assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + + /* Generate Software interrupt */ + EXTI->SWIER = maskline; +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_EXTI_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + diff --git a/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c new file mode 100644 index 0000000..808949e --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c @@ -0,0 +1,776 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_flash.c + * @author MCD Application Team + * @brief FLASH HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the internal FLASH memory: + * + Program operations functions + * + Memory Control functions + * + Peripheral Errors functions + * + @verbatim + ============================================================================== + ##### FLASH peripheral features ##### + ============================================================================== + + [..] The Flash memory interface manages CPU AHB I-Code and D-Code accesses + to the Flash memory. It implements the erase and program Flash memory operations + and the read and write protection mechanisms. + + [..] The Flash memory interface accelerates code execution with a system of instruction + prefetch and cache lines. + + [..] The FLASH main features are: + (+) Flash memory read operations + (+) Flash memory program/erase operations + (+) Read / write protections + (+) Prefetch on I-Code + (+) 64 cache lines of 128 bits on I-Code + (+) 8 cache lines of 128 bits on D-Code + + + ##### How to use this driver ##### + ============================================================================== + [..] + This driver provides functions and macros to configure and program the FLASH + memory of all STM32F4xx devices. + + (#) FLASH Memory IO Programming functions: + (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and + HAL_FLASH_Lock() functions + (++) Program functions: byte, half word, word and double word + (++) There Two modes of programming : + (+++) Polling mode using HAL_FLASH_Program() function + (+++) Interrupt mode using HAL_FLASH_Program_IT() function + + (#) Interrupts and flags management functions : + (++) Handle FLASH interrupts by calling HAL_FLASH_IRQHandler() + (++) Wait for last FLASH operation according to its status + (++) Get error flag status by calling HAL_SetErrorCode() + + [..] + In addition to these functions, this driver includes a set of macros allowing + to handle the following operations: + (+) Set the latency + (+) Enable/Disable the prefetch buffer + (+) Enable/Disable the Instruction cache and the Data cache + (+) Reset the Instruction cache and the Data cache + (+) Enable/Disable the FLASH interrupts + (+) Monitor the FLASH flags status + + @endverbatim + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup FLASH FLASH + * @brief FLASH HAL module driver + * @{ + */ + +#ifdef HAL_FLASH_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup FLASH_Private_Constants + * @{ + */ +#define FLASH_TIMEOUT_VALUE 50000U /* 50 s */ +/** + * @} + */ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @addtogroup FLASH_Private_Variables + * @{ + */ +/* Variable used for Erase sectors under interruption */ +FLASH_ProcessTypeDef pFlash = {.ProcedureOnGoing = FLASH_PROC_NONE, + .NbSectorsToErase = 0U, + .VoltageForErase= FLASH_VOLTAGE_RANGE_1, + .Sector = 0U, + .Bank = FLASH_BANK_1, + .Address = 0U, + .Lock = HAL_UNLOCKED, + .ErrorCode = HAL_FLASH_ERROR_NONE}; +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ +/** @addtogroup FLASH_Private_Functions + * @{ + */ +/* Program operations */ +static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data); +static void FLASH_Program_Word(uint32_t Address, uint32_t Data); +static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data); +static void FLASH_Program_Byte(uint32_t Address, uint8_t Data); +static void FLASH_SetErrorCode(void); + +HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup FLASH_Exported_Functions FLASH Exported Functions + * @{ + */ + +/** @defgroup FLASH_Exported_Functions_Group1 Programming operation functions + * @brief Programming operation functions + * +@verbatim + =============================================================================== + ##### Programming operation functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to manage the FLASH + program operations. + +@endverbatim + * @{ + */ + +/** + * @brief Program byte, halfword, word or double word at a specified address + * @param TypeProgram Indicate the way to program at a specified address. + * This parameter can be a value of @ref FLASH_Type_Program + * @param Address specifies the address to be programmed. + * @param Data specifies the data to be programmed + * + * @retval HAL_StatusTypeDef HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data) +{ + HAL_StatusTypeDef status; + + /* Process Locked */ + __HAL_LOCK(&pFlash); + + /* Check the parameters */ + assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if (status == HAL_OK) + { + if (TypeProgram == FLASH_TYPEPROGRAM_BYTE) + { + /*Program byte (8-bit) at a specified address.*/ + FLASH_Program_Byte(Address, (uint8_t) Data); + } + else if (TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) + { + /*Program halfword (16-bit) at a specified address.*/ + FLASH_Program_HalfWord(Address, (uint16_t) Data); + } + else if (TypeProgram == FLASH_TYPEPROGRAM_WORD) + { + /*Program word (32-bit) at a specified address.*/ + FLASH_Program_Word(Address, (uint32_t) Data); + } + else + { + /*Program double word (64-bit) at a specified address.*/ + FLASH_Program_DoubleWord(Address, Data); + } + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + /* If the program operation is completed, disable the PG Bit */ + FLASH->CR &= (~FLASH_CR_PG); + } + + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + + return status; +} + +/** + * @brief Program byte, halfword, word or double word at a specified address with interrupt enabled. + * @param TypeProgram Indicate the way to program at a specified address. + * This parameter can be a value of @ref FLASH_Type_Program + * @param Address specifies the address to be programmed. + * @param Data specifies the data to be programmed + * + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); + + /* Enable End of FLASH Operation interrupt */ + __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP); + + /* Enable Error source interrupt */ + __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR); + + pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAM; + pFlash.Address = Address; + + if (TypeProgram == FLASH_TYPEPROGRAM_BYTE) + { + /*Program byte (8-bit) at a specified address.*/ + FLASH_Program_Byte(Address, (uint8_t) Data); + } + else if (TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) + { + /*Program halfword (16-bit) at a specified address.*/ + FLASH_Program_HalfWord(Address, (uint16_t) Data); + } + else if (TypeProgram == FLASH_TYPEPROGRAM_WORD) + { + /*Program word (32-bit) at a specified address.*/ + FLASH_Program_Word(Address, (uint32_t) Data); + } + else + { + /*Program double word (64-bit) at a specified address.*/ + FLASH_Program_DoubleWord(Address, Data); + } + + return status; +} + +/** + * @brief This function handles FLASH interrupt request. + * @retval None + */ +void HAL_FLASH_IRQHandler(void) +{ + uint32_t addresstmp = 0U; + + /* Check FLASH operation error flags */ +#if defined(FLASH_SR_RDERR) + if (__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ + FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET) +#else + if (__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ + FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET) +#endif /* FLASH_SR_RDERR */ + { + if (pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE) + { + /*return the faulty sector*/ + addresstmp = pFlash.Sector; + pFlash.Sector = 0xFFFFFFFFU; + } + else if (pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) + { + /*return the faulty bank*/ + addresstmp = pFlash.Bank; + } + else + { + /*return the faulty address*/ + addresstmp = pFlash.Address; + } + + /*Save the Error code*/ + FLASH_SetErrorCode(); + + /* FLASH error interrupt user callback */ + HAL_FLASH_OperationErrorCallback(addresstmp); + + /*Stop the procedure ongoing*/ + pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + } + + /* Check FLASH End of Operation flag */ + if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET) + { + /* Clear FLASH End of Operation pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); + + if (pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE) + { + /*Nb of sector to erased can be decreased*/ + pFlash.NbSectorsToErase--; + + /* Check if there are still sectors to erase*/ + if (pFlash.NbSectorsToErase != 0U) + { + addresstmp = pFlash.Sector; + /*Indicate user which sector has been erased*/ + HAL_FLASH_EndOfOperationCallback(addresstmp); + + /*Increment sector number*/ + pFlash.Sector++; + addresstmp = pFlash.Sector; + FLASH_Erase_Sector(addresstmp, pFlash.VoltageForErase); + } + else + { + /*No more sectors to Erase, user callback can be called.*/ + /*Reset Sector and stop Erase sectors procedure*/ + pFlash.Sector = addresstmp = 0xFFFFFFFFU; + pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + + /* Flush the caches to be sure of the data consistency */ + FLASH_FlushCaches(); + + /* FLASH EOP interrupt user callback */ + HAL_FLASH_EndOfOperationCallback(addresstmp); + } + } + else + { + if (pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) + { + /* MassErase ended. Return the selected bank */ + /* Flush the caches to be sure of the data consistency */ + FLASH_FlushCaches(); + + /* FLASH EOP interrupt user callback */ + HAL_FLASH_EndOfOperationCallback(pFlash.Bank); + } + else + { + /*Program ended. Return the selected address*/ + /* FLASH EOP interrupt user callback */ + HAL_FLASH_EndOfOperationCallback(pFlash.Address); + } + pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + } + } + + if (pFlash.ProcedureOnGoing == FLASH_PROC_NONE) + { + /* Operation is completed, disable the PG, SER, SNB and MER Bits */ + CLEAR_BIT(FLASH->CR, (FLASH_CR_PG | FLASH_CR_SER | FLASH_CR_SNB | FLASH_MER_BIT)); + + /* Disable End of FLASH Operation interrupt */ + __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP); + + /* Disable Error source interrupt */ + __HAL_FLASH_DISABLE_IT(FLASH_IT_ERR); + } +} + +/** + * @brief FLASH end of operation interrupt callback + * @param ReturnValue The value saved in this parameter depends on the ongoing procedure + * Mass Erase: Bank number which has been requested to erase + * Sectors Erase: Sector which has been erased + * (if 0xFFFFFFFFU, it means that all the selected sectors have been erased) + * Program: Address which was selected for data program + * @retval None + */ +__weak void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(ReturnValue); + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_FLASH_EndOfOperationCallback could be implemented in the user file + */ +} + +/** + * @brief FLASH operation error interrupt callback + * @param ReturnValue The value saved in this parameter depends on the ongoing procedure + * Mass Erase: Bank number which has been requested to erase + * Sectors Erase: Sector number which returned an error + * Program: Address which was selected for data program + * @retval None + */ +__weak void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(ReturnValue); + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_FLASH_OperationErrorCallback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** @defgroup FLASH_Exported_Functions_Group2 Peripheral Control functions + * @brief management functions + * +@verbatim + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the FLASH + memory operations. + +@endverbatim + * @{ + */ + +/** + * @brief Unlock the FLASH control register access + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_Unlock(void) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) + { + /* Authorize the FLASH Registers access */ + WRITE_REG(FLASH->KEYR, FLASH_KEY1); + WRITE_REG(FLASH->KEYR, FLASH_KEY2); + + /* Verify Flash is unlocked */ + if (READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) + { + status = HAL_ERROR; + } + } + + return status; +} + +/** + * @brief Locks the FLASH control register access + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_Lock(void) +{ + /* Set the LOCK Bit to lock the FLASH Registers access */ + FLASH->CR |= FLASH_CR_LOCK; + + return HAL_OK; +} + +/** + * @brief Unlock the FLASH Option Control Registers access. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void) +{ + if ((FLASH->OPTCR & FLASH_OPTCR_OPTLOCK) != RESET) + { + /* Authorizes the Option Byte register programming */ + FLASH->OPTKEYR = FLASH_OPT_KEY1; + FLASH->OPTKEYR = FLASH_OPT_KEY2; + } + else + { + return HAL_ERROR; + } + + return HAL_OK; +} + +/** + * @brief Lock the FLASH Option Control Registers access. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_OB_Lock(void) +{ + /* Set the OPTLOCK Bit to lock the FLASH Option Byte Registers access */ + FLASH->OPTCR |= FLASH_OPTCR_OPTLOCK; + + return HAL_OK; +} + +/** + * @brief Launch the option byte loading. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_OB_Launch(void) +{ + /* Set the OPTSTRT bit in OPTCR register */ + *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= FLASH_OPTCR_OPTSTRT; + + /* Wait for last operation to be completed */ + return (FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE)); +} + +/** + * @} + */ + +/** @defgroup FLASH_Exported_Functions_Group3 Peripheral State and Errors functions + * @brief Peripheral Errors functions + * +@verbatim + =============================================================================== + ##### Peripheral Errors functions ##### + =============================================================================== + [..] + This subsection permits to get in run-time Errors of the FLASH peripheral. + +@endverbatim + * @{ + */ + +/** + * @brief Get the specific FLASH error flag. + * @retval FLASH_ErrorCode: The returned value can be a combination of: + * @arg HAL_FLASH_ERROR_RD: FLASH Read Protection error flag (PCROP) + * @arg HAL_FLASH_ERROR_PGS: FLASH Programming Sequence error flag + * @arg HAL_FLASH_ERROR_PGP: FLASH Programming Parallelism error flag + * @arg HAL_FLASH_ERROR_PGA: FLASH Programming Alignment error flag + * @arg HAL_FLASH_ERROR_WRP: FLASH Write protected error flag + * @arg HAL_FLASH_ERROR_OPERATION: FLASH operation Error flag + */ +uint32_t HAL_FLASH_GetError(void) +{ + return pFlash.ErrorCode; +} + +/** + * @} + */ + +/** + * @brief Wait for a FLASH operation to complete. + * @param Timeout maximum flash operationtimeout + * @retval HAL Status + */ +HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout) +{ + uint32_t tickstart = 0U; + + /* Clear Error Code */ + pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + + /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset. + Even if the FLASH operation fails, the BUSY flag will be reset and an error + flag will be set */ + /* Get tick */ + tickstart = HAL_GetTick(); + + while (__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY) != RESET) + { + if (Timeout != HAL_MAX_DELAY) + { + if ((Timeout == 0U) || ((HAL_GetTick() - tickstart) > Timeout)) + { + return HAL_TIMEOUT; + } + } + } + + /* Check FLASH End of Operation flag */ + if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET) + { + /* Clear FLASH End of Operation pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); + } +#if defined(FLASH_SR_RDERR) + if (__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ + FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET) +#else + if (__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ + FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET) +#endif /* FLASH_SR_RDERR */ + { + /*Save the error code*/ + FLASH_SetErrorCode(); + return HAL_ERROR; + } + + /* If there is no error flag set */ + return HAL_OK; + +} + +/** + * @brief Program a double word (64-bit) at a specified address. + * @note This function must be used when the device voltage range is from + * 2.7V to 3.6V and Vpp in the range 7V to 9V. + * + * @note If an erase and a program operations are requested simultaneously, + * the erase operation is performed before the program one. + * + * @param Address specifies the address to be programmed. + * @param Data specifies the data to be programmed. + * @retval None + */ +static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data) +{ + /* Check the parameters */ + assert_param(IS_FLASH_ADDRESS(Address)); + + /* If the previous operation is completed, proceed to program the new data */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + FLASH->CR |= FLASH_PSIZE_DOUBLE_WORD; + FLASH->CR |= FLASH_CR_PG; + + /* Program first word */ + *(__IO uint32_t *)Address = (uint32_t)Data; + + /* Barrier to ensure programming is performed in 2 steps, in right order + (independently of compiler optimization behavior) */ + __ISB(); + + /* Program second word */ + *(__IO uint32_t *)(Address + 4) = (uint32_t)(Data >> 32); +} + + +/** + * @brief Program word (32-bit) at a specified address. + * @note This function must be used when the device voltage range is from + * 2.7V to 3.6V. + * + * @note If an erase and a program operations are requested simultaneously, + * the erase operation is performed before the program one. + * + * @param Address specifies the address to be programmed. + * @param Data specifies the data to be programmed. + * @retval None + */ +static void FLASH_Program_Word(uint32_t Address, uint32_t Data) +{ + /* Check the parameters */ + assert_param(IS_FLASH_ADDRESS(Address)); + + /* If the previous operation is completed, proceed to program the new data */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + FLASH->CR |= FLASH_PSIZE_WORD; + FLASH->CR |= FLASH_CR_PG; + + *(__IO uint32_t *)Address = Data; +} + +/** + * @brief Program a half-word (16-bit) at a specified address. + * @note This function must be used when the device voltage range is from + * 2.1V to 3.6V. + * + * @note If an erase and a program operations are requested simultaneously, + * the erase operation is performed before the program one. + * + * @param Address specifies the address to be programmed. + * @param Data specifies the data to be programmed. + * @retval None + */ +static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data) +{ + /* Check the parameters */ + assert_param(IS_FLASH_ADDRESS(Address)); + + /* If the previous operation is completed, proceed to program the new data */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + FLASH->CR |= FLASH_PSIZE_HALF_WORD; + FLASH->CR |= FLASH_CR_PG; + + *(__IO uint16_t *)Address = Data; +} + +/** + * @brief Program byte (8-bit) at a specified address. + * @note This function must be used when the device voltage range is from + * 1.8V to 3.6V. + * + * @note If an erase and a program operations are requested simultaneously, + * the erase operation is performed before the program one. + * + * @param Address specifies the address to be programmed. + * @param Data specifies the data to be programmed. + * @retval None + */ +static void FLASH_Program_Byte(uint32_t Address, uint8_t Data) +{ + /* Check the parameters */ + assert_param(IS_FLASH_ADDRESS(Address)); + + /* If the previous operation is completed, proceed to program the new data */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + FLASH->CR |= FLASH_PSIZE_BYTE; + FLASH->CR |= FLASH_CR_PG; + + *(__IO uint8_t *)Address = Data; +} + +/** + * @brief Set the specific FLASH error flag. + * @retval None + */ +static void FLASH_SetErrorCode(void) +{ + if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) != RESET) + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_WRP; + + /* Clear FLASH write protection error pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR); + } + + if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR) != RESET) + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_PGA; + + /* Clear FLASH Programming alignment error pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR); + } + + if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGPERR) != RESET) + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_PGP; + + /* Clear FLASH Programming parallelism error pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGPERR); + } + + if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGSERR) != RESET) + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_PGS; + + /* Clear FLASH Programming sequence error pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR); + } +#if defined(FLASH_SR_RDERR) + if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_RDERR) != RESET) + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_RD; + + /* Clear FLASH Proprietary readout protection error pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_RDERR); + } +#endif /* FLASH_SR_RDERR */ + if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR) != RESET) + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_OPERATION; + + /* Clear FLASH Operation error pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR); + } +} + +/** + * @} + */ + +#endif /* HAL_FLASH_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + diff --git a/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c new file mode 100644 index 0000000..839c91b --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c @@ -0,0 +1,1344 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_flash_ex.c + * @author MCD Application Team + * @brief Extended FLASH HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the FLASH extension peripheral: + * + Extended programming operations functions + * + @verbatim + ============================================================================== + ##### Flash Extension features ##### + ============================================================================== + + [..] Comparing to other previous devices, the FLASH interface for STM32F427xx/437xx and + STM32F429xx/439xx devices contains the following additional features + + (+) Capacity up to 2 Mbyte with dual bank architecture supporting read-while-write + capability (RWW) + (+) Dual bank memory organization + (+) PCROP protection for all banks + + ##### How to use this driver ##### + ============================================================================== + [..] This driver provides functions to configure and program the FLASH memory + of all STM32F427xx/437xx, STM32F429xx/439xx, STM32F469xx/479xx and STM32F446xx + devices. It includes + (#) FLASH Memory Erase functions: + (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and + HAL_FLASH_Lock() functions + (++) Erase function: Erase sector, erase all sectors + (++) There are two modes of erase : + (+++) Polling Mode using HAL_FLASHEx_Erase() + (+++) Interrupt Mode using HAL_FLASHEx_Erase_IT() + + (#) Option Bytes Programming functions: Use HAL_FLASHEx_OBProgram() to : + (++) Set/Reset the write protection + (++) Set the Read protection Level + (++) Set the BOR level + (++) Program the user Option Bytes + (#) Advanced Option Bytes Programming functions: Use HAL_FLASHEx_AdvOBProgram() to : + (++) Extended space (bank 2) erase function + (++) Full FLASH space (2 Mo) erase (bank 1 and bank 2) + (++) Dual Boot activation + (++) Write protection configuration for bank 2 + (++) PCROP protection configuration and control for both banks + + @endverbatim + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup FLASHEx FLASHEx + * @brief FLASH HAL Extension module driver + * @{ + */ + +#ifdef HAL_FLASH_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup FLASHEx_Private_Constants + * @{ + */ +#define FLASH_TIMEOUT_VALUE 50000U /* 50 s */ +/** + * @} + */ + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @addtogroup FLASHEx_Private_Variables + * @{ + */ +extern FLASH_ProcessTypeDef pFlash; +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ +/** @addtogroup FLASHEx_Private_Functions + * @{ + */ +/* Option bytes control */ +static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks); +static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks); +static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks); +static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t Level); +static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t Iwdg, uint8_t Stop, uint8_t Stdby); +static HAL_StatusTypeDef FLASH_OB_BOR_LevelConfig(uint8_t Level); +static uint8_t FLASH_OB_GetUser(void); +static uint16_t FLASH_OB_GetWRP(void); +static uint8_t FLASH_OB_GetRDP(void); +static uint8_t FLASH_OB_GetBOR(void); + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ + defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ + defined(STM32F423xx) +static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t Sector); +static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t Sector); +#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx + STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks); +static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks); +static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t BootConfig); +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +extern HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup FLASHEx_Exported_Functions FLASHEx Exported Functions + * @{ + */ + +/** @defgroup FLASHEx_Exported_Functions_Group1 Extended IO operation functions + * @brief Extended IO operation functions + * +@verbatim + =============================================================================== + ##### Extended programming operation functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to manage the Extension FLASH + programming operations. + +@endverbatim + * @{ + */ +/** + * @brief Perform a mass erase or erase the specified FLASH memory sectors + * @param[in] pEraseInit pointer to an FLASH_EraseInitTypeDef structure that + * contains the configuration information for the erasing. + * + * @param[out] SectorError pointer to variable that + * contains the configuration information on faulty sector in case of error + * (0xFFFFFFFFU means that all the sectors have been correctly erased) + * + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError) +{ + HAL_StatusTypeDef status; + uint32_t index = 0U; + + /* Process Locked */ + __HAL_LOCK(&pFlash); + + /* Check the parameters */ + assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if (status == HAL_OK) + { + /*Initialization of SectorError variable*/ + *SectorError = 0xFFFFFFFFU; + + if (pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE) + { + /*Mass erase to be done*/ + FLASH_MassErase((uint8_t) pEraseInit->VoltageRange, pEraseInit->Banks); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + /* if the erase operation is completed, disable the MER Bit */ + FLASH->CR &= (~FLASH_MER_BIT); + } + else + { + /* Check the parameters */ + assert_param(IS_FLASH_NBSECTORS(pEraseInit->NbSectors + pEraseInit->Sector)); + + /* Erase by sector by sector to be done*/ + for (index = pEraseInit->Sector; index < (pEraseInit->NbSectors + pEraseInit->Sector); index++) + { + FLASH_Erase_Sector(index, (uint8_t) pEraseInit->VoltageRange); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + /* If the erase operation is completed, disable the SER and SNB Bits */ + CLEAR_BIT(FLASH->CR, (FLASH_CR_SER | FLASH_CR_SNB)); + + if (status != HAL_OK) + { + /* In case of error, stop erase procedure and return the faulty sector*/ + *SectorError = index; + break; + } + } + } + /* Flush the caches to be sure of the data consistency */ + FLASH_FlushCaches(); + } + + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + + return status; +} + +/** + * @brief Perform a mass erase or erase the specified FLASH memory sectors with interrupt enabled + * @param pEraseInit pointer to an FLASH_EraseInitTypeDef structure that + * contains the configuration information for the erasing. + * + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase)); + + /* Enable End of FLASH Operation interrupt */ + __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP); + + /* Enable Error source interrupt */ + __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR); + + /* Clear pending flags (if any) */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | \ + FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); + + if (pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE) + { + /*Mass erase to be done*/ + pFlash.ProcedureOnGoing = FLASH_PROC_MASSERASE; + pFlash.Bank = pEraseInit->Banks; + FLASH_MassErase((uint8_t) pEraseInit->VoltageRange, pEraseInit->Banks); + } + else + { + /* Erase by sector to be done*/ + + /* Check the parameters */ + assert_param(IS_FLASH_NBSECTORS(pEraseInit->NbSectors + pEraseInit->Sector)); + + pFlash.ProcedureOnGoing = FLASH_PROC_SECTERASE; + pFlash.NbSectorsToErase = pEraseInit->NbSectors; + pFlash.Sector = pEraseInit->Sector; + pFlash.VoltageForErase = (uint8_t)pEraseInit->VoltageRange; + + /*Erase 1st sector and wait for IT*/ + FLASH_Erase_Sector(pEraseInit->Sector, pEraseInit->VoltageRange); + } + + return status; +} + +/** + * @brief Program option bytes + * @param pOBInit pointer to an FLASH_OBInitStruct structure that + * contains the configuration information for the programming. + * + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit) +{ + HAL_StatusTypeDef status = HAL_ERROR; + + /* Process Locked */ + __HAL_LOCK(&pFlash); + + /* Check the parameters */ + assert_param(IS_OPTIONBYTE(pOBInit->OptionType)); + + /*Write protection configuration*/ + if ((pOBInit->OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP) + { + assert_param(IS_WRPSTATE(pOBInit->WRPState)); + if (pOBInit->WRPState == OB_WRPSTATE_ENABLE) + { + /*Enable of Write protection on the selected Sector*/ + status = FLASH_OB_EnableWRP(pOBInit->WRPSector, pOBInit->Banks); + } + else + { + /*Disable of Write protection on the selected Sector*/ + status = FLASH_OB_DisableWRP(pOBInit->WRPSector, pOBInit->Banks); + } + } + + /*Read protection configuration*/ + if ((pOBInit->OptionType & OPTIONBYTE_RDP) == OPTIONBYTE_RDP) + { + status = FLASH_OB_RDP_LevelConfig(pOBInit->RDPLevel); + } + + /*USER configuration*/ + if ((pOBInit->OptionType & OPTIONBYTE_USER) == OPTIONBYTE_USER) + { + status = FLASH_OB_UserConfig(pOBInit->USERConfig & OB_IWDG_SW, + pOBInit->USERConfig & OB_STOP_NO_RST, + pOBInit->USERConfig & OB_STDBY_NO_RST); + } + + /*BOR Level configuration*/ + if ((pOBInit->OptionType & OPTIONBYTE_BOR) == OPTIONBYTE_BOR) + { + status = FLASH_OB_BOR_LevelConfig(pOBInit->BORLevel); + } + + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + + return status; +} + +/** + * @brief Get the Option byte configuration + * @param pOBInit pointer to an FLASH_OBInitStruct structure that + * contains the configuration information for the programming. + * + * @retval None + */ +void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit) +{ + pOBInit->OptionType = OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER | OPTIONBYTE_BOR; + + /*Get WRP*/ + pOBInit->WRPSector = (uint32_t)FLASH_OB_GetWRP(); + + /*Get RDP Level*/ + pOBInit->RDPLevel = (uint32_t)FLASH_OB_GetRDP(); + + /*Get USER*/ + pOBInit->USERConfig = (uint8_t)FLASH_OB_GetUser(); + + /*Get BOR Level*/ + pOBInit->BORLevel = (uint32_t)FLASH_OB_GetBOR(); +} + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Program option bytes + * @param pAdvOBInit pointer to an FLASH_AdvOBProgramInitTypeDef structure that + * contains the configuration information for the programming. + * + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_AdvOBProgram(FLASH_AdvOBProgramInitTypeDef *pAdvOBInit) +{ + HAL_StatusTypeDef status = HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_OBEX(pAdvOBInit->OptionType)); + + /*Program PCROP option byte*/ + if (((pAdvOBInit->OptionType) & OPTIONBYTE_PCROP) == OPTIONBYTE_PCROP) + { + /* Check the parameters */ + assert_param(IS_PCROPSTATE(pAdvOBInit->PCROPState)); + if ((pAdvOBInit->PCROPState) == OB_PCROP_STATE_ENABLE) + { + /*Enable of Write protection on the selected Sector*/ +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ + defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + status = FLASH_OB_EnablePCROP(pAdvOBInit->Sectors); +#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ + status = FLASH_OB_EnablePCROP(pAdvOBInit->SectorsBank1, pAdvOBInit->SectorsBank2, pAdvOBInit->Banks); +#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || + STM32F413xx || STM32F423xx */ + } + else + { + /*Disable of Write protection on the selected Sector*/ +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ + defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + status = FLASH_OB_DisablePCROP(pAdvOBInit->Sectors); +#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ + status = FLASH_OB_DisablePCROP(pAdvOBInit->SectorsBank1, pAdvOBInit->SectorsBank2, pAdvOBInit->Banks); +#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || + STM32F413xx || STM32F423xx */ + } + } + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) + /*Program BOOT config option byte*/ + if (((pAdvOBInit->OptionType) & OPTIONBYTE_BOOTCONFIG) == OPTIONBYTE_BOOTCONFIG) + { + status = FLASH_OB_BootConfig(pAdvOBInit->BootConfig); + } +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + + return status; +} + +/** + * @brief Get the OBEX byte configuration + * @param pAdvOBInit pointer to an FLASH_AdvOBProgramInitTypeDef structure that + * contains the configuration information for the programming. + * + * @retval None + */ +void HAL_FLASHEx_AdvOBGetConfig(FLASH_AdvOBProgramInitTypeDef *pAdvOBInit) +{ +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ + defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + /*Get Sector*/ + pAdvOBInit->Sectors = (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); +#else /* STM32F427xx || STM32F437xx || STM32F429xx|| STM32F439xx || STM32F469xx || STM32F479xx */ + /*Get Sector for Bank1*/ + pAdvOBInit->SectorsBank1 = (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); + + /*Get Sector for Bank2*/ + pAdvOBInit->SectorsBank2 = (*(__IO uint16_t *)(OPTCR1_BYTE2_ADDRESS)); + + /*Get Boot config OB*/ + pAdvOBInit->BootConfig = *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS; +#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || + STM32F413xx || STM32F423xx */ +} + +/** + * @brief Select the Protection Mode + * + * @note After PCROP activated Option Byte modification NOT POSSIBLE! excepted + * Global Read Out Protection modification (from level1 to level0) + * @note Once SPRMOD bit is active unprotection of a protected sector is not possible + * @note Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag + * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F401xx/STM32F411xx/STM32F446xx/ + * STM32F469xx/STM32F479xx/STM32F412xx/STM32F413xx devices. + * + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_OB_SelectPCROP(void) +{ + uint8_t optiontmp; + + /* Mask SPRMOD bit */ + optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7F); + + /* Update Option Byte */ + *(__IO uint8_t *)OPTCR_BYTE3_ADDRESS = (uint8_t)(OB_PCROP_SELECTED | optiontmp); + + return HAL_OK; +} + +/** + * @brief Deselect the Protection Mode + * + * @note After PCROP activated Option Byte modification NOT POSSIBLE! excepted + * Global Read Out Protection modification (from level1 to level0) + * @note Once SPRMOD bit is active unprotection of a protected sector is not possible + * @note Read a protected sector will set RDERR Flag and write a protected sector will set WRPERR Flag + * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F401xx/STM32F411xx/STM32F446xx/ + * STM32F469xx/STM32F479xx/STM32F412xx/STM32F413xx devices. + * + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_OB_DeSelectPCROP(void) +{ + uint8_t optiontmp; + + /* Mask SPRMOD bit */ + optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7F); + + /* Update Option Byte */ + *(__IO uint8_t *)OPTCR_BYTE3_ADDRESS = (uint8_t)(OB_PCROP_DESELECTED | optiontmp); + + return HAL_OK; +} +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F410xx ||\ + STM32F411xE || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || + STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Returns the FLASH Write Protection Option Bytes value for Bank 2 + * @note This function can be used only for STM32F42xxx/STM32F43xxx/STM32F469xx/STM32F479xx devices. + * @retval The FLASH Write Protection Option Bytes value + */ +uint16_t HAL_FLASHEx_OB_GetBank2WRP(void) +{ + /* Return the FLASH write protection Register value */ + return (*(__IO uint16_t *)(OPTCR1_BYTE2_ADDRESS)); +} +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +/** + * @} + */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Full erase of FLASH memory sectors + * @param VoltageRange The device voltage range which defines the erase parallelism. + * This parameter can be one of the following values: + * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, + * the operation will be done by byte (8-bit) + * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, + * the operation will be done by half word (16-bit) + * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, + * the operation will be done by word (32-bit) + * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, + * the operation will be done by double word (64-bit) + * + * @param Banks Banks to be erased + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: Bank1 to be erased + * @arg FLASH_BANK_2: Bank2 to be erased + * @arg FLASH_BANK_BOTH: Bank1 and Bank2 to be erased + * + * @retval HAL Status + */ +static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks) +{ + /* Check the parameters */ + assert_param(IS_VOLTAGERANGE(VoltageRange)); + assert_param(IS_FLASH_BANK(Banks)); + + /* if the previous operation is completed, proceed to erase all sectors */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + + if (Banks == FLASH_BANK_BOTH) + { + /* bank1 & bank2 will be erased*/ + FLASH->CR |= FLASH_MER_BIT; + } + else if (Banks == FLASH_BANK_1) + { + /*Only bank1 will be erased*/ + FLASH->CR |= FLASH_CR_MER1; + } + else + { + /*Only bank2 will be erased*/ + FLASH->CR |= FLASH_CR_MER2; + } + FLASH->CR |= FLASH_CR_STRT | ((uint32_t)VoltageRange << 8U); +} + +/** + * @brief Erase the specified FLASH memory sector + * @param Sector FLASH sector to erase + * The value of this parameter depend on device used within the same series + * @param VoltageRange The device voltage range which defines the erase parallelism. + * This parameter can be one of the following values: + * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, + * the operation will be done by byte (8-bit) + * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, + * the operation will be done by half word (16-bit) + * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, + * the operation will be done by word (32-bit) + * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, + * the operation will be done by double word (64-bit) + * + * @retval None + */ +void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange) +{ + uint32_t tmp_psize = 0U; + + /* Check the parameters */ + assert_param(IS_FLASH_SECTOR(Sector)); + assert_param(IS_VOLTAGERANGE(VoltageRange)); + + if (VoltageRange == FLASH_VOLTAGE_RANGE_1) + { + tmp_psize = FLASH_PSIZE_BYTE; + } + else if (VoltageRange == FLASH_VOLTAGE_RANGE_2) + { + tmp_psize = FLASH_PSIZE_HALF_WORD; + } + else if (VoltageRange == FLASH_VOLTAGE_RANGE_3) + { + tmp_psize = FLASH_PSIZE_WORD; + } + else + { + tmp_psize = FLASH_PSIZE_DOUBLE_WORD; + } + + /* Need to add offset of 4 when sector higher than FLASH_SECTOR_11 */ + if (Sector > FLASH_SECTOR_11) + { + Sector += 4U; + } + /* If the previous operation is completed, proceed to erase the sector */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + FLASH->CR |= tmp_psize; + CLEAR_BIT(FLASH->CR, FLASH_CR_SNB); + FLASH->CR |= FLASH_CR_SER | (Sector << FLASH_CR_SNB_Pos); + FLASH->CR |= FLASH_CR_STRT; +} + +/** + * @brief Enable the write protection of the desired bank1 or bank 2 sectors + * + * @note When the memory read protection level is selected (RDP level = 1), + * it is not possible to program or erase the flash sector i if CortexM4 + * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 + * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). + * + * @param WRPSector specifies the sector(s) to be write protected. + * This parameter can be one of the following values: + * @arg WRPSector: A value between OB_WRP_SECTOR_0 and OB_WRP_SECTOR_23 + * @arg OB_WRP_SECTOR_All + * @note BANK2 starts from OB_WRP_SECTOR_12 + * + * @param Banks Enable write protection on all the sectors for the specific bank + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: WRP on all sectors of bank1 + * @arg FLASH_BANK_2: WRP on all sectors of bank2 + * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 + * + * @retval HAL FLASH State + */ +static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_WRP_SECTOR(WRPSector)); + assert_param(IS_FLASH_BANK(Banks)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if (status == HAL_OK) + { + if (((WRPSector == OB_WRP_SECTOR_All) && ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))) || + (WRPSector < OB_WRP_SECTOR_12)) + { + if (WRPSector == OB_WRP_SECTOR_All) + { + /*Write protection on all sector of BANK1*/ + *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS &= (~(WRPSector >> 12)); + } + else + { + /*Write protection done on sectors of BANK1*/ + *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS &= (~WRPSector); + } + } + else + { + /*Write protection done on sectors of BANK2*/ + *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector >> 12)); + } + + /*Write protection on all sector of BANK2*/ + if ((WRPSector == OB_WRP_SECTOR_All) && (Banks == FLASH_BANK_BOTH)) + { + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if (status == HAL_OK) + { + *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector >> 12)); + } + } + + } + return status; +} + +/** + * @brief Disable the write protection of the desired bank1 or bank 2 sectors + * + * @note When the memory read protection level is selected (RDP level = 1), + * it is not possible to program or erase the flash sector i if CortexM4 + * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 + * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). + * + * @param WRPSector specifies the sector(s) to be write protected. + * This parameter can be one of the following values: + * @arg WRPSector: A value between OB_WRP_SECTOR_0 and OB_WRP_SECTOR_23 + * @arg OB_WRP_Sector_All + * @note BANK2 starts from OB_WRP_SECTOR_12 + * + * @param Banks Disable write protection on all the sectors for the specific bank + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: Bank1 to be erased + * @arg FLASH_BANK_2: Bank2 to be erased + * @arg FLASH_BANK_BOTH: Bank1 and Bank2 to be erased + * + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_WRP_SECTOR(WRPSector)); + assert_param(IS_FLASH_BANK(Banks)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if (status == HAL_OK) + { + if (((WRPSector == OB_WRP_SECTOR_All) && ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH))) || + (WRPSector < OB_WRP_SECTOR_12)) + { + if (WRPSector == OB_WRP_SECTOR_All) + { + /*Write protection on all sector of BANK1*/ + *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS |= (uint16_t)(WRPSector >> 12); + } + else + { + /*Write protection done on sectors of BANK1*/ + *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS |= (uint16_t)WRPSector; + } + } + else + { + /*Write protection done on sectors of BANK2*/ + *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector >> 12); + } + + /*Write protection on all sector of BANK2*/ + if ((WRPSector == OB_WRP_SECTOR_All) && (Banks == FLASH_BANK_BOTH)) + { + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if (status == HAL_OK) + { + *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector >> 12); + } + } + + } + + return status; +} + +/** + * @brief Configure the Dual Bank Boot. + * + * @note This function can be used only for STM32F42xxx/43xxx devices. + * + * @param BootConfig specifies the Dual Bank Boot Option byte. + * This parameter can be one of the following values: + * @arg OB_Dual_BootEnabled: Dual Bank Boot Enable + * @arg OB_Dual_BootDisabled: Dual Bank Boot Disabled + * @retval None + */ +static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t BootConfig) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_BOOT(BootConfig)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if (status == HAL_OK) + { + /* Set Dual Bank Boot */ + *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS &= (~FLASH_OPTCR_BFB2); + *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= BootConfig; + } + + return status; +} + +/** + * @brief Enable the read/write protection (PCROP) of the desired + * sectors of Bank 1 and/or Bank 2. + * @note This function can be used only for STM32F42xxx/43xxx devices. + * @param SectorBank1 Specifies the sector(s) to be read/write protected or unprotected for bank1. + * This parameter can be one of the following values: + * @arg OB_PCROP: A value between OB_PCROP_SECTOR_0 and OB_PCROP_SECTOR_11 + * @arg OB_PCROP_SECTOR__All + * @param SectorBank2 Specifies the sector(s) to be read/write protected or unprotected for bank2. + * This parameter can be one of the following values: + * @arg OB_PCROP: A value between OB_PCROP_SECTOR_12 and OB_PCROP_SECTOR_23 + * @arg OB_PCROP_SECTOR__All + * @param Banks Enable PCROP protection on all the sectors for the specific bank + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: WRP on all sectors of bank1 + * @arg FLASH_BANK_2: WRP on all sectors of bank2 + * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 + * + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks) +{ + HAL_StatusTypeDef status = HAL_OK; + + assert_param(IS_FLASH_BANK(Banks)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if (status == HAL_OK) + { + if ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH)) + { + assert_param(IS_OB_PCROP(SectorBank1)); + /*Write protection done on sectors of BANK1*/ + *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS |= (uint16_t)SectorBank1; + } + else + { + assert_param(IS_OB_PCROP(SectorBank2)); + /*Write protection done on sectors of BANK2*/ + *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS |= (uint16_t)SectorBank2; + } + + /*Write protection on all sector of BANK2*/ + if (Banks == FLASH_BANK_BOTH) + { + assert_param(IS_OB_PCROP(SectorBank2)); + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if (status == HAL_OK) + { + /*Write protection done on sectors of BANK2*/ + *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS |= (uint16_t)SectorBank2; + } + } + + } + + return status; +} + + +/** + * @brief Disable the read/write protection (PCROP) of the desired + * sectors of Bank 1 and/or Bank 2. + * @note This function can be used only for STM32F42xxx/43xxx devices. + * @param SectorBank1 specifies the sector(s) to be read/write protected or unprotected for bank1. + * This parameter can be one of the following values: + * @arg OB_PCROP: A value between OB_PCROP_SECTOR_0 and OB_PCROP_SECTOR_11 + * @arg OB_PCROP_SECTOR__All + * @param SectorBank2 Specifies the sector(s) to be read/write protected or unprotected for bank2. + * This parameter can be one of the following values: + * @arg OB_PCROP: A value between OB_PCROP_SECTOR_12 and OB_PCROP_SECTOR_23 + * @arg OB_PCROP_SECTOR__All + * @param Banks Disable PCROP protection on all the sectors for the specific bank + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: WRP on all sectors of bank1 + * @arg FLASH_BANK_2: WRP on all sectors of bank2 + * @arg FLASH_BANK_BOTH: WRP on all sectors of bank1 & bank2 + * + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_FLASH_BANK(Banks)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if (status == HAL_OK) + { + if ((Banks == FLASH_BANK_1) || (Banks == FLASH_BANK_BOTH)) + { + assert_param(IS_OB_PCROP(SectorBank1)); + /*Write protection done on sectors of BANK1*/ + *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS &= (~SectorBank1); + } + else + { + /*Write protection done on sectors of BANK2*/ + assert_param(IS_OB_PCROP(SectorBank2)); + *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS &= (~SectorBank2); + } + + /*Write protection on all sector of BANK2*/ + if (Banks == FLASH_BANK_BOTH) + { + assert_param(IS_OB_PCROP(SectorBank2)); + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if (status == HAL_OK) + { + /*Write protection done on sectors of BANK2*/ + *(__IO uint16_t *)OPTCR1_BYTE2_ADDRESS &= (~SectorBank2); + } + } + + } + + return status; + +} + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ + defined(STM32F423xx) +/** + * @brief Mass erase of FLASH memory + * @param VoltageRange The device voltage range which defines the erase parallelism. + * This parameter can be one of the following values: + * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, + * the operation will be done by byte (8-bit) + * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, + * the operation will be done by half word (16-bit) + * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, + * the operation will be done by word (32-bit) + * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, + * the operation will be done by double word (64-bit) + * + * @param Banks Banks to be erased + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: Bank1 to be erased + * + * @retval None + */ +static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks) +{ + /* Check the parameters */ + assert_param(IS_VOLTAGERANGE(VoltageRange)); + assert_param(IS_FLASH_BANK(Banks)); + + /* If the previous operation is completed, proceed to erase all sectors */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + FLASH->CR |= FLASH_CR_MER; + FLASH->CR |= FLASH_CR_STRT | ((uint32_t)VoltageRange << 8U); +} + +/** + * @brief Erase the specified FLASH memory sector + * @param Sector FLASH sector to erase + * The value of this parameter depend on device used within the same series + * @param VoltageRange The device voltage range which defines the erase parallelism. + * This parameter can be one of the following values: + * @arg FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V, + * the operation will be done by byte (8-bit) + * @arg FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V, + * the operation will be done by half word (16-bit) + * @arg FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, + * the operation will be done by word (32-bit) + * @arg FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp, + * the operation will be done by double word (64-bit) + * + * @retval None + */ +void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange) +{ + uint32_t tmp_psize = 0U; + + /* Check the parameters */ + assert_param(IS_FLASH_SECTOR(Sector)); + assert_param(IS_VOLTAGERANGE(VoltageRange)); + + if (VoltageRange == FLASH_VOLTAGE_RANGE_1) + { + tmp_psize = FLASH_PSIZE_BYTE; + } + else if (VoltageRange == FLASH_VOLTAGE_RANGE_2) + { + tmp_psize = FLASH_PSIZE_HALF_WORD; + } + else if (VoltageRange == FLASH_VOLTAGE_RANGE_3) + { + tmp_psize = FLASH_PSIZE_WORD; + } + else + { + tmp_psize = FLASH_PSIZE_DOUBLE_WORD; + } + + /* If the previous operation is completed, proceed to erase the sector */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); + FLASH->CR |= tmp_psize; + CLEAR_BIT(FLASH->CR, FLASH_CR_SNB); + FLASH->CR |= FLASH_CR_SER | (Sector << FLASH_CR_SNB_Pos); + FLASH->CR |= FLASH_CR_STRT; +} + +/** + * @brief Enable the write protection of the desired bank 1 sectors + * + * @note When the memory read protection level is selected (RDP level = 1), + * it is not possible to program or erase the flash sector i if CortexM4 + * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 + * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). + * + * @param WRPSector specifies the sector(s) to be write protected. + * The value of this parameter depend on device used within the same series + * + * @param Banks Enable write protection on all the sectors for the specific bank + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: WRP on all sectors of bank1 + * + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_WRP_SECTOR(WRPSector)); + assert_param(IS_FLASH_BANK(Banks)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if (status == HAL_OK) + { + *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS &= (~WRPSector); + } + + return status; +} + +/** + * @brief Disable the write protection of the desired bank 1 sectors + * + * @note When the memory read protection level is selected (RDP level = 1), + * it is not possible to program or erase the flash sector i if CortexM4 + * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 + * @note Active value of nWRPi bits is inverted when PCROP mode is active (SPRMOD =1). + * + * @param WRPSector specifies the sector(s) to be write protected. + * The value of this parameter depend on device used within the same series + * + * @param Banks Enable write protection on all the sectors for the specific bank + * This parameter can be one of the following values: + * @arg FLASH_BANK_1: WRP on all sectors of bank1 + * + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_WRP_SECTOR(WRPSector)); + assert_param(IS_FLASH_BANK(Banks)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if (status == HAL_OK) + { + *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS |= (uint16_t)WRPSector; + } + + return status; +} +#endif /* STM32F40xxx || STM32F41xxx || STM32F401xx || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx + STM32F413xx || STM32F423xx */ + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ + defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Enable the read/write protection (PCROP) of the desired sectors. + * @note This function can be used only for STM32F401xx devices. + * @param Sector specifies the sector(s) to be read/write protected or unprotected. + * This parameter can be one of the following values: + * @arg OB_PCROP: A value between OB_PCROP_Sector0 and OB_PCROP_Sector5 + * @arg OB_PCROP_Sector_All + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t Sector) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_PCROP(Sector)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if (status == HAL_OK) + { + *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS |= (uint16_t)Sector; + } + + return status; +} + + +/** + * @brief Disable the read/write protection (PCROP) of the desired sectors. + * @note This function can be used only for STM32F401xx devices. + * @param Sector specifies the sector(s) to be read/write protected or unprotected. + * This parameter can be one of the following values: + * @arg OB_PCROP: A value between OB_PCROP_Sector0 and OB_PCROP_Sector5 + * @arg OB_PCROP_Sector_All + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t Sector) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_PCROP(Sector)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if (status == HAL_OK) + { + *(__IO uint16_t *)OPTCR_BYTE2_ADDRESS &= (~Sector); + } + + return status; + +} +#endif /* STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx + STM32F413xx || STM32F423xx */ + +/** + * @brief Set the read protection level. + * @param Level specifies the read protection level. + * This parameter can be one of the following values: + * @arg OB_RDP_LEVEL_0: No protection + * @arg OB_RDP_LEVEL_1: Read protection of the memory + * @arg OB_RDP_LEVEL_2: Full chip protection + * + * @note WARNING: When enabling OB_RDP level 2 it's no more possible to go back to level 1 or 0 + * + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t Level) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_RDP_LEVEL(Level)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if (status == HAL_OK) + { + *(__IO uint8_t *)OPTCR_BYTE1_ADDRESS = Level; + } + + return status; +} + +/** + * @brief Program the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. + * @param Iwdg Selects the IWDG mode + * This parameter can be one of the following values: + * @arg OB_IWDG_SW: Software IWDG selected + * @arg OB_IWDG_HW: Hardware IWDG selected + * @param Stop Reset event when entering STOP mode. + * This parameter can be one of the following values: + * @arg OB_STOP_NO_RST: No reset generated when entering in STOP + * @arg OB_STOP_RST: Reset generated when entering in STOP + * @param Stdby Reset event when entering Standby mode. + * This parameter can be one of the following values: + * @arg OB_STDBY_NO_RST: No reset generated when entering in STANDBY + * @arg OB_STDBY_RST: Reset generated when entering in STANDBY + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t Iwdg, uint8_t Stop, uint8_t Stdby) +{ + uint8_t optiontmp; + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_IWDG_SOURCE(Iwdg)); + assert_param(IS_OB_STOP_SOURCE(Stop)); + assert_param(IS_OB_STDBY_SOURCE(Stdby)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if (status == HAL_OK) + { + /* Mask OPTLOCK, OPTSTRT, BOR_LEV and BFB2 bits */ + optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE0_ADDRESS) & (uint8_t)0x1F); + + /* Update User Option Byte */ + *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS = Iwdg | (uint8_t)(Stdby | (uint8_t)(Stop | ((uint8_t)optiontmp))); + } + + return status; +} + +/** + * @brief Set the BOR Level. + * @param Level specifies the Option Bytes BOR Reset Level. + * This parameter can be one of the following values: + * @arg OB_BOR_LEVEL3: Supply voltage ranges from 2.7 to 3.6 V + * @arg OB_BOR_LEVEL2: Supply voltage ranges from 2.4 to 2.7 V + * @arg OB_BOR_LEVEL1: Supply voltage ranges from 2.1 to 2.4 V + * @arg OB_BOR_OFF: Supply voltage ranges from 1.62 to 2.1 V + * @retval HAL Status + */ +static HAL_StatusTypeDef FLASH_OB_BOR_LevelConfig(uint8_t Level) +{ + /* Check the parameters */ + assert_param(IS_OB_BOR_LEVEL(Level)); + + /* Set the BOR Level */ + *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS &= (~FLASH_OPTCR_BOR_LEV); + *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= Level; + + return HAL_OK; + +} + +/** + * @brief Return the FLASH User Option Byte value. + * @retval uint8_t FLASH User Option Bytes values: IWDG_SW(Bit0), RST_STOP(Bit1) + * and RST_STDBY(Bit2). + */ +static uint8_t FLASH_OB_GetUser(void) +{ + /* Return the User Option Byte */ + return ((uint8_t)(FLASH->OPTCR & 0xE0)); +} + +/** + * @brief Return the FLASH Write Protection Option Bytes value. + * @retval uint16_t FLASH Write Protection Option Bytes value + */ +static uint16_t FLASH_OB_GetWRP(void) +{ + /* Return the FLASH write protection Register value */ + return (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); +} + +/** + * @brief Returns the FLASH Read Protection level. + * @retval FLASH ReadOut Protection Status: + * This parameter can be one of the following values: + * @arg OB_RDP_LEVEL_0: No protection + * @arg OB_RDP_LEVEL_1: Read protection of the memory + * @arg OB_RDP_LEVEL_2: Full chip protection + */ +static uint8_t FLASH_OB_GetRDP(void) +{ + uint8_t readstatus = OB_RDP_LEVEL_0; + + if (*(__IO uint8_t *)(OPTCR_BYTE1_ADDRESS) == (uint8_t)OB_RDP_LEVEL_2) + { + readstatus = OB_RDP_LEVEL_2; + } + else if (*(__IO uint8_t *)(OPTCR_BYTE1_ADDRESS) == (uint8_t)OB_RDP_LEVEL_0) + { + readstatus = OB_RDP_LEVEL_0; + } + else + { + readstatus = OB_RDP_LEVEL_1; + } + + return readstatus; +} + +/** + * @brief Returns the FLASH BOR level. + * @retval uint8_t The FLASH BOR level: + * - OB_BOR_LEVEL3: Supply voltage ranges from 2.7 to 3.6 V + * - OB_BOR_LEVEL2: Supply voltage ranges from 2.4 to 2.7 V + * - OB_BOR_LEVEL1: Supply voltage ranges from 2.1 to 2.4 V + * - OB_BOR_OFF : Supply voltage ranges from 1.62 to 2.1 V + */ +static uint8_t FLASH_OB_GetBOR(void) +{ + /* Return the FLASH BOR level */ + return (uint8_t)(*(__IO uint8_t *)(OPTCR_BYTE0_ADDRESS) & (uint8_t)0x0C); +} + +/** + * @brief Flush the instruction and data caches + * @retval None + */ +void FLASH_FlushCaches(void) +{ + /* Flush instruction cache */ + if (READ_BIT(FLASH->ACR, FLASH_ACR_ICEN) != RESET) + { + /* Disable instruction cache */ + __HAL_FLASH_INSTRUCTION_CACHE_DISABLE(); + /* Reset instruction cache */ + __HAL_FLASH_INSTRUCTION_CACHE_RESET(); + /* Enable instruction cache */ + __HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); + } + + /* Flush data cache */ + if (READ_BIT(FLASH->ACR, FLASH_ACR_DCEN) != RESET) + { + /* Disable data cache */ + __HAL_FLASH_DATA_CACHE_DISABLE(); + /* Reset data cache */ + __HAL_FLASH_DATA_CACHE_RESET(); + /* Enable data cache */ + __HAL_FLASH_DATA_CACHE_ENABLE(); + } +} + +/** + * @} + */ + +#endif /* HAL_FLASH_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + diff --git a/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c new file mode 100644 index 0000000..e6ab3ac --- /dev/null +++ b/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/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c new file mode 100644 index 0000000..b3ce9bb --- /dev/null +++ b/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/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c new file mode 100644 index 0000000..d3f4262 --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c @@ -0,0 +1,7567 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_i2c.c + * @author MCD Application Team + * @brief I2C HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Inter Integrated Circuit (I2C) peripheral: + * + Initialization and de-initialization functions + * + IO operation functions + * + Peripheral State, Mode and Error functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The I2C HAL driver can be used as follows: + + (#) Declare a I2C_HandleTypeDef handle structure, for example: + I2C_HandleTypeDef hi2c; + + (#)Initialize the I2C low level resources by implementing the HAL_I2C_MspInit() API: + (##) Enable the I2Cx interface clock + (##) I2C pins configuration + (+++) Enable the clock for the I2C GPIOs + (+++) Configure I2C pins as alternate function open-drain + (##) NVIC configuration if you need to use interrupt process + (+++) Configure the I2Cx interrupt priority + (+++) Enable the NVIC I2C IRQ Channel + (##) DMA Configuration if you need to use DMA process + (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive stream + (+++) Enable the DMAx interface clock using + (+++) Configure the DMA handle parameters + (+++) Configure the DMA Tx or Rx stream + (+++) Associate the initialized DMA handle to the hi2c DMA Tx or Rx handle + (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on + the DMA Tx or Rx stream + + (#) Configure the Communication Speed, Duty cycle, Addressing mode, Own Address1, + Dual Addressing mode, Own Address2, General call and Nostretch mode in the hi2c Init structure. + + (#) Initialize the I2C registers by calling the HAL_I2C_Init(), configures also the low level Hardware + (GPIO, CLOCK, NVIC...etc) by calling the customized HAL_I2C_MspInit() API. + + (#) To check if target device is ready for communication, use the function HAL_I2C_IsDeviceReady() + + (#) For I2C IO and IO MEM operations, three operation modes are available within this driver : + + *** Polling mode IO operation *** + ================================= + [..] + (+) Transmit in master mode an amount of data in blocking mode using HAL_I2C_Master_Transmit() + (+) Receive in master mode an amount of data in blocking mode using HAL_I2C_Master_Receive() + (+) Transmit in slave mode an amount of data in blocking mode using HAL_I2C_Slave_Transmit() + (+) Receive in slave mode an amount of data in blocking mode using HAL_I2C_Slave_Receive() + + *** Polling mode IO MEM operation *** + ===================================== + [..] + (+) Write an amount of data in blocking mode to a specific memory address using HAL_I2C_Mem_Write() + (+) Read an amount of data in blocking mode from a specific memory address using HAL_I2C_Mem_Read() + + + *** Interrupt mode IO operation *** + =================================== + [..] + (+) Transmit in master mode an amount of data in non-blocking mode using HAL_I2C_Master_Transmit_IT() + (+) At transmission end of transfer, HAL_I2C_MasterTxCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback() + (+) Receive in master mode an amount of data in non-blocking mode using HAL_I2C_Master_Receive_IT() + (+) At reception end of transfer, HAL_I2C_MasterRxCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback() + (+) Transmit in slave mode an amount of data in non-blocking mode using HAL_I2C_Slave_Transmit_IT() + (+) At transmission end of transfer, HAL_I2C_SlaveTxCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback() + (+) Receive in slave mode an amount of data in non-blocking mode using HAL_I2C_Slave_Receive_IT() + (+) At reception end of transfer, HAL_I2C_SlaveRxCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback() + (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can + add his own code by customization of function pointer HAL_I2C_ErrorCallback() + (+) Abort a master or memory I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT() + (+) End of abort process, HAL_I2C_AbortCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_I2C_AbortCpltCallback() + + *** Interrupt mode or DMA mode IO sequential operation *** + ========================================================== + [..] + (@) These interfaces allow to manage a sequential transfer with a repeated start condition + when a direction change during transfer + [..] + (+) A specific option field manage the different steps of a sequential transfer + (+) Option field values are defined through I2C_XferOptions_definition and are listed below: + (++) I2C_FIRST_AND_LAST_FRAME: No sequential usage, functional is same as associated interfaces in no sequential mode + (++) I2C_FIRST_FRAME: Sequential usage, this option allow to manage a sequence with start condition, address + and data to transfer without a final stop condition + (++) I2C_FIRST_AND_NEXT_FRAME: Sequential usage (Master only), this option allow to manage a sequence with start condition, address + and data to transfer without a final stop condition, an then permit a call the same master sequential interface + several times (like HAL_I2C_Master_Seq_Transmit_IT() then HAL_I2C_Master_Seq_Transmit_IT() + or HAL_I2C_Master_Seq_Transmit_DMA() then HAL_I2C_Master_Seq_Transmit_DMA()) + (++) I2C_NEXT_FRAME: Sequential usage, this option allow to manage a sequence with a restart condition, address + and with new data to transfer if the direction change or manage only the new data to transfer + if no direction change and without a final stop condition in both cases + (++) I2C_LAST_FRAME: Sequential usage, this option allow to manage a sequance with a restart condition, address + and with new data to transfer if the direction change or manage only the new data to transfer + if no direction change and with a final stop condition in both cases + (++) I2C_LAST_FRAME_NO_STOP: Sequential usage (Master only), this option allow to manage a restart condition after several call of the same master sequential + interface several times (link with option I2C_FIRST_AND_NEXT_FRAME). + Usage can, transfer several bytes one by one using HAL_I2C_Master_Seq_Transmit_IT(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME) + or HAL_I2C_Master_Seq_Receive_IT(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME) + or HAL_I2C_Master_Seq_Transmit_DMA(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME) + or HAL_I2C_Master_Seq_Receive_DMA(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME). + Then usage of this option I2C_LAST_FRAME_NO_STOP at the last Transmit or Receive sequence permit to call the opposite interface Receive or Transmit + without stopping the communication and so generate a restart condition. + (++) I2C_OTHER_FRAME: Sequential usage (Master only), this option allow to manage a restart condition after each call of the same master sequential + interface. + Usage can, transfer several bytes one by one with a restart with slave address between each bytes using HAL_I2C_Master_Seq_Transmit_IT(option I2C_FIRST_FRAME then I2C_OTHER_FRAME) + or HAL_I2C_Master_Seq_Receive_IT(option I2C_FIRST_FRAME then I2C_OTHER_FRAME) + or HAL_I2C_Master_Seq_Transmit_DMA(option I2C_FIRST_FRAME then I2C_OTHER_FRAME) + or HAL_I2C_Master_Seq_Receive_DMA(option I2C_FIRST_FRAME then I2C_OTHER_FRAME). + Then usage of this option I2C_OTHER_AND_LAST_FRAME at the last frame to help automatic generation of STOP condition. + + (+) Different sequential I2C interfaces are listed below: + (++) Sequential transmit in master I2C mode an amount of data in non-blocking mode using HAL_I2C_Master_Seq_Transmit_IT() + or using HAL_I2C_Master_Seq_Transmit_DMA() + (+++) At transmission end of current frame transfer, HAL_I2C_MasterTxCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback() + (++) Sequential receive in master I2C mode an amount of data in non-blocking mode using HAL_I2C_Master_Seq_Receive_IT() + or using HAL_I2C_Master_Seq_Receive_DMA() + (+++) At reception end of current frame transfer, HAL_I2C_MasterRxCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback() + (++) Abort a master or memory IT or DMA I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT() + (+++) End of abort process, HAL_I2C_AbortCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_I2C_AbortCpltCallback() + (++) Enable/disable the Address listen mode in slave I2C mode using HAL_I2C_EnableListen_IT() HAL_I2C_DisableListen_IT() + (+++) When address slave I2C match, HAL_I2C_AddrCallback() is executed and user can + add his own code to check the Address Match Code and the transmission direction request by master (Write/Read). + (+++) At Listen mode end HAL_I2C_ListenCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_I2C_ListenCpltCallback() + (++) Sequential transmit in slave I2C mode an amount of data in non-blocking mode using HAL_I2C_Slave_Seq_Transmit_IT() + or using HAL_I2C_Slave_Seq_Transmit_DMA() + (+++) At transmission end of current frame transfer, HAL_I2C_SlaveTxCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback() + (++) Sequential receive in slave I2C mode an amount of data in non-blocking mode using HAL_I2C_Slave_Seq_Receive_IT() + or using HAL_I2C_Slave_Seq_Receive_DMA() + (+++) At reception end of current frame transfer, HAL_I2C_SlaveRxCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback() + (++) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can + add his own code by customization of function pointer HAL_I2C_ErrorCallback() + + *** Interrupt mode IO MEM operation *** + ======================================= + [..] + (+) Write an amount of data in non-blocking mode with Interrupt to a specific memory address using + HAL_I2C_Mem_Write_IT() + (+) At Memory end of write transfer, HAL_I2C_MemTxCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_I2C_MemTxCpltCallback() + (+) Read an amount of data in non-blocking mode with Interrupt from a specific memory address using + HAL_I2C_Mem_Read_IT() + (+) At Memory end of read transfer, HAL_I2C_MemRxCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_I2C_MemRxCpltCallback() + (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can + add his own code by customization of function pointer HAL_I2C_ErrorCallback() + + *** DMA mode IO operation *** + ============================== + [..] + (+) Transmit in master mode an amount of data in non-blocking mode (DMA) using + HAL_I2C_Master_Transmit_DMA() + (+) At transmission end of transfer, HAL_I2C_MasterTxCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback() + (+) Receive in master mode an amount of data in non-blocking mode (DMA) using + HAL_I2C_Master_Receive_DMA() + (+) At reception end of transfer, HAL_I2C_MasterRxCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback() + (+) Transmit in slave mode an amount of data in non-blocking mode (DMA) using + HAL_I2C_Slave_Transmit_DMA() + (+) At transmission end of transfer, HAL_I2C_SlaveTxCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback() + (+) Receive in slave mode an amount of data in non-blocking mode (DMA) using + HAL_I2C_Slave_Receive_DMA() + (+) At reception end of transfer, HAL_I2C_SlaveRxCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback() + (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can + add his own code by customization of function pointer HAL_I2C_ErrorCallback() + (+) Abort a master or memory I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT() + (+) End of abort process, HAL_I2C_AbortCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_I2C_AbortCpltCallback() + + *** DMA mode IO MEM operation *** + ================================= + [..] + (+) Write an amount of data in non-blocking mode with DMA to a specific memory address using + HAL_I2C_Mem_Write_DMA() + (+) At Memory end of write transfer, HAL_I2C_MemTxCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_I2C_MemTxCpltCallback() + (+) Read an amount of data in non-blocking mode with DMA from a specific memory address using + HAL_I2C_Mem_Read_DMA() + (+) At Memory end of read transfer, HAL_I2C_MemRxCpltCallback() is executed and user can + add his own code by customization of function pointer HAL_I2C_MemRxCpltCallback() + (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can + add his own code by customization of function pointer HAL_I2C_ErrorCallback() + + + *** I2C HAL driver macros list *** + ================================== + [..] + Below the list of most used macros in I2C HAL driver. + + (+) __HAL_I2C_ENABLE: Enable the I2C peripheral + (+) __HAL_I2C_DISABLE: Disable the I2C peripheral + (+) __HAL_I2C_GET_FLAG: Checks whether the specified I2C flag is set or not + (+) __HAL_I2C_CLEAR_FLAG: Clear the specified I2C pending flag + (+) __HAL_I2C_ENABLE_IT: Enable the specified I2C interrupt + (+) __HAL_I2C_DISABLE_IT: Disable the specified I2C interrupt + + *** Callback registration *** + ============================================= + [..] + The compilation flag USE_HAL_I2C_REGISTER_CALLBACKS when set to 1 + allows the user to configure dynamically the driver callbacks. + Use Functions HAL_I2C_RegisterCallback() or HAL_I2C_RegisterAddrCallback() + to register an interrupt callback. + [..] + Function HAL_I2C_RegisterCallback() allows to register following callbacks: + (+) MasterTxCpltCallback : callback for Master transmission end of transfer. + (+) MasterRxCpltCallback : callback for Master reception end of transfer. + (+) SlaveTxCpltCallback : callback for Slave transmission end of transfer. + (+) SlaveRxCpltCallback : callback for Slave reception end of transfer. + (+) ListenCpltCallback : callback for end of listen mode. + (+) MemTxCpltCallback : callback for Memory transmission end of transfer. + (+) MemRxCpltCallback : callback for Memory reception end of transfer. + (+) ErrorCallback : callback for error detection. + (+) AbortCpltCallback : callback for abort completion process. + (+) MspInitCallback : callback for Msp Init. + (+) MspDeInitCallback : callback for Msp DeInit. + This function takes as parameters the HAL peripheral handle, the Callback ID + and a pointer to the user callback function. + [..] + For specific callback AddrCallback use dedicated register callbacks : HAL_I2C_RegisterAddrCallback(). + [..] + Use function HAL_I2C_UnRegisterCallback to reset a callback to the default + weak function. + HAL_I2C_UnRegisterCallback takes as parameters the HAL peripheral handle, + and the Callback ID. + This function allows to reset following callbacks: + (+) MasterTxCpltCallback : callback for Master transmission end of transfer. + (+) MasterRxCpltCallback : callback for Master reception end of transfer. + (+) SlaveTxCpltCallback : callback for Slave transmission end of transfer. + (+) SlaveRxCpltCallback : callback for Slave reception end of transfer. + (+) ListenCpltCallback : callback for end of listen mode. + (+) MemTxCpltCallback : callback for Memory transmission end of transfer. + (+) MemRxCpltCallback : callback for Memory reception end of transfer. + (+) ErrorCallback : callback for error detection. + (+) AbortCpltCallback : callback for abort completion process. + (+) MspInitCallback : callback for Msp Init. + (+) MspDeInitCallback : callback for Msp DeInit. + [..] + For callback AddrCallback use dedicated register callbacks : HAL_I2C_UnRegisterAddrCallback(). + [..] + By default, after the HAL_I2C_Init() and when the state is HAL_I2C_STATE_RESET + all callbacks are set to the corresponding weak functions: + examples HAL_I2C_MasterTxCpltCallback(), HAL_I2C_MasterRxCpltCallback(). + Exception done for MspInit and MspDeInit functions that are + reset to the legacy weak functions in the HAL_I2C_Init()/ HAL_I2C_DeInit() only when + these callbacks are null (not registered beforehand). + If MspInit or MspDeInit are not null, the HAL_I2C_Init()/ HAL_I2C_DeInit() + keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state. + [..] + Callbacks can be registered/unregistered in HAL_I2C_STATE_READY state only. + Exception done MspInit/MspDeInit functions that can be registered/unregistered + in HAL_I2C_STATE_READY or HAL_I2C_STATE_RESET state, + thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit. + Then, the user first registers the MspInit/MspDeInit user callbacks + using HAL_I2C_RegisterCallback() before calling HAL_I2C_DeInit() + or HAL_I2C_Init() function. + [..] + When the compilation flag USE_HAL_I2C_REGISTER_CALLBACKS is set to 0 or + not defined, the callback registration feature is not available and all callbacks + are set to the corresponding weak functions. + + + + [..] + (@) You can refer to the I2C HAL driver header file for more useful macros + + @endverbatim + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup I2C I2C + * @brief I2C HAL module driver + * @{ + */ + +#ifdef HAL_I2C_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @defgroup I2C_Private_Define I2C Private Define + * @{ + */ +#define I2C_TIMEOUT_FLAG 35U /*!< Timeout 35 ms */ +#define I2C_TIMEOUT_BUSY_FLAG 25U /*!< Timeout 25 ms */ +#define I2C_TIMEOUT_STOP_FLAG 5U /*!< Timeout 5 ms */ +#define I2C_NO_OPTION_FRAME 0xFFFF0000U /*!< XferOptions default value */ + +/* Private define for @ref PreviousState usage */ +#define I2C_STATE_MSK ((uint32_t)((uint32_t)((uint32_t)HAL_I2C_STATE_BUSY_TX | (uint32_t)HAL_I2C_STATE_BUSY_RX) & (uint32_t)(~((uint32_t)HAL_I2C_STATE_READY)))) /*!< Mask State define, keep only RX and TX bits */ +#define I2C_STATE_NONE ((uint32_t)(HAL_I2C_MODE_NONE)) /*!< Default Value */ +#define I2C_STATE_MASTER_BUSY_TX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_MASTER)) /*!< Master Busy TX, combinaison of State LSB and Mode enum */ +#define I2C_STATE_MASTER_BUSY_RX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_MASTER)) /*!< Master Busy RX, combinaison of State LSB and Mode enum */ +#define I2C_STATE_SLAVE_BUSY_TX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_SLAVE)) /*!< Slave Busy TX, combinaison of State LSB and Mode enum */ +#define I2C_STATE_SLAVE_BUSY_RX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_SLAVE)) /*!< Slave Busy RX, combinaison of State LSB and Mode enum */ + +/** + * @} + */ + +/* Private macro -------------------------------------------------------------*/ +/** @addtogroup I2C_Private_Macros + * @{ + */ +/* Macro to get remaining data to transfer on DMA side */ +#define I2C_GET_DMA_REMAIN_DATA(__HANDLE__) __HAL_DMA_GET_COUNTER(__HANDLE__) +/** + * @} + */ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ + +/** @defgroup I2C_Private_Functions I2C Private Functions + * @{ + */ +/* Private functions to handle DMA transfer */ +static void I2C_DMAXferCplt(DMA_HandleTypeDef *hdma); +static void I2C_DMAError(DMA_HandleTypeDef *hdma); +static void I2C_DMAAbort(DMA_HandleTypeDef *hdma); + +static void I2C_ITError(I2C_HandleTypeDef *hi2c); + +static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart); +static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart); +static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart); +static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart); + +/* Private functions to handle flags during polling transfer */ +static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart); +static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout, uint32_t Tickstart); +static HAL_StatusTypeDef I2C_WaitOnTXEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart); +static HAL_StatusTypeDef I2C_WaitOnBTFFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart); +static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart); +static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart); +static HAL_StatusTypeDef I2C_WaitOnSTOPRequestThroughIT(I2C_HandleTypeDef *hi2c); +static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c); + +/* Private functions for I2C transfer IRQ handler */ +static void I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c); +static void I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c); +static void I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c); +static void I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c); +static void I2C_Master_SB(I2C_HandleTypeDef *hi2c); +static void I2C_Master_ADD10(I2C_HandleTypeDef *hi2c); +static void I2C_Master_ADDR(I2C_HandleTypeDef *hi2c); + +static void I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c); +static void I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c); +static void I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c); +static void I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c); +static void I2C_Slave_ADDR(I2C_HandleTypeDef *hi2c, uint32_t IT2Flags); +static void I2C_Slave_STOPF(I2C_HandleTypeDef *hi2c); +static void I2C_Slave_AF(I2C_HandleTypeDef *hi2c); + +static void I2C_MemoryTransmit_TXE_BTF(I2C_HandleTypeDef *hi2c); + +/* Private function to Convert Specific options */ +static void I2C_ConvertOtherXferOptions(I2C_HandleTypeDef *hi2c); + +/* Private function to flush DR register */ +static void I2C_Flush_DR(I2C_HandleTypeDef *hi2c); +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup I2C_Exported_Functions I2C Exported Functions + * @{ + */ + +/** @defgroup I2C_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] This subsection provides a set of functions allowing to initialize and + deinitialize the I2Cx peripheral: + + (+) User must Implement HAL_I2C_MspInit() function in which he configures + all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC). + + (+) Call the function HAL_I2C_Init() to configure the selected device with + the selected configuration: + (++) Communication Speed + (++) Duty cycle + (++) Addressing mode + (++) Own Address 1 + (++) Dual Addressing mode + (++) Own Address 2 + (++) General call mode + (++) Nostretch mode + + (+) Call the function HAL_I2C_DeInit() to restore the default configuration + of the selected I2Cx peripheral. + +@endverbatim + * @{ + */ + +/** + * @brief Initializes the I2C according to the specified parameters + * in the I2C_InitTypeDef and initialize the associated handle. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c) +{ + uint32_t freqrange; + uint32_t pclk1; + + /* Check the I2C handle allocation */ + if (hi2c == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); + assert_param(IS_I2C_CLOCK_SPEED(hi2c->Init.ClockSpeed)); + assert_param(IS_I2C_DUTY_CYCLE(hi2c->Init.DutyCycle)); + assert_param(IS_I2C_OWN_ADDRESS1(hi2c->Init.OwnAddress1)); + assert_param(IS_I2C_ADDRESSING_MODE(hi2c->Init.AddressingMode)); + assert_param(IS_I2C_DUAL_ADDRESS(hi2c->Init.DualAddressMode)); + assert_param(IS_I2C_OWN_ADDRESS2(hi2c->Init.OwnAddress2)); + assert_param(IS_I2C_GENERAL_CALL(hi2c->Init.GeneralCallMode)); + assert_param(IS_I2C_NO_STRETCH(hi2c->Init.NoStretchMode)); + + if (hi2c->State == HAL_I2C_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + hi2c->Lock = HAL_UNLOCKED; + +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + /* Init the I2C Callback settings */ + hi2c->MasterTxCpltCallback = HAL_I2C_MasterTxCpltCallback; /* Legacy weak MasterTxCpltCallback */ + hi2c->MasterRxCpltCallback = HAL_I2C_MasterRxCpltCallback; /* Legacy weak MasterRxCpltCallback */ + hi2c->SlaveTxCpltCallback = HAL_I2C_SlaveTxCpltCallback; /* Legacy weak SlaveTxCpltCallback */ + hi2c->SlaveRxCpltCallback = HAL_I2C_SlaveRxCpltCallback; /* Legacy weak SlaveRxCpltCallback */ + hi2c->ListenCpltCallback = HAL_I2C_ListenCpltCallback; /* Legacy weak ListenCpltCallback */ + hi2c->MemTxCpltCallback = HAL_I2C_MemTxCpltCallback; /* Legacy weak MemTxCpltCallback */ + hi2c->MemRxCpltCallback = HAL_I2C_MemRxCpltCallback; /* Legacy weak MemRxCpltCallback */ + hi2c->ErrorCallback = HAL_I2C_ErrorCallback; /* Legacy weak ErrorCallback */ + hi2c->AbortCpltCallback = HAL_I2C_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ + hi2c->AddrCallback = HAL_I2C_AddrCallback; /* Legacy weak AddrCallback */ + + if (hi2c->MspInitCallback == NULL) + { + hi2c->MspInitCallback = HAL_I2C_MspInit; /* Legacy weak MspInit */ + } + + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + hi2c->MspInitCallback(hi2c); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + HAL_I2C_MspInit(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + + hi2c->State = HAL_I2C_STATE_BUSY; + + /* Disable the selected I2C peripheral */ + __HAL_I2C_DISABLE(hi2c); + + /*Reset I2C*/ + hi2c->Instance->CR1 |= I2C_CR1_SWRST; + hi2c->Instance->CR1 &= ~I2C_CR1_SWRST; + + /* Get PCLK1 frequency */ + pclk1 = HAL_RCC_GetPCLK1Freq(); + + /* Check the minimum allowed PCLK1 frequency */ + if (I2C_MIN_PCLK_FREQ(pclk1, hi2c->Init.ClockSpeed) == 1U) + { + return HAL_ERROR; + } + + /* Calculate frequency range */ + freqrange = I2C_FREQRANGE(pclk1); + + /*---------------------------- I2Cx CR2 Configuration ----------------------*/ + /* Configure I2Cx: Frequency range */ + MODIFY_REG(hi2c->Instance->CR2, I2C_CR2_FREQ, freqrange); + + /*---------------------------- I2Cx TRISE Configuration --------------------*/ + /* Configure I2Cx: Rise Time */ + MODIFY_REG(hi2c->Instance->TRISE, I2C_TRISE_TRISE, I2C_RISE_TIME(freqrange, hi2c->Init.ClockSpeed)); + + /*---------------------------- I2Cx CCR Configuration ----------------------*/ + /* Configure I2Cx: Speed */ + MODIFY_REG(hi2c->Instance->CCR, (I2C_CCR_FS | I2C_CCR_DUTY | I2C_CCR_CCR), I2C_SPEED(pclk1, hi2c->Init.ClockSpeed, hi2c->Init.DutyCycle)); + + /*---------------------------- I2Cx CR1 Configuration ----------------------*/ + /* Configure I2Cx: Generalcall and NoStretch mode */ + MODIFY_REG(hi2c->Instance->CR1, (I2C_CR1_ENGC | I2C_CR1_NOSTRETCH), (hi2c->Init.GeneralCallMode | hi2c->Init.NoStretchMode)); + + /*---------------------------- I2Cx OAR1 Configuration ---------------------*/ + /* Configure I2Cx: Own Address1 and addressing mode */ + MODIFY_REG(hi2c->Instance->OAR1, (I2C_OAR1_ADDMODE | I2C_OAR1_ADD8_9 | I2C_OAR1_ADD1_7 | I2C_OAR1_ADD0), (hi2c->Init.AddressingMode | hi2c->Init.OwnAddress1)); + + /*---------------------------- I2Cx OAR2 Configuration ---------------------*/ + /* Configure I2Cx: Dual mode and Own Address2 */ + MODIFY_REG(hi2c->Instance->OAR2, (I2C_OAR2_ENDUAL | I2C_OAR2_ADD2), (hi2c->Init.DualAddressMode | hi2c->Init.OwnAddress2)); + + /* Enable the selected I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->Mode = HAL_I2C_MODE_NONE; + + return HAL_OK; +} + +/** + * @brief DeInitialize the I2C peripheral. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c) +{ + /* Check the I2C handle allocation */ + if (hi2c == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); + + hi2c->State = HAL_I2C_STATE_BUSY; + + /* Disable the I2C Peripheral Clock */ + __HAL_I2C_DISABLE(hi2c); + +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + if (hi2c->MspDeInitCallback == NULL) + { + hi2c->MspDeInitCallback = HAL_I2C_MspDeInit; /* Legacy weak MspDeInit */ + } + + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + hi2c->MspDeInitCallback(hi2c); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_I2C_MspDeInit(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + hi2c->State = HAL_I2C_STATE_RESET; + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Release Lock */ + __HAL_UNLOCK(hi2c); + + return HAL_OK; +} + +/** + * @brief Initialize the I2C MSP. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval None + */ +__weak void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hi2c); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_I2C_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitialize the I2C MSP. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval None + */ +__weak void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hi2c); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_I2C_MspDeInit could be implemented in the user file + */ +} + +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +/** + * @brief Register a User I2C Callback + * To be used instead of the weak predefined callback + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param CallbackID ID of the callback to be registered + * This parameter can be one of the following values: + * @arg @ref HAL_I2C_MASTER_TX_COMPLETE_CB_ID Master Tx Transfer completed callback ID + * @arg @ref HAL_I2C_MASTER_RX_COMPLETE_CB_ID Master Rx Transfer completed callback ID + * @arg @ref HAL_I2C_SLAVE_TX_COMPLETE_CB_ID Slave Tx Transfer completed callback ID + * @arg @ref HAL_I2C_SLAVE_RX_COMPLETE_CB_ID Slave Rx Transfer completed callback ID + * @arg @ref HAL_I2C_LISTEN_COMPLETE_CB_ID Listen Complete callback ID + * @arg @ref HAL_I2C_MEM_TX_COMPLETE_CB_ID Memory Tx Transfer callback ID + * @arg @ref HAL_I2C_MEM_RX_COMPLETE_CB_ID Memory Rx Transfer completed callback ID + * @arg @ref HAL_I2C_ERROR_CB_ID Error callback ID + * @arg @ref HAL_I2C_ABORT_CB_ID Abort callback ID + * @arg @ref HAL_I2C_MSPINIT_CB_ID MspInit callback ID + * @arg @ref HAL_I2C_MSPDEINIT_CB_ID MspDeInit callback ID + * @param pCallback pointer to the Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_RegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID, pI2C_CallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + /* Process locked */ + __HAL_LOCK(hi2c); + + if (HAL_I2C_STATE_READY == hi2c->State) + { + switch (CallbackID) + { + case HAL_I2C_MASTER_TX_COMPLETE_CB_ID : + hi2c->MasterTxCpltCallback = pCallback; + break; + + case HAL_I2C_MASTER_RX_COMPLETE_CB_ID : + hi2c->MasterRxCpltCallback = pCallback; + break; + + case HAL_I2C_SLAVE_TX_COMPLETE_CB_ID : + hi2c->SlaveTxCpltCallback = pCallback; + break; + + case HAL_I2C_SLAVE_RX_COMPLETE_CB_ID : + hi2c->SlaveRxCpltCallback = pCallback; + break; + + case HAL_I2C_LISTEN_COMPLETE_CB_ID : + hi2c->ListenCpltCallback = pCallback; + break; + + case HAL_I2C_MEM_TX_COMPLETE_CB_ID : + hi2c->MemTxCpltCallback = pCallback; + break; + + case HAL_I2C_MEM_RX_COMPLETE_CB_ID : + hi2c->MemRxCpltCallback = pCallback; + break; + + case HAL_I2C_ERROR_CB_ID : + hi2c->ErrorCallback = pCallback; + break; + + case HAL_I2C_ABORT_CB_ID : + hi2c->AbortCpltCallback = pCallback; + break; + + case HAL_I2C_MSPINIT_CB_ID : + hi2c->MspInitCallback = pCallback; + break; + + case HAL_I2C_MSPDEINIT_CB_ID : + hi2c->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (HAL_I2C_STATE_RESET == hi2c->State) + { + switch (CallbackID) + { + case HAL_I2C_MSPINIT_CB_ID : + hi2c->MspInitCallback = pCallback; + break; + + case HAL_I2C_MSPDEINIT_CB_ID : + hi2c->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hi2c); + return status; +} + +/** + * @brief Unregister an I2C Callback + * I2C callback is redirected to the weak predefined callback + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param CallbackID ID of the callback to be unregistered + * This parameter can be one of the following values: + * This parameter can be one of the following values: + * @arg @ref HAL_I2C_MASTER_TX_COMPLETE_CB_ID Master Tx Transfer completed callback ID + * @arg @ref HAL_I2C_MASTER_RX_COMPLETE_CB_ID Master Rx Transfer completed callback ID + * @arg @ref HAL_I2C_SLAVE_TX_COMPLETE_CB_ID Slave Tx Transfer completed callback ID + * @arg @ref HAL_I2C_SLAVE_RX_COMPLETE_CB_ID Slave Rx Transfer completed callback ID + * @arg @ref HAL_I2C_LISTEN_COMPLETE_CB_ID Listen Complete callback ID + * @arg @ref HAL_I2C_MEM_TX_COMPLETE_CB_ID Memory Tx Transfer callback ID + * @arg @ref HAL_I2C_MEM_RX_COMPLETE_CB_ID Memory Rx Transfer completed callback ID + * @arg @ref HAL_I2C_ERROR_CB_ID Error callback ID + * @arg @ref HAL_I2C_ABORT_CB_ID Abort callback ID + * @arg @ref HAL_I2C_MSPINIT_CB_ID MspInit callback ID + * @arg @ref HAL_I2C_MSPDEINIT_CB_ID MspDeInit callback ID + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hi2c); + + if (HAL_I2C_STATE_READY == hi2c->State) + { + switch (CallbackID) + { + case HAL_I2C_MASTER_TX_COMPLETE_CB_ID : + hi2c->MasterTxCpltCallback = HAL_I2C_MasterTxCpltCallback; /* Legacy weak MasterTxCpltCallback */ + break; + + case HAL_I2C_MASTER_RX_COMPLETE_CB_ID : + hi2c->MasterRxCpltCallback = HAL_I2C_MasterRxCpltCallback; /* Legacy weak MasterRxCpltCallback */ + break; + + case HAL_I2C_SLAVE_TX_COMPLETE_CB_ID : + hi2c->SlaveTxCpltCallback = HAL_I2C_SlaveTxCpltCallback; /* Legacy weak SlaveTxCpltCallback */ + break; + + case HAL_I2C_SLAVE_RX_COMPLETE_CB_ID : + hi2c->SlaveRxCpltCallback = HAL_I2C_SlaveRxCpltCallback; /* Legacy weak SlaveRxCpltCallback */ + break; + + case HAL_I2C_LISTEN_COMPLETE_CB_ID : + hi2c->ListenCpltCallback = HAL_I2C_ListenCpltCallback; /* Legacy weak ListenCpltCallback */ + break; + + case HAL_I2C_MEM_TX_COMPLETE_CB_ID : + hi2c->MemTxCpltCallback = HAL_I2C_MemTxCpltCallback; /* Legacy weak MemTxCpltCallback */ + break; + + case HAL_I2C_MEM_RX_COMPLETE_CB_ID : + hi2c->MemRxCpltCallback = HAL_I2C_MemRxCpltCallback; /* Legacy weak MemRxCpltCallback */ + break; + + case HAL_I2C_ERROR_CB_ID : + hi2c->ErrorCallback = HAL_I2C_ErrorCallback; /* Legacy weak ErrorCallback */ + break; + + case HAL_I2C_ABORT_CB_ID : + hi2c->AbortCpltCallback = HAL_I2C_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ + break; + + case HAL_I2C_MSPINIT_CB_ID : + hi2c->MspInitCallback = HAL_I2C_MspInit; /* Legacy weak MspInit */ + break; + + case HAL_I2C_MSPDEINIT_CB_ID : + hi2c->MspDeInitCallback = HAL_I2C_MspDeInit; /* Legacy weak MspDeInit */ + break; + + default : + /* Update the error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (HAL_I2C_STATE_RESET == hi2c->State) + { + switch (CallbackID) + { + case HAL_I2C_MSPINIT_CB_ID : + hi2c->MspInitCallback = HAL_I2C_MspInit; /* Legacy weak MspInit */ + break; + + case HAL_I2C_MSPDEINIT_CB_ID : + hi2c->MspDeInitCallback = HAL_I2C_MspDeInit; /* Legacy weak MspDeInit */ + break; + + default : + /* Update the error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hi2c); + return status; +} + +/** + * @brief Register the Slave Address Match I2C Callback + * To be used instead of the weak HAL_I2C_AddrCallback() predefined callback + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param pCallback pointer to the Address Match Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_AddrCallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + /* Process locked */ + __HAL_LOCK(hi2c); + + if (HAL_I2C_STATE_READY == hi2c->State) + { + hi2c->AddrCallback = pCallback; + } + else + { + /* Update the error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hi2c); + return status; +} + +/** + * @brief UnRegister the Slave Address Match I2C Callback + * Info Ready I2C Callback is redirected to the weak HAL_I2C_AddrCallback() predefined callback + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hi2c); + + if (HAL_I2C_STATE_READY == hi2c->State) + { + hi2c->AddrCallback = HAL_I2C_AddrCallback; /* Legacy weak AddrCallback */ + } + else + { + /* Update the error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hi2c); + return status; +} + +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + +/** + * @brief I2C data register flush process. + * @param hi2c I2C handle. + * @retval None + */ +static void I2C_Flush_DR(I2C_HandleTypeDef *hi2c) +{ + /* Write a dummy data in DR to clear TXE flag */ + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) != RESET) + { + hi2c->Instance->DR = 0x00U; + } +} + +/** + * @} + */ + +/** @defgroup I2C_Exported_Functions_Group2 Input and Output operation functions + * @brief Data transfers functions + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to manage the I2C data + transfers. + + (#) There are two modes of transfer: + (++) Blocking mode : The communication is performed in the polling mode. + The status of all data processing is returned by the same function + after finishing transfer. + (++) No-Blocking mode : The communication is performed using Interrupts + or DMA. These functions return the status of the transfer startup. + The end of the data processing will be indicated through the + dedicated I2C IRQ when using Interrupt mode or the DMA IRQ when + using DMA mode. + + (#) Blocking mode functions are : + (++) HAL_I2C_Master_Transmit() + (++) HAL_I2C_Master_Receive() + (++) HAL_I2C_Slave_Transmit() + (++) HAL_I2C_Slave_Receive() + (++) HAL_I2C_Mem_Write() + (++) HAL_I2C_Mem_Read() + (++) HAL_I2C_IsDeviceReady() + + (#) No-Blocking mode functions with Interrupt are : + (++) HAL_I2C_Master_Transmit_IT() + (++) HAL_I2C_Master_Receive_IT() + (++) HAL_I2C_Slave_Transmit_IT() + (++) HAL_I2C_Slave_Receive_IT() + (++) HAL_I2C_Mem_Write_IT() + (++) HAL_I2C_Mem_Read_IT() + (++) HAL_I2C_Master_Seq_Transmit_IT() + (++) HAL_I2C_Master_Seq_Receive_IT() + (++) HAL_I2C_Slave_Seq_Transmit_IT() + (++) HAL_I2C_Slave_Seq_Receive_IT() + (++) HAL_I2C_EnableListen_IT() + (++) HAL_I2C_DisableListen_IT() + (++) HAL_I2C_Master_Abort_IT() + + (#) No-Blocking mode functions with DMA are : + (++) HAL_I2C_Master_Transmit_DMA() + (++) HAL_I2C_Master_Receive_DMA() + (++) HAL_I2C_Slave_Transmit_DMA() + (++) HAL_I2C_Slave_Receive_DMA() + (++) HAL_I2C_Mem_Write_DMA() + (++) HAL_I2C_Mem_Read_DMA() + (++) HAL_I2C_Master_Seq_Transmit_DMA() + (++) HAL_I2C_Master_Seq_Receive_DMA() + (++) HAL_I2C_Slave_Seq_Transmit_DMA() + (++) HAL_I2C_Slave_Seq_Receive_DMA() + + (#) A set of Transfer Complete Callbacks are provided in non Blocking mode: + (++) HAL_I2C_MasterTxCpltCallback() + (++) HAL_I2C_MasterRxCpltCallback() + (++) HAL_I2C_SlaveTxCpltCallback() + (++) HAL_I2C_SlaveRxCpltCallback() + (++) HAL_I2C_MemTxCpltCallback() + (++) HAL_I2C_MemRxCpltCallback() + (++) HAL_I2C_AddrCallback() + (++) HAL_I2C_ListenCpltCallback() + (++) HAL_I2C_ErrorCallback() + (++) HAL_I2C_AbortCpltCallback() + +@endverbatim + * @{ + */ + +/** + * @brief Transmits in master mode an amount of data in blocking mode. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ + /* Init tickstart for timeout management*/ + uint32_t tickstart = HAL_GetTick(); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Wait until BUSY flag is reset */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) + { + return HAL_BUSY; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_TX; + hi2c->Mode = HAL_I2C_MODE_MASTER; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + + /* Send Slave Address */ + if (I2C_MasterRequestWrite(hi2c, DevAddress, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + while (hi2c->XferSize > 0U) + { + /* Wait until TXE flag is set */ + if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + { + if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + } + return HAL_ERROR; + } + + /* Write data to DR */ + hi2c->Instance->DR = *hi2c->pBuffPtr; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferCount--; + hi2c->XferSize--; + + if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U)) + { + /* Write data to DR */ + hi2c->Instance->DR = *hi2c->pBuffPtr; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferCount--; + hi2c->XferSize--; + } + + /* Wait until BTF flag is set */ + if (I2C_WaitOnBTFFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + { + if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + } + return HAL_ERROR; + } + } + + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receives in master mode an amount of data in blocking mode. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ + /* Init tickstart for timeout management*/ + uint32_t tickstart = HAL_GetTick(); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Wait until BUSY flag is reset */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) + { + return HAL_BUSY; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_RX; + hi2c->Mode = HAL_I2C_MODE_MASTER; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + + /* Send Slave Address */ + if (I2C_MasterRequestRead(hi2c, DevAddress, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + if (hi2c->XferSize == 0U) + { + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + } + else if (hi2c->XferSize == 1U) + { + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + } + else if (hi2c->XferSize == 2U) + { + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Enable Pos */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + } + else + { + /* Enable Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + } + + while (hi2c->XferSize > 0U) + { + if (hi2c->XferSize <= 3U) + { + /* One byte */ + if (hi2c->XferSize == 1U) + { + /* Wait until RXNE flag is set */ + if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferSize--; + hi2c->XferCount--; + } + /* Two bytes */ + else if (hi2c->XferSize == 2U) + { + /* Wait until BTF flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferSize--; + hi2c->XferCount--; + + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferSize--; + hi2c->XferCount--; + } + /* 3 Last bytes */ + else + { + /* Wait until BTF flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferSize--; + hi2c->XferCount--; + + /* Wait until BTF flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferSize--; + hi2c->XferCount--; + + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferSize--; + hi2c->XferCount--; + } + } + else + { + /* Wait until RXNE flag is set */ + if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferSize--; + hi2c->XferCount--; + + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) + { + + if (hi2c->XferSize == 3U) + { + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + } + + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferSize--; + hi2c->XferCount--; + } + } + } + + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Transmits in slave mode an amount of data in blocking mode. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ + /* Init tickstart for timeout management*/ + uint32_t tickstart = HAL_GetTick(); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_TX; + hi2c->Mode = HAL_I2C_MODE_SLAVE; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + + /* Enable Address Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Wait until ADDR flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + /* If 10bit addressing mode is selected */ + if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT) + { + /* Wait until ADDR flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + } + + while (hi2c->XferSize > 0U) + { + /* Wait until TXE flag is set */ + if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + { + /* Disable Address Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + return HAL_ERROR; + } + + /* Write data to DR */ + hi2c->Instance->DR = *hi2c->pBuffPtr; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferCount--; + hi2c->XferSize--; + + if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U)) + { + /* Write data to DR */ + hi2c->Instance->DR = *hi2c->pBuffPtr; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferCount--; + hi2c->XferSize--; + } + } + + /* Wait until AF flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_AF, RESET, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Clear AF flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + + /* Disable Address Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receive in slave mode an amount of data in blocking mode + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ + /* Init tickstart for timeout management*/ + uint32_t tickstart = HAL_GetTick(); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + if ((pData == NULL) || (Size == (uint16_t)0)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_RX; + hi2c->Mode = HAL_I2C_MODE_SLAVE; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + + /* Enable Address Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Wait until ADDR flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + while (hi2c->XferSize > 0U) + { + /* Wait until RXNE flag is set */ + if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + { + /* Disable Address Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + return HAL_ERROR; + } + + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferSize--; + hi2c->XferCount--; + + if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U)) + { + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferSize--; + hi2c->XferCount--; + } + } + + /* Wait until STOP flag is set */ + if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + { + /* Disable Address Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + return HAL_ERROR; + } + + /* Clear STOP flag */ + __HAL_I2C_CLEAR_STOPFLAG(hi2c); + + /* Disable Address Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Transmit in master mode an amount of data in non-blocking mode with Interrupt + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) +{ + __IO uint32_t count = 0U; + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Wait until BUSY flag is reset */ + count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); + do + { + count--; + if (count == 0U) + { + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + + return HAL_BUSY; + } + } + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_TX; + hi2c->Mode = HAL_I2C_MODE_MASTER; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->Devaddress = DevAddress; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + /* Enable EVT, BUF and ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + + /* Generate Start */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receive in master mode an amount of data in non-blocking mode with Interrupt + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) +{ + __IO uint32_t count = 0U; + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Wait until BUSY flag is reset */ + count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); + do + { + count--; + if (count == 0U) + { + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + + return HAL_BUSY; + } + } + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_RX; + hi2c->Mode = HAL_I2C_MODE_MASTER; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->Devaddress = DevAddress; + + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + + /* Enable EVT, BUF and ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + + /* Enable Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Generate Start */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Transmit in slave mode an amount of data in non-blocking mode with Interrupt + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) +{ + + if (hi2c->State == HAL_I2C_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_TX; + hi2c->Mode = HAL_I2C_MODE_SLAVE; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + + /* Enable Address Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + + /* Enable EVT, BUF and ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receive in slave mode an amount of data in non-blocking mode with Interrupt + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) +{ + + if (hi2c->State == HAL_I2C_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_RX; + hi2c->Mode = HAL_I2C_MODE_SLAVE; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + + /* Enable Address Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + + /* Enable EVT, BUF and ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Transmit in master mode an amount of data in non-blocking mode with DMA + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) +{ + __IO uint32_t count = 0U; + HAL_StatusTypeDef dmaxferstatus; + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Wait until BUSY flag is reset */ + count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); + do + { + count--; + if (count == 0U) + { + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + + return HAL_BUSY; + } + } + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_TX; + hi2c->Mode = HAL_I2C_MODE_MASTER; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->Devaddress = DevAddress; + + if (hi2c->XferSize > 0U) + { + if (hi2c->hdmatx != NULL) + { + /* Set the I2C DMA transfer complete callback */ + hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt; + + /* Set the DMA error callback */ + hi2c->hdmatx->XferErrorCallback = I2C_DMAError; + + /* Set the unused DMA callbacks to NULL */ + hi2c->hdmatx->XferHalfCpltCallback = NULL; + hi2c->hdmatx->XferM1CpltCallback = NULL; + hi2c->hdmatx->XferM1HalfCpltCallback = NULL; + hi2c->hdmatx->XferAbortCallback = NULL; + + /* Enable the DMA stream */ + dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize); + } + else + { + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + + if (dmaxferstatus == HAL_OK) + { + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + + /* Enable EVT and ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); + + /* Enable DMA Request */ + SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); + + /* Enable Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Generate Start */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + } + else + { + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + } + else + { + /* Enable Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Generate Start */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + + /* Enable EVT, BUF and ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + } + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receive in master mode an amount of data in non-blocking mode with DMA + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) +{ + __IO uint32_t count = 0U; + HAL_StatusTypeDef dmaxferstatus; + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Wait until BUSY flag is reset */ + count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); + do + { + count--; + if (count == 0U) + { + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + + return HAL_BUSY; + } + } + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_RX; + hi2c->Mode = HAL_I2C_MODE_MASTER; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->Devaddress = DevAddress; + + if (hi2c->XferSize > 0U) + { + if (hi2c->hdmarx != NULL) + { + /* Set the I2C DMA transfer complete callback */ + hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt; + + /* Set the DMA error callback */ + hi2c->hdmarx->XferErrorCallback = I2C_DMAError; + + /* Set the unused DMA callbacks to NULL */ + hi2c->hdmarx->XferHalfCpltCallback = NULL; + hi2c->hdmarx->XferM1CpltCallback = NULL; + hi2c->hdmarx->XferM1HalfCpltCallback = NULL; + hi2c->hdmarx->XferAbortCallback = NULL; + + /* Enable the DMA stream */ + dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize); + } + else + { + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + + if (dmaxferstatus == HAL_OK) + { + /* Enable Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Generate Start */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + + /* Enable EVT and ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); + + /* Enable DMA Request */ + SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); + } + else + { + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + } + else + { + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + + /* Enable EVT, BUF and ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + + /* Enable Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Generate Start */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + } + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Transmit in slave mode an amount of data in non-blocking mode with DMA + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) +{ + HAL_StatusTypeDef dmaxferstatus; + + if (hi2c->State == HAL_I2C_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_TX; + hi2c->Mode = HAL_I2C_MODE_SLAVE; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + + if (hi2c->hdmatx != NULL) + { + /* Set the I2C DMA transfer complete callback */ + hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt; + + /* Set the DMA error callback */ + hi2c->hdmatx->XferErrorCallback = I2C_DMAError; + + /* Set the unused DMA callbacks to NULL */ + hi2c->hdmatx->XferHalfCpltCallback = NULL; + hi2c->hdmatx->XferM1CpltCallback = NULL; + hi2c->hdmatx->XferM1HalfCpltCallback = NULL; + hi2c->hdmatx->XferAbortCallback = NULL; + + /* Enable the DMA stream */ + dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize); + } + else + { + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_LISTEN; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + + if (dmaxferstatus == HAL_OK) + { + /* Enable Address Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + /* Enable EVT and ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); + + /* Enable DMA Request */ + hi2c->Instance->CR2 |= I2C_CR2_DMAEN; + + return HAL_OK; + } + else + { + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receive in slave mode an amount of data in non-blocking mode with DMA + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) +{ + HAL_StatusTypeDef dmaxferstatus; + + if (hi2c->State == HAL_I2C_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_RX; + hi2c->Mode = HAL_I2C_MODE_SLAVE; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + + if (hi2c->hdmarx != NULL) + { + /* Set the I2C DMA transfer complete callback */ + hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt; + + /* Set the DMA error callback */ + hi2c->hdmarx->XferErrorCallback = I2C_DMAError; + + /* Set the unused DMA callbacks to NULL */ + hi2c->hdmarx->XferHalfCpltCallback = NULL; + hi2c->hdmarx->XferM1CpltCallback = NULL; + hi2c->hdmarx->XferM1HalfCpltCallback = NULL; + hi2c->hdmarx->XferAbortCallback = NULL; + + /* Enable the DMA stream */ + dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize); + } + else + { + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_LISTEN; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + + if (dmaxferstatus == HAL_OK) + { + /* Enable Address Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + /* Enable EVT and ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); + + /* Enable DMA Request */ + SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); + + return HAL_OK; + } + else + { + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Write an amount of data in blocking mode to a specific memory address + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param MemAddress Internal memory address + * @param MemAddSize Size of internal memory address + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ + /* Init tickstart for timeout management*/ + uint32_t tickstart = HAL_GetTick(); + + /* Check the parameters */ + assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Wait until BUSY flag is reset */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) + { + return HAL_BUSY; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_TX; + hi2c->Mode = HAL_I2C_MODE_MEM; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + + /* Send Slave Address and Memory Address */ + if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + while (hi2c->XferSize > 0U) + { + /* Wait until TXE flag is set */ + if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + { + if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + } + return HAL_ERROR; + } + + /* Write data to DR */ + hi2c->Instance->DR = *hi2c->pBuffPtr; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferSize--; + hi2c->XferCount--; + + if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U)) + { + /* Write data to DR */ + hi2c->Instance->DR = *hi2c->pBuffPtr; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferSize--; + hi2c->XferCount--; + } + } + + /* Wait until BTF flag is set */ + if (I2C_WaitOnBTFFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + { + if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + } + return HAL_ERROR; + } + + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Read an amount of data in blocking mode from a specific memory address + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param MemAddress Internal memory address + * @param MemAddSize Size of internal memory address + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ + /* Init tickstart for timeout management*/ + uint32_t tickstart = HAL_GetTick(); + + /* Check the parameters */ + assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Wait until BUSY flag is reset */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) + { + return HAL_BUSY; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_RX; + hi2c->Mode = HAL_I2C_MODE_MEM; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + + /* Send Slave Address and Memory Address */ + if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + if (hi2c->XferSize == 0U) + { + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + } + else if (hi2c->XferSize == 1U) + { + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + } + else if (hi2c->XferSize == 2U) + { + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Enable Pos */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + } + else + { + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + } + + while (hi2c->XferSize > 0U) + { + if (hi2c->XferSize <= 3U) + { + /* One byte */ + if (hi2c->XferSize == 1U) + { + /* Wait until RXNE flag is set */ + if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferSize--; + hi2c->XferCount--; + } + /* Two bytes */ + else if (hi2c->XferSize == 2U) + { + /* Wait until BTF flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferSize--; + hi2c->XferCount--; + + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferSize--; + hi2c->XferCount--; + } + /* 3 Last bytes */ + else + { + /* Wait until BTF flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferSize--; + hi2c->XferCount--; + + /* Wait until BTF flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferSize--; + hi2c->XferCount--; + + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferSize--; + hi2c->XferCount--; + } + } + else + { + /* Wait until RXNE flag is set */ + if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferSize--; + hi2c->XferCount--; + + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) + { + if (hi2c->XferSize == 3U) + { + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + } + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferSize--; + hi2c->XferCount--; + } + } + } + + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Write an amount of data in non-blocking mode with Interrupt to a specific memory address + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param MemAddress Internal memory address + * @param MemAddSize Size of internal memory address + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) +{ + __IO uint32_t count = 0U; + + /* Check the parameters */ + assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Wait until BUSY flag is reset */ + count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); + do + { + count--; + if (count == 0U) + { + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + + return HAL_BUSY; + } + } + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_TX; + hi2c->Mode = HAL_I2C_MODE_MEM; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->Devaddress = DevAddress; + hi2c->Memaddress = MemAddress; + hi2c->MemaddSize = MemAddSize; + hi2c->EventCount = 0U; + + /* Generate Start */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + + /* Enable EVT, BUF and ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Read an amount of data in non-blocking mode with Interrupt from a specific memory address + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param DevAddress Target device address + * @param MemAddress Internal memory address + * @param MemAddSize Size of internal memory address + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) +{ + __IO uint32_t count = 0U; + + /* Check the parameters */ + assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Wait until BUSY flag is reset */ + count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); + do + { + count--; + if (count == 0U) + { + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + + return HAL_BUSY; + } + } + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_RX; + hi2c->Mode = HAL_I2C_MODE_MEM; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->Devaddress = DevAddress; + hi2c->Memaddress = MemAddress; + hi2c->MemaddSize = MemAddSize; + hi2c->EventCount = 0U; + + /* Enable Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Generate Start */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + if (hi2c->XferSize > 0U) + { + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + + /* Enable EVT, BUF and ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + } + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Write an amount of data in non-blocking mode with DMA to a specific memory address + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param MemAddress Internal memory address + * @param MemAddSize Size of internal memory address + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) +{ + __IO uint32_t count = 0U; + HAL_StatusTypeDef dmaxferstatus; + + /* Init tickstart for timeout management*/ + uint32_t tickstart = HAL_GetTick(); + + /* Check the parameters */ + assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Wait until BUSY flag is reset */ + count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); + do + { + count--; + if (count == 0U) + { + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + + return HAL_BUSY; + } + } + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_TX; + hi2c->Mode = HAL_I2C_MODE_MEM; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->Devaddress = DevAddress; + hi2c->Memaddress = MemAddress; + hi2c->MemaddSize = MemAddSize; + hi2c->EventCount = 0U; + + if (hi2c->XferSize > 0U) + { + if (hi2c->hdmatx != NULL) + { + /* Set the I2C DMA transfer complete callback */ + hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt; + + /* Set the DMA error callback */ + hi2c->hdmatx->XferErrorCallback = I2C_DMAError; + + /* Set the unused DMA callbacks to NULL */ + hi2c->hdmatx->XferHalfCpltCallback = NULL; + hi2c->hdmatx->XferM1CpltCallback = NULL; + hi2c->hdmatx->XferM1HalfCpltCallback = NULL; + hi2c->hdmatx->XferAbortCallback = NULL; + + /* Enable the DMA stream */ + dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize); + } + else + { + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + + if (dmaxferstatus == HAL_OK) + { + /* Send Slave Address and Memory Address */ + if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK) + { + /* Abort the ongoing DMA */ + dmaxferstatus = HAL_DMA_Abort_IT(hi2c->hdmatx); + + /* Prevent unused argument(s) compilation and MISRA warning */ + UNUSED(dmaxferstatus); + + /* Set the unused I2C DMA transfer complete callback to NULL */ + hi2c->hdmatx->XferCpltCallback = NULL; + + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + hi2c->XferSize = 0U; + hi2c->XferCount = 0U; + + /* Disable I2C peripheral to prevent dummy data in buffer */ + __HAL_I2C_DISABLE(hi2c); + + return HAL_ERROR; + } + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + /* Enable ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_ERR); + + /* Enable DMA Request */ + SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); + + return HAL_OK; + } + else + { + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + } + else + { + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_SIZE; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Reads an amount of data in non-blocking mode with DMA from a specific memory address. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param MemAddress Internal memory address + * @param MemAddSize Size of internal memory address + * @param pData Pointer to data buffer + * @param Size Amount of data to be read + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) +{ + /* Init tickstart for timeout management*/ + uint32_t tickstart = HAL_GetTick(); + __IO uint32_t count = 0U; + HAL_StatusTypeDef dmaxferstatus; + + /* Check the parameters */ + assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Wait until BUSY flag is reset */ + count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); + do + { + count--; + if (count == 0U) + { + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + + return HAL_BUSY; + } + } + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_RX; + hi2c->Mode = HAL_I2C_MODE_MEM; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->Devaddress = DevAddress; + hi2c->Memaddress = MemAddress; + hi2c->MemaddSize = MemAddSize; + hi2c->EventCount = 0U; + + if (hi2c->XferSize > 0U) + { + if (hi2c->hdmarx != NULL) + { + /* Set the I2C DMA transfer complete callback */ + hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt; + + /* Set the DMA error callback */ + hi2c->hdmarx->XferErrorCallback = I2C_DMAError; + + /* Set the unused DMA callbacks to NULL */ + hi2c->hdmarx->XferHalfCpltCallback = NULL; + hi2c->hdmarx->XferM1CpltCallback = NULL; + hi2c->hdmarx->XferM1HalfCpltCallback = NULL; + hi2c->hdmarx->XferAbortCallback = NULL; + + /* Enable the DMA stream */ + dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize); + } + else + { + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + + if (dmaxferstatus == HAL_OK) + { + /* Send Slave Address and Memory Address */ + if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK) + { + /* Abort the ongoing DMA */ + dmaxferstatus = HAL_DMA_Abort_IT(hi2c->hdmarx); + + /* Prevent unused argument(s) compilation and MISRA warning */ + UNUSED(dmaxferstatus); + + /* Set the unused I2C DMA transfer complete callback to NULL */ + hi2c->hdmarx->XferCpltCallback = NULL; + + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + hi2c->XferSize = 0U; + hi2c->XferCount = 0U; + + /* Disable I2C peripheral to prevent dummy data in buffer */ + __HAL_I2C_DISABLE(hi2c); + + return HAL_ERROR; + } + + if (hi2c->XferSize == 1U) + { + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + } + else + { + /* Enable Last DMA bit */ + SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); + } + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + /* Enable ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_ERR); + + /* Enable DMA Request */ + hi2c->Instance->CR2 |= I2C_CR2_DMAEN; + } + else + { + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + } + else + { + /* Send Slave Address and Memory Address */ + if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + + hi2c->State = HAL_I2C_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + } + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Checks if target device is ready for communication. + * @note This function is used with Memory devices + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param Trials Number of trials + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout) +{ + /* Get tick */ + uint32_t tickstart = HAL_GetTick(); + uint32_t I2C_Trials = 0U; + FlagStatus tmp1; + FlagStatus tmp2; + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Wait until BUSY flag is reset */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) + { + return HAL_BUSY; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + + do + { + /* Generate Start */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + + /* Wait until SB flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, tickstart) != HAL_OK) + { + if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) + { + hi2c->ErrorCode = HAL_I2C_WRONG_START; + } + return HAL_TIMEOUT; + } + + /* Send slave address */ + hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress); + + /* Wait until ADDR or AF flag are set */ + /* Get tick */ + tickstart = HAL_GetTick(); + + tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR); + tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF); + while ((hi2c->State != HAL_I2C_STATE_TIMEOUT) && (tmp1 == RESET) && (tmp2 == RESET)) + { + if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) + { + hi2c->State = HAL_I2C_STATE_TIMEOUT; + } + tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR); + tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF); + } + + hi2c->State = HAL_I2C_STATE_READY; + + /* Check if the ADDR flag has been set */ + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR) == SET) + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + + /* Clear ADDR Flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + /* Wait until BUSY flag is reset */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + hi2c->State = HAL_I2C_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_OK; + } + else + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + + /* Clear AF Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + + /* Wait until BUSY flag is reset */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + } + + /* Increment Trials */ + I2C_Trials++; + } + while (I2C_Trials < Trials); + + hi2c->State = HAL_I2C_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Sequential transmit in master I2C mode an amount of data in non-blocking mode with Interrupt. + * @note This interface allow to manage repeated start condition when a direction change during transfer + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions) +{ + __IO uint32_t Prev_State = 0x00U; + __IO uint32_t count = 0x00U; + + /* Check the parameters */ + assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Check Busy Flag only if FIRST call of Master interface */ + if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME)) + { + /* Wait until BUSY flag is reset */ + count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); + do + { + count--; + if (count == 0U) + { + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + + return HAL_BUSY; + } + } + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_TX; + hi2c->Mode = HAL_I2C_MODE_MASTER; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = XferOptions; + hi2c->Devaddress = DevAddress; + + Prev_State = hi2c->PreviousState; + + /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ + /* Mean Previous state is same as current state */ + if ((Prev_State != I2C_STATE_MASTER_BUSY_TX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) + { + /* Generate Start */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + } + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + + /* Enable EVT, BUF and ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Sequential transmit in master I2C mode an amount of data in non-blocking mode with DMA. + * @note This interface allow to manage repeated start condition when a direction change during transfer + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions) +{ + __IO uint32_t Prev_State = 0x00U; + __IO uint32_t count = 0x00U; + HAL_StatusTypeDef dmaxferstatus; + + /* Check the parameters */ + assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Check Busy Flag only if FIRST call of Master interface */ + if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME)) + { + /* Wait until BUSY flag is reset */ + count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); + do + { + count--; + if (count == 0U) + { + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + + return HAL_BUSY; + } + } + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_TX; + hi2c->Mode = HAL_I2C_MODE_MASTER; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = XferOptions; + hi2c->Devaddress = DevAddress; + + Prev_State = hi2c->PreviousState; + + if (hi2c->XferSize > 0U) + { + if (hi2c->hdmatx != NULL) + { + /* Set the I2C DMA transfer complete callback */ + hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt; + + /* Set the DMA error callback */ + hi2c->hdmatx->XferErrorCallback = I2C_DMAError; + + /* Set the unused DMA callbacks to NULL */ + hi2c->hdmatx->XferHalfCpltCallback = NULL; + hi2c->hdmatx->XferAbortCallback = NULL; + + /* Enable the DMA stream */ + dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize); + } + else + { + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + + if (dmaxferstatus == HAL_OK) + { + /* Enable Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ + /* Mean Previous state is same as current state */ + if ((Prev_State != I2C_STATE_MASTER_BUSY_TX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) + { + /* Generate Start */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + } + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + + /* If XferOptions is not associated to a new frame, mean no start bit is request, enable directly the DMA request */ + /* In other cases, DMA request is enabled after Slave address treatment in IRQHandler */ + if ((XferOptions == I2C_NEXT_FRAME) || (XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP)) + { + /* Enable DMA Request */ + SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); + } + + /* Enable EVT and ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); + } + else + { + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + } + else + { + /* Enable Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ + /* Mean Previous state is same as current state */ + if ((Prev_State != I2C_STATE_MASTER_BUSY_TX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) + { + /* Generate Start */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + } + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + + /* Enable EVT, BUF and ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + } + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Sequential receive in master I2C mode an amount of data in non-blocking mode with Interrupt + * @note This interface allow to manage repeated start condition when a direction change during transfer + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions) +{ + __IO uint32_t Prev_State = 0x00U; + __IO uint32_t count = 0U; + uint32_t enableIT = (I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + + /* Check the parameters */ + assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Check Busy Flag only if FIRST call of Master interface */ + if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME)) + { + /* Wait until BUSY flag is reset */ + count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); + do + { + count--; + if (count == 0U) + { + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + + return HAL_BUSY; + } + } + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_RX; + hi2c->Mode = HAL_I2C_MODE_MASTER; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = XferOptions; + hi2c->Devaddress = DevAddress; + + Prev_State = hi2c->PreviousState; + + if ((hi2c->XferCount == 2U) && ((XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP))) + { + if (Prev_State == I2C_STATE_MASTER_BUSY_RX) + { + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Enable Pos */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + /* Remove Enabling of IT_BUF, mean RXNE treatment, treat the 2 bytes through BTF */ + enableIT &= ~I2C_IT_BUF; + } + else + { + /* Enable Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + } + } + else + { + /* Enable Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + } + + /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ + /* Mean Previous state is same as current state */ + if ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) + { + /* Generate Start */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + } + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + + /* Enable interrupts */ + __HAL_I2C_ENABLE_IT(hi2c, enableIT); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Sequential receive in master mode an amount of data in non-blocking mode with DMA + * @note This interface allow to manage repeated start condition when a direction change during transfer + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions) +{ + __IO uint32_t Prev_State = 0x00U; + __IO uint32_t count = 0U; + uint32_t enableIT = (I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + HAL_StatusTypeDef dmaxferstatus; + + /* Check the parameters */ + assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Check Busy Flag only if FIRST call of Master interface */ + if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME)) + { + /* Wait until BUSY flag is reset */ + count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U); + do + { + count--; + if (count == 0U) + { + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + + return HAL_BUSY; + } + } + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET); + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + /* Clear Last DMA bit */ + CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); + + hi2c->State = HAL_I2C_STATE_BUSY_RX; + hi2c->Mode = HAL_I2C_MODE_MASTER; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = XferOptions; + hi2c->Devaddress = DevAddress; + + Prev_State = hi2c->PreviousState; + + if (hi2c->XferSize > 0U) + { + if ((hi2c->XferCount == 2U) && ((XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP))) + { + if (Prev_State == I2C_STATE_MASTER_BUSY_RX) + { + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Enable Pos */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + /* Enable Last DMA bit */ + SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); + } + else + { + /* Enable Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + } + } + else + { + /* Enable Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + if ((XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_OTHER_AND_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP)) + { + /* Enable Last DMA bit */ + SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); + } + } + if (hi2c->hdmarx != NULL) + { + /* Set the I2C DMA transfer complete callback */ + hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt; + + /* Set the DMA error callback */ + hi2c->hdmarx->XferErrorCallback = I2C_DMAError; + + /* Set the unused DMA callbacks to NULL */ + hi2c->hdmarx->XferHalfCpltCallback = NULL; + hi2c->hdmarx->XferAbortCallback = NULL; + + /* Enable the DMA stream */ + dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize); + } + else + { + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + if (dmaxferstatus == HAL_OK) + { + /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ + /* Mean Previous state is same as current state */ + if ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) + { + /* Generate Start */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + + /* Update interrupt for only EVT and ERR */ + enableIT = (I2C_IT_EVT | I2C_IT_ERR); + } + else + { + /* Update interrupt for only ERR */ + enableIT = I2C_IT_ERR; + } + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + + /* If XferOptions is not associated to a new frame, mean no start bit is request, enable directly the DMA request */ + /* In other cases, DMA request is enabled after Slave address treatment in IRQHandler */ + if ((XferOptions == I2C_NEXT_FRAME) || (XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP)) + { + /* Enable DMA Request */ + SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); + } + + /* Enable EVT and ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, enableIT); + } + else + { + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + } + else + { + /* Enable Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */ + /* Mean Previous state is same as current state */ + if ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1)) + { + /* Generate Start */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + } + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + + /* Enable interrupts */ + __HAL_I2C_ENABLE_IT(hi2c, enableIT); + } + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Sequential transmit in slave mode an amount of data in non-blocking mode with Interrupt + * @note This interface allow to manage repeated start condition when a direction change during transfer + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions) +{ + /* Check the parameters */ + assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); + + if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_TX_LISTEN; + hi2c->Mode = HAL_I2C_MODE_SLAVE; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = XferOptions; + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + + /* Enable EVT, BUF and ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Sequential transmit in slave mode an amount of data in non-blocking mode with DMA + * @note This interface allow to manage repeated start condition when a direction change during transfer + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions) +{ + HAL_StatusTypeDef dmaxferstatus; + + /* Check the parameters */ + assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); + + if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Disable Interrupts, to prevent preemption during treatment in case of multicall */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); + + /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */ + /* and then toggle the HAL slave RX state to TX state */ + if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN) + { + if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) + { + /* Abort DMA Xfer if any */ + if (hi2c->hdmarx != NULL) + { + CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); + + /* Set the I2C DMA Abort callback : + will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ + hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort; + + /* Abort DMA RX */ + if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK) + { + /* Call Directly XferAbortCallback function in case of error */ + hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx); + } + } + } + } + else if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) + { + if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) + { + CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); + + /* Abort DMA Xfer if any */ + if (hi2c->hdmatx != NULL) + { + /* Set the I2C DMA Abort callback : + will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ + hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort; + + /* Abort DMA TX */ + if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK) + { + /* Call Directly XferAbortCallback function in case of error */ + hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx); + } + } + } + } + else + { + /* Nothing to do */ + } + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_TX_LISTEN; + hi2c->Mode = HAL_I2C_MODE_SLAVE; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = XferOptions; + + if (hi2c->hdmatx != NULL) + { + /* Set the I2C DMA transfer complete callback */ + hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt; + + /* Set the DMA error callback */ + hi2c->hdmatx->XferErrorCallback = I2C_DMAError; + + /* Set the unused DMA callbacks to NULL */ + hi2c->hdmatx->XferHalfCpltCallback = NULL; + hi2c->hdmatx->XferAbortCallback = NULL; + + /* Enable the DMA stream */ + dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize); + } + else + { + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_LISTEN; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + + if (dmaxferstatus == HAL_OK) + { + /* Enable Address Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + /* Enable EVT and ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); + + /* Enable DMA Request */ + hi2c->Instance->CR2 |= I2C_CR2_DMAEN; + + return HAL_OK; + } + else + { + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Sequential receive in slave mode an amount of data in non-blocking mode with Interrupt + * @note This interface allow to manage repeated start condition when a direction change during transfer + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions) +{ + /* Check the parameters */ + assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); + + if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_RX_LISTEN; + hi2c->Mode = HAL_I2C_MODE_SLAVE; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = XferOptions; + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + + /* Enable EVT, BUF and ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Sequential receive in slave mode an amount of data in non-blocking mode with DMA + * @note This interface allow to manage repeated start condition when a direction change during transfer + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param pData Pointer to data buffer + * @param Size Amount of data to be sent + * @param XferOptions Options of Transfer, value of @ref I2C_XferOptions_definition + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions) +{ + HAL_StatusTypeDef dmaxferstatus; + + /* Check the parameters */ + assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); + + if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Disable Interrupts, to prevent preemption during treatment in case of multicall */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); + + /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */ + /* and then toggle the HAL slave RX state to TX state */ + if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN) + { + if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) + { + /* Abort DMA Xfer if any */ + if (hi2c->hdmarx != NULL) + { + CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); + + /* Set the I2C DMA Abort callback : + will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ + hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort; + + /* Abort DMA RX */ + if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK) + { + /* Call Directly XferAbortCallback function in case of error */ + hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx); + } + } + } + } + else if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) + { + if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) + { + CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); + + /* Abort DMA Xfer if any */ + if (hi2c->hdmatx != NULL) + { + /* Set the I2C DMA Abort callback : + will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ + hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort; + + /* Abort DMA TX */ + if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK) + { + /* Call Directly XferAbortCallback function in case of error */ + hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx); + } + } + } + } + else + { + /* Nothing to do */ + } + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Disable Pos */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + + hi2c->State = HAL_I2C_STATE_BUSY_RX_LISTEN; + hi2c->Mode = HAL_I2C_MODE_SLAVE; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = XferOptions; + + if (hi2c->hdmarx != NULL) + { + /* Set the I2C DMA transfer complete callback */ + hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt; + + /* Set the DMA error callback */ + hi2c->hdmarx->XferErrorCallback = I2C_DMAError; + + /* Set the unused DMA callbacks to NULL */ + hi2c->hdmarx->XferHalfCpltCallback = NULL; + hi2c->hdmarx->XferAbortCallback = NULL; + + /* Enable the DMA stream */ + dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize); + } + else + { + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_LISTEN; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + + if (dmaxferstatus == HAL_OK) + { + /* Enable Address Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Enable DMA Request */ + SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); + + /* Note : The I2C interrupts must be enabled after unlocking current process + to avoid the risk of I2C interrupt handle execution before current + process unlock */ + /* Enable EVT and ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); + + return HAL_OK; + } + else + { + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Enable the Address listen mode with Interrupt. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c) +{ + if (hi2c->State == HAL_I2C_STATE_READY) + { + hi2c->State = HAL_I2C_STATE_LISTEN; + + /* Check if the I2C is already enabled */ + if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE) + { + /* Enable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + } + + /* Enable Address Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Enable EVT and ERR interrupt */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Disable the Address listen mode with Interrupt. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c) +{ + /* Declaration of tmp to prevent undefined behavior of volatile usage */ + uint32_t tmp; + + /* Disable Address listen mode only if a transfer is not ongoing */ + if (hi2c->State == HAL_I2C_STATE_LISTEN) + { + tmp = (uint32_t)(hi2c->State) & I2C_STATE_MSK; + hi2c->PreviousState = tmp | (uint32_t)(hi2c->Mode); + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Disable Address Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Disable EVT and ERR interrupt */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Abort a master or memory I2C IT or DMA process communication with Interrupt. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress) +{ + /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ + HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; + + /* Prevent unused argument(s) compilation warning */ + UNUSED(DevAddress); + + /* Abort Master transfer during Receive or Transmit process */ + if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET) && ((CurrentMode == HAL_I2C_MODE_MASTER) || + (CurrentMode == HAL_I2C_MODE_MEM))) + { + /* Process Locked */ + __HAL_LOCK(hi2c); + + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_ABORT; + + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + + hi2c->XferCount = 0U; + + /* Disable EVT, BUF and ERR interrupt */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Call the corresponding callback to inform upper layer of End of Transfer */ + I2C_ITError(hi2c); + + return HAL_OK; + } + else + { + /* Wrong usage of abort function */ + /* This function should be used only in case of abort monitored by master device */ + /* Or periphal is not in busy state, mean there is no active sequence to be abort */ + return HAL_ERROR; + } +} + +/** + * @} + */ + +/** @defgroup I2C_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks + * @{ + */ + +/** + * @brief This function handles I2C event interrupt request. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval None + */ +void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c) +{ + uint32_t sr1itflags; + uint32_t sr2itflags = 0U; + uint32_t itsources = READ_REG(hi2c->Instance->CR2); + uint32_t CurrentXferOptions = hi2c->XferOptions; + HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; + HAL_I2C_StateTypeDef CurrentState = hi2c->State; + + /* Master or Memory mode selected */ + if ((CurrentMode == HAL_I2C_MODE_MASTER) || (CurrentMode == HAL_I2C_MODE_MEM)) + { + sr2itflags = READ_REG(hi2c->Instance->SR2); + sr1itflags = READ_REG(hi2c->Instance->SR1); + + /* Exit IRQ event until Start Bit detected in case of Other frame requested */ + if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_SB) == RESET) && (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(CurrentXferOptions) == 1U)) + { + return; + } + + /* SB Set ----------------------------------------------------------------*/ + if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_SB) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) + { + /* Convert OTHER_xxx XferOptions if any */ + I2C_ConvertOtherXferOptions(hi2c); + + I2C_Master_SB(hi2c); + } + /* ADD10 Set -------------------------------------------------------------*/ + else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ADD10) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) + { + I2C_Master_ADD10(hi2c); + } + /* ADDR Set --------------------------------------------------------------*/ + else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ADDR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) + { + I2C_Master_ADDR(hi2c); + } + /* I2C in mode Transmitter -----------------------------------------------*/ + else if (I2C_CHECK_FLAG(sr2itflags, I2C_FLAG_TRA) != RESET) + { + /* Do not check buffer and BTF flag if a Xfer DMA is on going */ + if (READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) != I2C_CR2_DMAEN) + { + /* TXE set and BTF reset -----------------------------------------------*/ + if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_TXE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET)) + { + I2C_MasterTransmit_TXE(hi2c); + } + /* BTF set -------------------------------------------------------------*/ + else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) + { + if (CurrentState == HAL_I2C_STATE_BUSY_TX) + { + I2C_MasterTransmit_BTF(hi2c); + } + else /* HAL_I2C_MODE_MEM */ + { + if (CurrentMode == HAL_I2C_MODE_MEM) + { + I2C_MemoryTransmit_TXE_BTF(hi2c); + } + } + } + else + { + /* Do nothing */ + } + } + } + /* I2C in mode Receiver --------------------------------------------------*/ + else + { + /* Do not check buffer and BTF flag if a Xfer DMA is on going */ + if (READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) != I2C_CR2_DMAEN) + { + /* RXNE set and BTF reset -----------------------------------------------*/ + if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_RXNE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET)) + { + I2C_MasterReceive_RXNE(hi2c); + } + /* BTF set -------------------------------------------------------------*/ + else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) + { + I2C_MasterReceive_BTF(hi2c); + } + else + { + /* Do nothing */ + } + } + } + } + /* Slave mode selected */ + else + { + /* If an error is detected, read only SR1 register to prevent */ + /* a clear of ADDR flags by reading SR2 after reading SR1 in Error treatment */ + if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE) + { + sr1itflags = READ_REG(hi2c->Instance->SR1); + } + else + { + sr2itflags = READ_REG(hi2c->Instance->SR2); + sr1itflags = READ_REG(hi2c->Instance->SR1); + } + + /* ADDR set --------------------------------------------------------------*/ + if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ADDR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) + { + /* Now time to read SR2, this will clear ADDR flag automatically */ + if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE) + { + sr2itflags = READ_REG(hi2c->Instance->SR2); + } + I2C_Slave_ADDR(hi2c, sr2itflags); + } + /* STOPF set --------------------------------------------------------------*/ + else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) + { + I2C_Slave_STOPF(hi2c); + } + /* I2C in mode Transmitter -----------------------------------------------*/ + else if ((CurrentState == HAL_I2C_STATE_BUSY_TX) || (CurrentState == HAL_I2C_STATE_BUSY_TX_LISTEN)) + { + /* TXE set and BTF reset -----------------------------------------------*/ + if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_TXE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET)) + { + I2C_SlaveTransmit_TXE(hi2c); + } + /* BTF set -------------------------------------------------------------*/ + else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) + { + I2C_SlaveTransmit_BTF(hi2c); + } + else + { + /* Do nothing */ + } + } + /* I2C in mode Receiver --------------------------------------------------*/ + else + { + /* RXNE set and BTF reset ----------------------------------------------*/ + if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_RXNE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET)) + { + I2C_SlaveReceive_RXNE(hi2c); + } + /* BTF set -------------------------------------------------------------*/ + else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET)) + { + I2C_SlaveReceive_BTF(hi2c); + } + else + { + /* Do nothing */ + } + } + } +} + +/** + * @brief This function handles I2C error interrupt request. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval None + */ +void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c) +{ + HAL_I2C_ModeTypeDef tmp1; + uint32_t tmp2; + HAL_I2C_StateTypeDef tmp3; + uint32_t tmp4; + uint32_t sr1itflags = READ_REG(hi2c->Instance->SR1); + uint32_t itsources = READ_REG(hi2c->Instance->CR2); + uint32_t error = HAL_I2C_ERROR_NONE; + HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; + + /* I2C Bus error interrupt occurred ----------------------------------------*/ + if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BERR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET)) + { + error |= HAL_I2C_ERROR_BERR; + + /* Clear BERR flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BERR); + } + + /* I2C Arbitration Lost error interrupt occurred ---------------------------*/ + if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ARLO) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET)) + { + error |= HAL_I2C_ERROR_ARLO; + + /* Clear ARLO flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ARLO); + } + + /* I2C Acknowledge failure error interrupt occurred ------------------------*/ + if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET)) + { + tmp1 = CurrentMode; + tmp2 = hi2c->XferCount; + tmp3 = hi2c->State; + tmp4 = hi2c->PreviousState; + if ((tmp1 == HAL_I2C_MODE_SLAVE) && (tmp2 == 0U) && \ + ((tmp3 == HAL_I2C_STATE_BUSY_TX) || (tmp3 == HAL_I2C_STATE_BUSY_TX_LISTEN) || \ + ((tmp3 == HAL_I2C_STATE_LISTEN) && (tmp4 == I2C_STATE_SLAVE_BUSY_TX)))) + { + I2C_Slave_AF(hi2c); + } + else + { + /* Clear AF flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + + error |= HAL_I2C_ERROR_AF; + + /* Do not generate a STOP in case of Slave receive non acknowledge during transfer (mean not at the end of transfer) */ + if ((CurrentMode == HAL_I2C_MODE_MASTER) || (CurrentMode == HAL_I2C_MODE_MEM)) + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + } + } + } + + /* I2C Over-Run/Under-Run interrupt occurred -------------------------------*/ + if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_OVR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET)) + { + error |= HAL_I2C_ERROR_OVR; + /* Clear OVR flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_OVR); + } + + /* Call the Error Callback in case of Error detected -----------------------*/ + if (error != HAL_I2C_ERROR_NONE) + { + hi2c->ErrorCode |= error; + I2C_ITError(hi2c); + } +} + +/** + * @brief Master Tx Transfer completed callback. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval None + */ +__weak void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hi2c); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_I2C_MasterTxCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Master Rx Transfer completed callback. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval None + */ +__weak void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hi2c); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_I2C_MasterRxCpltCallback could be implemented in the user file + */ +} + +/** @brief Slave Tx Transfer completed callback. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval None + */ +__weak void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hi2c); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_I2C_SlaveTxCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Slave Rx Transfer completed callback. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval None + */ +__weak void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hi2c); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_I2C_SlaveRxCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Slave Address Match callback. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param TransferDirection Master request Transfer Direction (Write/Read), value of @ref I2C_XferDirection_definition + * @param AddrMatchCode Address Match Code + * @retval None + */ +__weak void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hi2c); + UNUSED(TransferDirection); + UNUSED(AddrMatchCode); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_I2C_AddrCallback() could be implemented in the user file + */ +} + +/** + * @brief Listen Complete callback. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval None + */ +__weak void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hi2c); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_I2C_ListenCpltCallback() could be implemented in the user file + */ +} + +/** + * @brief Memory Tx Transfer completed callback. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval None + */ +__weak void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hi2c); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_I2C_MemTxCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Memory Rx Transfer completed callback. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval None + */ +__weak void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hi2c); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_I2C_MemRxCpltCallback could be implemented in the user file + */ +} + +/** + * @brief I2C error callback. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval None + */ +__weak void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hi2c); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_I2C_ErrorCallback could be implemented in the user file + */ +} + +/** + * @brief I2C abort callback. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval None + */ +__weak void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hi2c); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_I2C_AbortCpltCallback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** @defgroup I2C_Exported_Functions_Group3 Peripheral State, Mode and Error functions + * @brief Peripheral State, Mode and Error functions + * +@verbatim + =============================================================================== + ##### Peripheral State, Mode and Error functions ##### + =============================================================================== + [..] + This subsection permit to get in run-time the status of the peripheral + and the data flow. + +@endverbatim + * @{ + */ + +/** + * @brief Return the I2C handle state. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval HAL state + */ +HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c) +{ + /* Return I2C handle state */ + return hi2c->State; +} + +/** + * @brief Returns the I2C Master, Slave, Memory or no mode. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @retval HAL mode + */ +HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c) +{ + return hi2c->Mode; +} + +/** + * @brief Return the I2C error code. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval I2C Error Code + */ +uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c) +{ + return hi2c->ErrorCode; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup I2C_Private_Functions + * @{ + */ + +/** + * @brief Handle TXE flag for Master + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @retval None + */ +static void I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c) +{ + /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ + HAL_I2C_StateTypeDef CurrentState = hi2c->State; + HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; + uint32_t CurrentXferOptions = hi2c->XferOptions; + + if ((hi2c->XferSize == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX)) + { + /* Call TxCpltCallback() directly if no stop mode is set */ + if ((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) && (CurrentXferOptions != I2C_NO_OPTION_FRAME)) + { + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + + hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->MasterTxCpltCallback(hi2c); +#else + HAL_I2C_MasterTxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + else /* Generate Stop condition then Call TxCpltCallback() */ + { + /* Disable EVT, BUF and ERR interrupt */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + + if (hi2c->Mode == HAL_I2C_MODE_MEM) + { + hi2c->Mode = HAL_I2C_MODE_NONE; +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->MemTxCpltCallback(hi2c); +#else + HAL_I2C_MemTxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + else + { + hi2c->Mode = HAL_I2C_MODE_NONE; +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->MasterTxCpltCallback(hi2c); +#else + HAL_I2C_MasterTxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + } + } + else if ((CurrentState == HAL_I2C_STATE_BUSY_TX) || \ + ((CurrentMode == HAL_I2C_MODE_MEM) && (CurrentState == HAL_I2C_STATE_BUSY_RX))) + { + if (hi2c->XferCount == 0U) + { + /* Disable BUF interrupt */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); + } + else + { + if (hi2c->Mode == HAL_I2C_MODE_MEM) + { + I2C_MemoryTransmit_TXE_BTF(hi2c); + } + else + { + /* Write data to DR */ + hi2c->Instance->DR = *hi2c->pBuffPtr; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferCount--; + } + } + } + else + { + /* Do nothing */ + } +} + +/** + * @brief Handle BTF flag for Master transmitter + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @retval None + */ +static void I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c) +{ + /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ + uint32_t CurrentXferOptions = hi2c->XferOptions; + + if (hi2c->State == HAL_I2C_STATE_BUSY_TX) + { + if (hi2c->XferCount != 0U) + { + /* Write data to DR */ + hi2c->Instance->DR = *hi2c->pBuffPtr; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferCount--; + } + else + { + /* Call TxCpltCallback() directly if no stop mode is set */ + if ((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) && (CurrentXferOptions != I2C_NO_OPTION_FRAME)) + { + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + + hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->MasterTxCpltCallback(hi2c); +#else + HAL_I2C_MasterTxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + else /* Generate Stop condition then Call TxCpltCallback() */ + { + /* Disable EVT, BUF and ERR interrupt */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + if (hi2c->Mode == HAL_I2C_MODE_MEM) + { + hi2c->Mode = HAL_I2C_MODE_NONE; +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->MemTxCpltCallback(hi2c); +#else + HAL_I2C_MemTxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + else + { + hi2c->Mode = HAL_I2C_MODE_NONE; + +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->MasterTxCpltCallback(hi2c); +#else + HAL_I2C_MasterTxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + } + } + } + else + { + /* Do nothing */ + } +} + +/** + * @brief Handle TXE and BTF flag for Memory transmitter + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @retval None + */ +static void I2C_MemoryTransmit_TXE_BTF(I2C_HandleTypeDef *hi2c) +{ + /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ + HAL_I2C_StateTypeDef CurrentState = hi2c->State; + + if (hi2c->EventCount == 0U) + { + /* If Memory address size is 8Bit */ + if (hi2c->MemaddSize == I2C_MEMADD_SIZE_8BIT) + { + /* Send Memory Address */ + hi2c->Instance->DR = I2C_MEM_ADD_LSB(hi2c->Memaddress); + + hi2c->EventCount += 2U; + } + /* If Memory address size is 16Bit */ + else + { + /* Send MSB of Memory Address */ + hi2c->Instance->DR = I2C_MEM_ADD_MSB(hi2c->Memaddress); + + hi2c->EventCount++; + } + } + else if (hi2c->EventCount == 1U) + { + /* Send LSB of Memory Address */ + hi2c->Instance->DR = I2C_MEM_ADD_LSB(hi2c->Memaddress); + + hi2c->EventCount++; + } + else if (hi2c->EventCount == 2U) + { + if (CurrentState == HAL_I2C_STATE_BUSY_RX) + { + /* Generate Restart */ + hi2c->Instance->CR1 |= I2C_CR1_START; + + hi2c->EventCount++; + } + else if ((hi2c->XferCount > 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX)) + { + /* Write data to DR */ + hi2c->Instance->DR = *hi2c->pBuffPtr; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferCount--; + } + else if ((hi2c->XferCount == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX)) + { + /* Generate Stop condition then Call TxCpltCallback() */ + /* Disable EVT, BUF and ERR interrupt */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->MemTxCpltCallback(hi2c); +#else + HAL_I2C_MemTxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + else + { + /* Do nothing */ + } + } + else + { + /* Clear TXE and BTF flags */ + I2C_Flush_DR(hi2c); + } +} + +/** + * @brief Handle RXNE flag for Master + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @retval None + */ +static void I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c) +{ + if (hi2c->State == HAL_I2C_STATE_BUSY_RX) + { + uint32_t tmp; + uint32_t CurrentXferOptions; + + CurrentXferOptions = hi2c->XferOptions; + tmp = hi2c->XferCount; + if (tmp > 3U) + { + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferCount--; + + if (hi2c->XferCount == (uint16_t)3) + { + /* Disable BUF interrupt, this help to treat correctly the last 4 bytes + on BTF subroutine */ + /* Disable BUF interrupt */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); + } + } + else if ((hi2c->XferOptions != I2C_FIRST_AND_NEXT_FRAME) && ((tmp == 1U) || (tmp == 0U))) + { + if (I2C_WaitOnSTOPRequestThroughIT(hi2c) == HAL_OK) + { + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Disable EVT, BUF and ERR interrupt */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferCount--; + + hi2c->State = HAL_I2C_STATE_READY; + + if (hi2c->Mode == HAL_I2C_MODE_MEM) + { + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->PreviousState = I2C_STATE_NONE; + +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->MemRxCpltCallback(hi2c); +#else + HAL_I2C_MemRxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + else + { + hi2c->Mode = HAL_I2C_MODE_NONE; + if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) + { + hi2c->PreviousState = I2C_STATE_NONE; + } + else + { + hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; + } + +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->MasterRxCpltCallback(hi2c); +#else + HAL_I2C_MasterRxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + } + else + { + /* Disable EVT, BUF and ERR interrupt */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferCount--; + + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Call user error callback */ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->ErrorCallback(hi2c); +#else + HAL_I2C_ErrorCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + } + else + { + /* Disable BUF interrupt, this help to treat correctly the last 2 bytes + on BTF subroutine if there is a reception delay between N-1 and N byte */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); + } + } +} + +/** + * @brief Handle BTF flag for Master receiver + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @retval None + */ +static void I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c) +{ + /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ + uint32_t CurrentXferOptions = hi2c->XferOptions; + + if (hi2c->XferCount == 4U) + { + /* Disable BUF interrupt, this help to treat correctly the last 2 bytes + on BTF subroutine if there is a reception delay between N-1 and N byte */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); + + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferCount--; + } + else if (hi2c->XferCount == 3U) + { + /* Disable BUF interrupt, this help to treat correctly the last 2 bytes + on BTF subroutine if there is a reception delay between N-1 and N byte */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); + + if ((CurrentXferOptions != I2C_NEXT_FRAME) && (CurrentXferOptions != I2C_FIRST_AND_NEXT_FRAME)) + { + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + } + + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferCount--; + } + else if (hi2c->XferCount == 2U) + { + /* Prepare next transfer or stop current transfer */ + if ((CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME_NO_STOP)) + { + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + } + else if ((CurrentXferOptions == I2C_NEXT_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_NEXT_FRAME)) + { + /* Enable Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + } + else + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + } + + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferCount--; + + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferCount--; + + /* Disable EVT and ERR interrupt */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); + + hi2c->State = HAL_I2C_STATE_READY; + if (hi2c->Mode == HAL_I2C_MODE_MEM) + { + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->PreviousState = I2C_STATE_NONE; +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->MemRxCpltCallback(hi2c); +#else + HAL_I2C_MemRxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + else + { + hi2c->Mode = HAL_I2C_MODE_NONE; + if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) + { + hi2c->PreviousState = I2C_STATE_NONE; + } + else + { + hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; + } +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->MasterRxCpltCallback(hi2c); +#else + HAL_I2C_MasterRxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + } + else + { + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferCount--; + } +} + +/** + * @brief Handle SB flag for Master + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @retval None + */ +static void I2C_Master_SB(I2C_HandleTypeDef *hi2c) +{ + if (hi2c->Mode == HAL_I2C_MODE_MEM) + { + if (hi2c->EventCount == 0U) + { + /* Send slave address */ + hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(hi2c->Devaddress); + } + else + { + hi2c->Instance->DR = I2C_7BIT_ADD_READ(hi2c->Devaddress); + } + } + else + { + if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT) + { + /* Send slave 7 Bits address */ + if (hi2c->State == HAL_I2C_STATE_BUSY_TX) + { + hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(hi2c->Devaddress); + } + else + { + hi2c->Instance->DR = I2C_7BIT_ADD_READ(hi2c->Devaddress); + } + + if (((hi2c->hdmatx != NULL) && (hi2c->hdmatx->XferCpltCallback != NULL)) + || ((hi2c->hdmarx != NULL) && (hi2c->hdmarx->XferCpltCallback != NULL))) + { + /* Enable DMA Request */ + SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); + } + } + else + { + if (hi2c->EventCount == 0U) + { + /* Send header of slave address */ + hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(hi2c->Devaddress); + } + else if (hi2c->EventCount == 1U) + { + /* Send header of slave address */ + hi2c->Instance->DR = I2C_10BIT_HEADER_READ(hi2c->Devaddress); + } + else + { + /* Do nothing */ + } + } + } +} + +/** + * @brief Handle ADD10 flag for Master + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @retval None + */ +static void I2C_Master_ADD10(I2C_HandleTypeDef *hi2c) +{ + /* Send slave address */ + hi2c->Instance->DR = I2C_10BIT_ADDRESS(hi2c->Devaddress); + + if (((hi2c->hdmatx != NULL) && (hi2c->hdmatx->XferCpltCallback != NULL)) + || ((hi2c->hdmarx != NULL) && (hi2c->hdmarx->XferCpltCallback != NULL))) + { + /* Enable DMA Request */ + SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); + } +} + +/** + * @brief Handle ADDR flag for Master + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @retval None + */ +static void I2C_Master_ADDR(I2C_HandleTypeDef *hi2c) +{ + /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ + HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; + uint32_t CurrentXferOptions = hi2c->XferOptions; + uint32_t Prev_State = hi2c->PreviousState; + + if (hi2c->State == HAL_I2C_STATE_BUSY_RX) + { + if ((hi2c->EventCount == 0U) && (CurrentMode == HAL_I2C_MODE_MEM)) + { + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + } + else if ((hi2c->EventCount == 0U) && (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)) + { + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + /* Generate Restart */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + + hi2c->EventCount++; + } + else + { + if (hi2c->XferCount == 0U) + { + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + } + else if (hi2c->XferCount == 1U) + { + if (CurrentXferOptions == I2C_NO_OPTION_FRAME) + { + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) + { + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + } + else + { + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + } + } + /* Prepare next transfer or stop current transfer */ + else if ((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) \ + && ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (CurrentXferOptions == I2C_FIRST_FRAME))) + { + if ((CurrentXferOptions != I2C_NEXT_FRAME) && (CurrentXferOptions != I2C_FIRST_AND_NEXT_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME_NO_STOP)) + { + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + } + else + { + /* Enable Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + } + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + } + else + { + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + } + } + else if (hi2c->XferCount == 2U) + { + if ((CurrentXferOptions != I2C_NEXT_FRAME) && (CurrentXferOptions != I2C_FIRST_AND_NEXT_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME_NO_STOP)) + { + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Enable Pos */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS); + } + else + { + /* Enable Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + } + + if (((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) && ((CurrentXferOptions == I2C_NO_OPTION_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME_NO_STOP) || (CurrentXferOptions == I2C_LAST_FRAME))) + { + /* Enable Last DMA bit */ + SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); + } + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + } + else + { + /* Enable Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + if (((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) && ((CurrentXferOptions == I2C_NO_OPTION_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME_NO_STOP) || (CurrentXferOptions == I2C_LAST_FRAME))) + { + /* Enable Last DMA bit */ + SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); + } + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + } + + /* Reset Event counter */ + hi2c->EventCount = 0U; + } + } + else + { + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + } +} + +/** + * @brief Handle TXE flag for Slave + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @retval None + */ +static void I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c) +{ + /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ + HAL_I2C_StateTypeDef CurrentState = hi2c->State; + + if (hi2c->XferCount != 0U) + { + /* Write data to DR */ + hi2c->Instance->DR = *hi2c->pBuffPtr; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferCount--; + + if ((hi2c->XferCount == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_TX_LISTEN)) + { + /* Last Byte is received, disable Interrupt */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); + + /* Set state at HAL_I2C_STATE_LISTEN */ + hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX; + hi2c->State = HAL_I2C_STATE_LISTEN; + + /* Call the corresponding callback to inform upper layer of End of Transfer */ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->SlaveTxCpltCallback(hi2c); +#else + HAL_I2C_SlaveTxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + } +} + +/** + * @brief Handle BTF flag for Slave transmitter + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @retval None + */ +static void I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c) +{ + if (hi2c->XferCount != 0U) + { + /* Write data to DR */ + hi2c->Instance->DR = *hi2c->pBuffPtr; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferCount--; + } +} + +/** + * @brief Handle RXNE flag for Slave + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @retval None + */ +static void I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c) +{ + /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ + HAL_I2C_StateTypeDef CurrentState = hi2c->State; + + if (hi2c->XferCount != 0U) + { + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferCount--; + + if ((hi2c->XferCount == 0U) && (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN)) + { + /* Last Byte is received, disable Interrupt */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); + + /* Set state at HAL_I2C_STATE_LISTEN */ + hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX; + hi2c->State = HAL_I2C_STATE_LISTEN; + + /* Call the corresponding callback to inform upper layer of End of Transfer */ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->SlaveRxCpltCallback(hi2c); +#else + HAL_I2C_SlaveRxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + } +} + +/** + * @brief Handle BTF flag for Slave receiver + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @retval None + */ +static void I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c) +{ + if (hi2c->XferCount != 0U) + { + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferCount--; + } +} + +/** + * @brief Handle ADD flag for Slave + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @param IT2Flags Interrupt2 flags to handle. + * @retval None + */ +static void I2C_Slave_ADDR(I2C_HandleTypeDef *hi2c, uint32_t IT2Flags) +{ + uint8_t TransferDirection = I2C_DIRECTION_RECEIVE; + uint16_t SlaveAddrCode; + + if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) + { + /* Disable BUF interrupt, BUF enabling is manage through slave specific interface */ + __HAL_I2C_DISABLE_IT(hi2c, (I2C_IT_BUF)); + + /* Transfer Direction requested by Master */ + if (I2C_CHECK_FLAG(IT2Flags, I2C_FLAG_TRA) == RESET) + { + TransferDirection = I2C_DIRECTION_TRANSMIT; + } + + if (I2C_CHECK_FLAG(IT2Flags, I2C_FLAG_DUALF) == RESET) + { + SlaveAddrCode = (uint16_t)hi2c->Init.OwnAddress1; + } + else + { + SlaveAddrCode = (uint16_t)hi2c->Init.OwnAddress2; + } + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Call Slave Addr callback */ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->AddrCallback(hi2c, TransferDirection, SlaveAddrCode); +#else + HAL_I2C_AddrCallback(hi2c, TransferDirection, SlaveAddrCode); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + else + { + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + } +} + +/** + * @brief Handle STOPF flag for Slave + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @retval None + */ +static void I2C_Slave_STOPF(I2C_HandleTypeDef *hi2c) +{ + /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ + HAL_I2C_StateTypeDef CurrentState = hi2c->State; + + /* Disable EVT, BUF and ERR interrupt */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + + /* Clear STOPF flag */ + __HAL_I2C_CLEAR_STOPFLAG(hi2c); + + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* If a DMA is ongoing, Update handle size context */ + if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) + { + if ((CurrentState == HAL_I2C_STATE_BUSY_RX) || (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN)) + { + hi2c->XferCount = (uint16_t)(I2C_GET_DMA_REMAIN_DATA(hi2c->hdmarx)); + + if (hi2c->XferCount != 0U) + { + /* Set ErrorCode corresponding to a Non-Acknowledge */ + hi2c->ErrorCode |= HAL_I2C_ERROR_AF; + } + + /* Disable, stop the current DMA */ + CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); + + /* Abort DMA Xfer if any */ + if (HAL_DMA_GetState(hi2c->hdmarx) != HAL_DMA_STATE_READY) + { + /* Set the I2C DMA Abort callback : + will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ + hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort; + + /* Abort DMA RX */ + if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK) + { + /* Call Directly XferAbortCallback function in case of error */ + hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx); + } + } + } + else + { + hi2c->XferCount = (uint16_t)(I2C_GET_DMA_REMAIN_DATA(hi2c->hdmatx)); + + if (hi2c->XferCount != 0U) + { + /* Set ErrorCode corresponding to a Non-Acknowledge */ + hi2c->ErrorCode |= HAL_I2C_ERROR_AF; + } + + /* Disable, stop the current DMA */ + CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); + + /* Abort DMA Xfer if any */ + if (HAL_DMA_GetState(hi2c->hdmatx) != HAL_DMA_STATE_READY) + { + /* Set the I2C DMA Abort callback : + will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ + hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort; + + /* Abort DMA TX */ + if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK) + { + /* Call Directly XferAbortCallback function in case of error */ + hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx); + } + } + } + } + + /* All data are not transferred, so set error code accordingly */ + if (hi2c->XferCount != 0U) + { + /* Store Last receive data if any */ + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) + { + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferCount--; + } + + /* Store Last receive data if any */ + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) + { + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + /* Update counter */ + hi2c->XferCount--; + } + + if (hi2c->XferCount != 0U) + { + /* Set ErrorCode corresponding to a Non-Acknowledge */ + hi2c->ErrorCode |= HAL_I2C_ERROR_AF; + } + } + + if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE) + { + /* Call the corresponding callback to inform upper layer of End of Transfer */ + I2C_ITError(hi2c); + } + else + { + if (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN) + { + /* Set state at HAL_I2C_STATE_LISTEN */ + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_LISTEN; + + /* Call the corresponding callback to inform upper layer of End of Transfer */ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->SlaveRxCpltCallback(hi2c); +#else + HAL_I2C_SlaveRxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + + if (hi2c->State == HAL_I2C_STATE_LISTEN) + { + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->ListenCpltCallback(hi2c); +#else + HAL_I2C_ListenCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + else + { + if ((hi2c->PreviousState == I2C_STATE_SLAVE_BUSY_RX) || (CurrentState == HAL_I2C_STATE_BUSY_RX)) + { + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->SlaveRxCpltCallback(hi2c); +#else + HAL_I2C_SlaveRxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + } + } +} + +/** + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @retval None + */ +static void I2C_Slave_AF(I2C_HandleTypeDef *hi2c) +{ + /* Declaration of temporary variables to prevent undefined behavior of volatile usage */ + HAL_I2C_StateTypeDef CurrentState = hi2c->State; + uint32_t CurrentXferOptions = hi2c->XferOptions; + + if (((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) && \ + (CurrentState == HAL_I2C_STATE_LISTEN)) + { + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + + /* Disable EVT, BUF and ERR interrupt */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + + /* Clear AF flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->ListenCpltCallback(hi2c); +#else + HAL_I2C_ListenCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + else if (CurrentState == HAL_I2C_STATE_BUSY_TX) + { + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Disable EVT, BUF and ERR interrupt */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + + /* Clear AF flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Clear TXE flag */ + I2C_Flush_DR(hi2c); + +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->SlaveTxCpltCallback(hi2c); +#else + HAL_I2C_SlaveTxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + else + { + /* Clear AF flag only */ + /* State Listen, but XferOptions == FIRST or NEXT */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + } +} + +/** + * @brief I2C interrupts error process + * @param hi2c I2C handle. + * @retval None + */ +static void I2C_ITError(I2C_HandleTypeDef *hi2c) +{ + /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ + HAL_I2C_StateTypeDef CurrentState = hi2c->State; + HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; + uint32_t CurrentError; + + if (((CurrentMode == HAL_I2C_MODE_MASTER) || (CurrentMode == HAL_I2C_MODE_MEM)) && (CurrentState == HAL_I2C_STATE_BUSY_RX)) + { + /* Disable Pos bit in I2C CR1 when error occurred in Master/Mem Receive IT Process */ + hi2c->Instance->CR1 &= ~I2C_CR1_POS; + } + + if (((uint32_t)CurrentState & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) + { + /* keep HAL_I2C_STATE_LISTEN */ + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_LISTEN; + } + else + { + /* If state is an abort treatment on going, don't change state */ + /* This change will be do later */ + if ((READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) != I2C_CR2_DMAEN) && (CurrentState != HAL_I2C_STATE_ABORT)) + { + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + } + hi2c->PreviousState = I2C_STATE_NONE; + } + + /* Abort DMA transfer */ + if (READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) == I2C_CR2_DMAEN) + { + hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN; + + if (hi2c->hdmatx->State != HAL_DMA_STATE_READY) + { + /* Set the DMA Abort callback : + will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ + hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort; + + if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK) + { + /* Disable I2C peripheral to prevent dummy data in buffer */ + __HAL_I2C_DISABLE(hi2c); + + hi2c->State = HAL_I2C_STATE_READY; + + /* Call Directly XferAbortCallback function in case of error */ + hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx); + } + } + else + { + /* Set the DMA Abort callback : + will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ + hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort; + + if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK) + { + /* Store Last receive data if any */ + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) + { + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + } + + /* Disable I2C peripheral to prevent dummy data in buffer */ + __HAL_I2C_DISABLE(hi2c); + + hi2c->State = HAL_I2C_STATE_READY; + + /* Call Directly hi2c->hdmarx->XferAbortCallback function in case of error */ + hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx); + } + } + } + else if (hi2c->State == HAL_I2C_STATE_ABORT) + { + hi2c->State = HAL_I2C_STATE_READY; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Store Last receive data if any */ + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) + { + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + } + + /* Disable I2C peripheral to prevent dummy data in buffer */ + __HAL_I2C_DISABLE(hi2c); + + /* Call the corresponding callback to inform upper layer of End of Transfer */ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->AbortCpltCallback(hi2c); +#else + HAL_I2C_AbortCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + else + { + /* Store Last receive data if any */ + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) + { + /* Read data from DR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + } + + /* Call user error callback */ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->ErrorCallback(hi2c); +#else + HAL_I2C_ErrorCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + + /* STOP Flag is not set after a NACK reception, BusError, ArbitrationLost, OverRun */ + CurrentError = hi2c->ErrorCode; + + if (((CurrentError & HAL_I2C_ERROR_BERR) == HAL_I2C_ERROR_BERR) || \ + ((CurrentError & HAL_I2C_ERROR_ARLO) == HAL_I2C_ERROR_ARLO) || \ + ((CurrentError & HAL_I2C_ERROR_AF) == HAL_I2C_ERROR_AF) || \ + ((CurrentError & HAL_I2C_ERROR_OVR) == HAL_I2C_ERROR_OVR)) + { + /* Disable EVT, BUF and ERR interrupt */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); + } + + /* So may inform upper layer that listen phase is stopped */ + /* during NACK error treatment */ + CurrentState = hi2c->State; + if (((hi2c->ErrorCode & HAL_I2C_ERROR_AF) == HAL_I2C_ERROR_AF) && (CurrentState == HAL_I2C_STATE_LISTEN)) + { + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->ListenCpltCallback(hi2c); +#else + HAL_I2C_ListenCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } +} + +/** + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param Timeout Timeout duration + * @param Tickstart Tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart) +{ + /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ + uint32_t CurrentXferOptions = hi2c->XferOptions; + + /* Generate Start condition if first transfer */ + if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_NO_OPTION_FRAME)) + { + /* Generate Start */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + } + else if (hi2c->PreviousState == I2C_STATE_MASTER_BUSY_RX) + { + /* Generate ReStart */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + } + else + { + /* Do nothing */ + } + + /* Wait until SB flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) + { + if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) + { + hi2c->ErrorCode = HAL_I2C_WRONG_START; + } + return HAL_TIMEOUT; + } + + if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT) + { + /* Send slave address */ + hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress); + } + else + { + /* Send header of slave address */ + hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress); + + /* Wait until ADD10 flag is set */ + if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout, Tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Send slave address */ + hi2c->Instance->DR = I2C_10BIT_ADDRESS(DevAddress); + } + + /* Wait until ADDR flag is set */ + if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + return HAL_OK; +} + +/** + * @brief Master sends target device address for read request. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param Timeout Timeout duration + * @param Tickstart Tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart) +{ + /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ + uint32_t CurrentXferOptions = hi2c->XferOptions; + + /* Enable Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Generate Start condition if first transfer */ + if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_NO_OPTION_FRAME)) + { + /* Generate Start */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + } + else if (hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX) + { + /* Generate ReStart */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + } + else + { + /* Do nothing */ + } + + /* Wait until SB flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) + { + if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) + { + hi2c->ErrorCode = HAL_I2C_WRONG_START; + } + return HAL_TIMEOUT; + } + + if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT) + { + /* Send slave address */ + hi2c->Instance->DR = I2C_7BIT_ADD_READ(DevAddress); + } + else + { + /* Send header of slave address */ + hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress); + + /* Wait until ADD10 flag is set */ + if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout, Tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Send slave address */ + hi2c->Instance->DR = I2C_10BIT_ADDRESS(DevAddress); + + /* Wait until ADDR flag is set */ + if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + /* Generate Restart */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + + /* Wait until SB flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) + { + if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) + { + hi2c->ErrorCode = HAL_I2C_WRONG_START; + } + return HAL_TIMEOUT; + } + + /* Send header of slave address */ + hi2c->Instance->DR = I2C_10BIT_HEADER_READ(DevAddress); + } + + /* Wait until ADDR flag is set */ + if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + return HAL_OK; +} + +/** + * @brief Master sends target device address followed by internal memory address for write request. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param MemAddress Internal memory address + * @param MemAddSize Size of internal memory address + * @param Timeout Timeout duration + * @param Tickstart Tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart) +{ + /* Generate Start */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + + /* Wait until SB flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) + { + if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) + { + hi2c->ErrorCode = HAL_I2C_WRONG_START; + } + return HAL_TIMEOUT; + } + + /* Send slave address */ + hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress); + + /* Wait until ADDR flag is set */ + if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + /* Wait until TXE flag is set */ + if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) + { + if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + } + return HAL_ERROR; + } + + /* If Memory address size is 8Bit */ + if (MemAddSize == I2C_MEMADD_SIZE_8BIT) + { + /* Send Memory Address */ + hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); + } + /* If Memory address size is 16Bit */ + else + { + /* Send MSB of Memory Address */ + hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress); + + /* Wait until TXE flag is set */ + if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) + { + if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + } + return HAL_ERROR; + } + + /* Send LSB of Memory Address */ + hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); + } + + return HAL_OK; +} + +/** + * @brief Master sends target device address followed by internal memory address for read request. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @param DevAddress Target device address: The device 7 bits address value + * in datasheet must be shifted to the left before calling the interface + * @param MemAddress Internal memory address + * @param MemAddSize Size of internal memory address + * @param Timeout Timeout duration + * @param Tickstart Tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart) +{ + /* Enable Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* Generate Start */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + + /* Wait until SB flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) + { + if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) + { + hi2c->ErrorCode = HAL_I2C_WRONG_START; + } + return HAL_TIMEOUT; + } + + /* Send slave address */ + hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress); + + /* Wait until ADDR flag is set */ + if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_ADDRFLAG(hi2c); + + /* Wait until TXE flag is set */ + if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) + { + if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + } + return HAL_ERROR; + } + + /* If Memory address size is 8Bit */ + if (MemAddSize == I2C_MEMADD_SIZE_8BIT) + { + /* Send Memory Address */ + hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); + } + /* If Memory address size is 16Bit */ + else + { + /* Send MSB of Memory Address */ + hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress); + + /* Wait until TXE flag is set */ + if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) + { + if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + } + return HAL_ERROR; + } + + /* Send LSB of Memory Address */ + hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); + } + + /* Wait until TXE flag is set */ + if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) + { + if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + } + return HAL_ERROR; + } + + /* Generate Restart */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); + + /* Wait until SB flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK) + { + if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START) + { + hi2c->ErrorCode = HAL_I2C_WRONG_START; + } + return HAL_TIMEOUT; + } + + /* Send slave address */ + hi2c->Instance->DR = I2C_7BIT_ADD_READ(DevAddress); + + /* Wait until ADDR flag is set */ + if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + return HAL_OK; +} + +/** + * @brief DMA I2C process complete callback. + * @param hdma DMA handle + * @retval None + */ +static void I2C_DMAXferCplt(DMA_HandleTypeDef *hdma) +{ + I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; /* Derogation MISRAC2012-Rule-11.5 */ + + /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ + HAL_I2C_StateTypeDef CurrentState = hi2c->State; + HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode; + uint32_t CurrentXferOptions = hi2c->XferOptions; + + /* Disable EVT and ERR interrupt */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); + + /* Clear Complete callback */ + if (hi2c->hdmatx != NULL) + { + hi2c->hdmatx->XferCpltCallback = NULL; + } + if (hi2c->hdmarx != NULL) + { + hi2c->hdmarx->XferCpltCallback = NULL; + } + + if ((((uint32_t)CurrentState & (uint32_t)HAL_I2C_STATE_BUSY_TX) == (uint32_t)HAL_I2C_STATE_BUSY_TX) || ((((uint32_t)CurrentState & (uint32_t)HAL_I2C_STATE_BUSY_RX) == (uint32_t)HAL_I2C_STATE_BUSY_RX) && (CurrentMode == HAL_I2C_MODE_SLAVE))) + { + /* Disable DMA Request */ + CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); + + hi2c->XferCount = 0U; + + if (CurrentState == HAL_I2C_STATE_BUSY_TX_LISTEN) + { + /* Set state at HAL_I2C_STATE_LISTEN */ + hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX; + hi2c->State = HAL_I2C_STATE_LISTEN; + + /* Call the corresponding callback to inform upper layer of End of Transfer */ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->SlaveTxCpltCallback(hi2c); +#else + HAL_I2C_SlaveTxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + else if (CurrentState == HAL_I2C_STATE_BUSY_RX_LISTEN) + { + /* Set state at HAL_I2C_STATE_LISTEN */ + hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX; + hi2c->State = HAL_I2C_STATE_LISTEN; + + /* Call the corresponding callback to inform upper layer of End of Transfer */ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->SlaveRxCpltCallback(hi2c); +#else + HAL_I2C_SlaveRxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + else + { + /* Do nothing */ + } + + /* Enable EVT and ERR interrupt to treat end of transfer in IRQ handler */ + __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); + } + /* Check current Mode, in case of treatment DMA handler have been preempted by a prior interrupt */ + else if (hi2c->Mode != HAL_I2C_MODE_NONE) + { + if (hi2c->XferCount == (uint16_t)1) + { + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + } + + /* Disable EVT and ERR interrupt */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); + + /* Prepare next transfer or stop current transfer */ + if ((CurrentXferOptions == I2C_NO_OPTION_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_OTHER_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + } + + /* Disable Last DMA */ + CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_LAST); + + /* Disable DMA Request */ + CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN); + + hi2c->XferCount = 0U; + + /* Check if Errors has been detected during transfer */ + if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE) + { +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->ErrorCallback(hi2c); +#else + HAL_I2C_ErrorCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + else + { + hi2c->State = HAL_I2C_STATE_READY; + + if (hi2c->Mode == HAL_I2C_MODE_MEM) + { + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->PreviousState = I2C_STATE_NONE; + +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->MemRxCpltCallback(hi2c); +#else + HAL_I2C_MemRxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + else + { + hi2c->Mode = HAL_I2C_MODE_NONE; + if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) + { + hi2c->PreviousState = I2C_STATE_NONE; + } + else + { + hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; + } + +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->MasterRxCpltCallback(hi2c); +#else + HAL_I2C_MasterRxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + } + } + else + { + /* Do nothing */ + } +} + +/** + * @brief DMA I2C communication error callback. + * @param hdma DMA handle + * @retval None + */ +static void I2C_DMAError(DMA_HandleTypeDef *hdma) +{ + I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; /* Derogation MISRAC2012-Rule-11.5 */ + + /* Clear Complete callback */ + if (hi2c->hdmatx != NULL) + { + hi2c->hdmatx->XferCpltCallback = NULL; + } + if (hi2c->hdmarx != NULL) + { + hi2c->hdmarx->XferCpltCallback = NULL; + } + + /* Ignore DMA FIFO error */ + if (HAL_DMA_GetError(hdma) != HAL_DMA_ERROR_FE) + { + /* Disable Acknowledge */ + hi2c->Instance->CR1 &= ~I2C_CR1_ACK; + + hi2c->XferCount = 0U; + + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; + +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->ErrorCallback(hi2c); +#else + HAL_I2C_ErrorCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } +} + +/** + * @brief DMA I2C communication abort callback + * (To be called at end of DMA Abort procedure). + * @param hdma DMA handle. + * @retval None + */ +static void I2C_DMAAbort(DMA_HandleTypeDef *hdma) +{ + __IO uint32_t count = 0U; + I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; /* Derogation MISRAC2012-Rule-11.5 */ + + /* Declaration of temporary variable to prevent undefined behavior of volatile usage */ + HAL_I2C_StateTypeDef CurrentState = hi2c->State; + + /* During abort treatment, check that there is no pending STOP request */ + /* Wait until STOP flag is reset */ + count = I2C_TIMEOUT_FLAG * (SystemCoreClock / 25U / 1000U); + do + { + if (count == 0U) + { + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + break; + } + count--; + } + while (READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP); + + /* Clear Complete callback */ + if (hi2c->hdmatx != NULL) + { + hi2c->hdmatx->XferCpltCallback = NULL; + } + if (hi2c->hdmarx != NULL) + { + hi2c->hdmarx->XferCpltCallback = NULL; + } + + /* Disable Acknowledge */ + CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + hi2c->XferCount = 0U; + + /* Reset XferAbortCallback */ + if (hi2c->hdmatx != NULL) + { + hi2c->hdmatx->XferAbortCallback = NULL; + } + if (hi2c->hdmarx != NULL) + { + hi2c->hdmarx->XferAbortCallback = NULL; + } + + /* Disable I2C peripheral to prevent dummy data in buffer */ + __HAL_I2C_DISABLE(hi2c); + + /* Check if come from abort from user */ + if (hi2c->State == HAL_I2C_STATE_ABORT) + { + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Call the corresponding callback to inform upper layer of End of Transfer */ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->AbortCpltCallback(hi2c); +#else + HAL_I2C_AbortCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + else + { + if (((uint32_t)CurrentState & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) + { + /* Renable I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + + /* Enable Acknowledge */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK); + + /* keep HAL_I2C_STATE_LISTEN */ + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_LISTEN; + } + else + { + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + } + + /* Call the corresponding callback to inform upper layer of End of Transfer */ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->ErrorCallback(hi2c); +#else + HAL_I2C_ErrorCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } +} + +/** + * @brief This function handles I2C Communication Timeout. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @param Flag specifies the I2C flag to check. + * @param Status The new Flag status (SET or RESET). + * @param Timeout Timeout duration + * @param Tickstart Tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart) +{ + /* Wait until flag is set */ + while (__HAL_I2C_GET_FLAG(hi2c, Flag) == Status) + { + /* Check for the Timeout */ + if (Timeout != HAL_MAX_DELAY) + { + if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) + { + if ((__HAL_I2C_GET_FLAG(hi2c, Flag) == Status)) + { + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + } + } + } + return HAL_OK; +} + +/** + * @brief This function handles I2C Communication Timeout for Master addressing phase. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @param Flag specifies the I2C flag to check. + * @param Timeout Timeout duration + * @param Tickstart Tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout, uint32_t Tickstart) +{ + while (__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET) + { + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET) + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP); + + /* Clear AF Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->ErrorCode |= HAL_I2C_ERROR_AF; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + + /* Check for the Timeout */ + if (Timeout != HAL_MAX_DELAY) + { + if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) + { + if ((__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET)) + { + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + } + } + } + return HAL_OK; +} + +/** + * @brief This function handles I2C Communication Timeout for specific usage of TXE flag. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param Timeout Timeout duration + * @param Tickstart Tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef I2C_WaitOnTXEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart) +{ + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) == RESET) + { + /* Check if a NACK is detected */ + if (I2C_IsAcknowledgeFailed(hi2c) != HAL_OK) + { + return HAL_ERROR; + } + + /* Check for the Timeout */ + if (Timeout != HAL_MAX_DELAY) + { + if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) + { + if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) == RESET)) + { + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + } + } + } + return HAL_OK; +} + +/** + * @brief This function handles I2C Communication Timeout for specific usage of BTF flag. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param Timeout Timeout duration + * @param Tickstart Tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef I2C_WaitOnBTFFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart) +{ + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == RESET) + { + /* Check if a NACK is detected */ + if (I2C_IsAcknowledgeFailed(hi2c) != HAL_OK) + { + return HAL_ERROR; + } + + /* Check for the Timeout */ + if (Timeout != HAL_MAX_DELAY) + { + if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) + { + if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == RESET)) + { + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + } + } + } + return HAL_OK; +} + +/** + * @brief This function handles I2C Communication Timeout for specific usage of STOP flag. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param Timeout Timeout duration + * @param Tickstart Tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart) +{ + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET) + { + /* Check if a NACK is detected */ + if (I2C_IsAcknowledgeFailed(hi2c) != HAL_OK) + { + return HAL_ERROR; + } + + /* Check for the Timeout */ + if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) + { + if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET)) + { + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + } + } + return HAL_OK; +} + +/** + * @brief This function handles I2C Communication Timeout for specific usage of STOP request through Interrupt. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval HAL status + */ +static HAL_StatusTypeDef I2C_WaitOnSTOPRequestThroughIT(I2C_HandleTypeDef *hi2c) +{ + __IO uint32_t count = 0U; + + /* Wait until STOP flag is reset */ + count = I2C_TIMEOUT_STOP_FLAG * (SystemCoreClock / 25U / 1000U); + do + { + count--; + if (count == 0U) + { + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + + return HAL_ERROR; + } + } + while (READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP); + + return HAL_OK; +} + +/** + * @brief This function handles I2C Communication Timeout for specific usage of RXNE flag. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param Timeout Timeout duration + * @param Tickstart Tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart) +{ + + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET) + { + /* Check if a STOPF is detected */ + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET) + { + /* Clear STOP Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); + + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->ErrorCode |= HAL_I2C_ERROR_NONE; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + + /* Check for the Timeout */ + if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) + { + if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET)) + { + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + } + } + return HAL_OK; +} + +/** + * @brief This function handles Acknowledge failed detection during an I2C Communication. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval HAL status + */ +static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c) +{ + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET) + { + /* Clear NACKF Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->ErrorCode |= HAL_I2C_ERROR_AF; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + return HAL_OK; +} + +/** + * @brief Convert I2Cx OTHER_xxx XferOptions to functional XferOptions. + * @param hi2c I2C handle. + * @retval None + */ +static void I2C_ConvertOtherXferOptions(I2C_HandleTypeDef *hi2c) +{ + /* if user set XferOptions to I2C_OTHER_FRAME */ + /* it request implicitly to generate a restart condition */ + /* set XferOptions to I2C_FIRST_FRAME */ + if (hi2c->XferOptions == I2C_OTHER_FRAME) + { + hi2c->XferOptions = I2C_FIRST_FRAME; + } + /* else if user set XferOptions to I2C_OTHER_AND_LAST_FRAME */ + /* it request implicitly to generate a restart condition */ + /* then generate a stop condition at the end of transfer */ + /* set XferOptions to I2C_FIRST_AND_LAST_FRAME */ + else if (hi2c->XferOptions == I2C_OTHER_AND_LAST_FRAME) + { + hi2c->XferOptions = I2C_FIRST_AND_LAST_FRAME; + } + else + { + /* Nothing to do */ + } +} + +/** + * @} + */ + +#endif /* HAL_I2C_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + diff --git a/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c new file mode 100644 index 0000000..64aabaa --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c @@ -0,0 +1,182 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_i2c_ex.c + * @author MCD Application Team + * @brief I2C Extension HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of I2C extension peripheral: + * + Extension features functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### I2C peripheral extension features ##### + ============================================================================== + + [..] Comparing to other previous devices, the I2C interface for STM32F427xx/437xx/ + 429xx/439xx devices contains the following additional features : + + (+) Possibility to disable or enable Analog Noise Filter + (+) Use of a configured Digital Noise Filter + + ##### How to use this driver ##### + ============================================================================== + [..] This driver provides functions to configure Noise Filter + (#) Configure I2C Analog noise filter using the function HAL_I2C_AnalogFilter_Config() + (#) Configure I2C Digital noise filter using the function HAL_I2C_DigitalFilter_Config() + + @endverbatim + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup I2CEx I2CEx + * @brief I2C HAL module driver + * @{ + */ + +#ifdef HAL_I2C_MODULE_ENABLED + +#if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF) +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ +/** @defgroup I2CEx_Exported_Functions I2C Exported Functions + * @{ + */ + + +/** @defgroup I2CEx_Exported_Functions_Group1 Extension features functions + * @brief Extension features functions + * +@verbatim + =============================================================================== + ##### Extension features functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Configure Noise Filters + +@endverbatim + * @{ + */ + +/** + * @brief Configures I2C Analog noise filter. + * @param hi2c pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2Cx peripheral. + * @param AnalogFilter new state of the Analog filter. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2CEx_ConfigAnalogFilter(I2C_HandleTypeDef *hi2c, uint32_t AnalogFilter) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); + assert_param(IS_I2C_ANALOG_FILTER(AnalogFilter)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + hi2c->State = HAL_I2C_STATE_BUSY; + + /* Disable the selected I2C peripheral */ + __HAL_I2C_DISABLE(hi2c); + + /* Reset I2Cx ANOFF bit */ + hi2c->Instance->FLTR &= ~(I2C_FLTR_ANOFF); + + /* Disable the analog filter */ + hi2c->Instance->FLTR |= AnalogFilter; + + __HAL_I2C_ENABLE(hi2c); + + hi2c->State = HAL_I2C_STATE_READY; + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Configures I2C Digital noise filter. + * @param hi2c pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2Cx peripheral. + * @param DigitalFilter Coefficient of digital noise filter between 0x00 and 0x0F. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2CEx_ConfigDigitalFilter(I2C_HandleTypeDef *hi2c, uint32_t DigitalFilter) +{ + uint16_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); + assert_param(IS_I2C_DIGITAL_FILTER(DigitalFilter)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + hi2c->State = HAL_I2C_STATE_BUSY; + + /* Disable the selected I2C peripheral */ + __HAL_I2C_DISABLE(hi2c); + + /* Get the old register value */ + tmpreg = hi2c->Instance->FLTR; + + /* Reset I2Cx DNF bit [3:0] */ + tmpreg &= ~(I2C_FLTR_DNF); + + /* Set I2Cx DNF coefficient */ + tmpreg |= DigitalFilter; + + /* Store the new register value */ + hi2c->Instance->FLTR = tmpreg; + + __HAL_I2C_ENABLE(hi2c); + + hi2c->State = HAL_I2C_STATE_READY; + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @} + */ + +/** + * @} + */ +#endif + +#endif /* HAL_I2C_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + diff --git a/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c new file mode 100644 index 0000000..5ccde64 --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c @@ -0,0 +1,598 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_pwr.c + * @author MCD Application Team + * @brief PWR HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Power Controller (PWR) peripheral: + * + Initialization and de-initialization functions + * + Peripheral Control functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup PWR PWR + * @brief PWR HAL module driver + * @{ + */ + +#ifdef HAL_PWR_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup PWR_Private_Constants + * @{ + */ + +/** @defgroup PWR_PVD_Mode_Mask PWR PVD Mode Mask + * @{ + */ +#define PVD_MODE_IT 0x00010000U +#define PVD_MODE_EVT 0x00020000U +#define PVD_RISING_EDGE 0x00000001U +#define PVD_FALLING_EDGE 0x00000002U +/** + * @} + */ + +/** + * @} + */ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup PWR_Exported_Functions PWR Exported Functions + * @{ + */ + +/** @defgroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and de-initialization functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] + After reset, the backup domain (RTC registers, RTC backup data + registers and backup SRAM) is protected against possible unwanted + write accesses. + To enable access to the RTC Domain and RTC registers, proceed as follows: + (+) Enable the Power Controller (PWR) APB1 interface clock using the + __HAL_RCC_PWR_CLK_ENABLE() macro. + (+) Enable access to RTC domain using the HAL_PWR_EnableBkUpAccess() function. + +@endverbatim + * @{ + */ + +/** + * @brief Deinitializes the HAL PWR peripheral registers to their default reset values. + * @retval None + */ +void HAL_PWR_DeInit(void) +{ + __HAL_RCC_PWR_FORCE_RESET(); + __HAL_RCC_PWR_RELEASE_RESET(); +} + +/** + * @brief Enables access to the backup domain (RTC registers, RTC + * backup data registers and backup SRAM). + * @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the + * Backup Domain Access should be kept enabled. + * @note The following sequence is required to bypass the delay between + * DBP bit programming and the effective enabling of the backup domain. + * Please check the Errata Sheet for more details under "Possible delay + * in backup domain protection disabling/enabling after programming the + * DBP bit" section. + * @retval None + */ +void HAL_PWR_EnableBkUpAccess(void) +{ + __IO uint32_t dummyread; + *(__IO uint32_t *) CR_DBP_BB = (uint32_t)ENABLE; + dummyread = PWR->CR; + UNUSED(dummyread); +} + +/** + * @brief Disables access to the backup domain (RTC registers, RTC + * backup data registers and backup SRAM). + * @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the + * Backup Domain Access should be kept enabled. + * @note The following sequence is required to bypass the delay between + * DBP bit programming and the effective disabling of the backup domain. + * Please check the Errata Sheet for more details under "Possible delay + * in backup domain protection disabling/enabling after programming the + * DBP bit" section. + * @retval None + */ +void HAL_PWR_DisableBkUpAccess(void) +{ + __IO uint32_t dummyread; + *(__IO uint32_t *) CR_DBP_BB = (uint32_t)DISABLE; + dummyread = PWR->CR; + UNUSED(dummyread); +} + +/** + * @} + */ + +/** @defgroup PWR_Exported_Functions_Group2 Peripheral Control functions + * @brief Low Power modes configuration functions + * +@verbatim + + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + + *** PVD configuration *** + ========================= + [..] + (+) The PVD is used to monitor the VDD power supply by comparing it to a + threshold selected by the PVD Level (PLS[2:0] bits in the PWR_CR). + (+) A PVDO flag is available to indicate if VDD/VDDA is higher or lower + than the PVD threshold. This event is internally connected to the EXTI + line16 and can generate an interrupt if enabled. This is done through + __HAL_PWR_PVD_EXTI_ENABLE_IT() macro. + (+) The PVD is stopped in Standby mode. + + *** Wake-up pin configuration *** + ================================ + [..] + (+) Wake-up pin is used to wake up the system from Standby mode. This pin is + forced in input pull-down configuration and is active on rising edges. + (+) There is one Wake-up pin: Wake-up Pin 1 on PA.00. + (++) For STM32F446xx there are two Wake-Up pins: Pin1 on PA.00 and Pin2 on PC.13 + (++) For STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx there are three Wake-Up pins: Pin1 on PA.00, Pin2 on PC.00 and Pin3 on PC.01 + + *** Low Power modes configuration *** + ===================================== + [..] + The devices feature 3 low-power modes: + (+) Sleep mode: Cortex-M4 core stopped, peripherals kept running. + (+) Stop mode: all clocks are stopped, regulator running, regulator + in low power mode + (+) Standby mode: 1.2V domain powered off. + + *** Sleep mode *** + ================== + [..] + (+) Entry: + The Sleep mode is entered by using the HAL_PWR_EnterSLEEPMode(Regulator, SLEEPEntry) + functions with + (++) PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction + (++) PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction + (++) PWR_SLEEPENTRY_WFE_NO_EVT_CLEAR: Enter SLEEP mode with WFE instruction and + no clear of pending event before. + + -@@- The Regulator parameter is not used for the STM32F4 family + and is kept as parameter just to maintain compatibility with the + lower power families (STM32L). + (+) Exit: + Any peripheral interrupt acknowledged by the nested vectored interrupt + controller (NVIC) can wake up the device from Sleep mode. + + *** Stop mode *** + ================= + [..] + In Stop mode, all clocks in the 1.2V domain are stopped, the PLL, the HSI, + and the HSE RC oscillators are disabled. Internal SRAM and register contents + are preserved. + The voltage regulator can be configured either in normal or low-power mode. + To minimize the consumption In Stop mode, FLASH can be powered off before + entering the Stop mode using the HAL_PWREx_EnableFlashPowerDown() function. + It can be switched on again by software after exiting the Stop mode using + the HAL_PWREx_DisableFlashPowerDown() function. + + (+) Entry: + The Stop mode is entered using the HAL_PWR_EnterSTOPMode(Regulator, STOPEntry) + function with: + (++) Regulator: + (+++) Main regulator ON. + (+++) Low Power regulator ON. + (++) STOPEntry: + (+++) PWR_STOPENTRY_WFI : Enter STOP mode with WFI instruction. + (+++) PWR_STOPENTRY_WFE : Enter STOP mode with WFE instruction and + clear of pending events before. + (+++) PWR_STOPENTRY_WFE_NO_EVT_CLEAR : Enter STOP mode with WFE instruction and + no clear of pending event before. + (+) Exit: + Any EXTI Line (Internal or External) configured in Interrupt/Event mode. + + *** Standby mode *** + ==================== + [..] + (+) + The Standby mode allows to achieve the lowest power consumption. It is based + on the Cortex-M4 deep sleep mode, with the voltage regulator disabled. + The 1.2V domain is consequently powered off. The PLL, the HSI oscillator and + the HSE oscillator are also switched off. SRAM and register contents are lost + except for the RTC registers, RTC backup registers, backup SRAM and Standby + circuitry. + + The voltage regulator is OFF. + + (++) Entry: + (+++) The Standby mode is entered using the HAL_PWR_EnterSTANDBYMode() function. + (++) Exit: + (+++) WKUP pin rising edge, RTC alarm (Alarm A and Alarm B), RTC wake-up, + tamper event, time-stamp event, external reset in NRST pin, IWDG reset. + + *** Auto-wake-up (AWU) from low-power mode *** + ============================================= + [..] + + (+) The MCU can be woken up from low-power mode by an RTC Alarm event, an RTC + Wake-up event, a tamper event or a time-stamp event, without depending on + an external interrupt (Auto-wake-up mode). + + (+) RTC auto-wake-up (AWU) from the Stop and Standby modes + + (++) To wake up from the Stop mode with an RTC alarm event, it is necessary to + configure the RTC to generate the RTC alarm using the HAL_RTC_SetAlarm_IT() function. + + (++) To wake up from the Stop mode with an RTC Tamper or time stamp event, it + is necessary to configure the RTC to detect the tamper or time stamp event using the + HAL_RTCEx_SetTimeStamp_IT() or HAL_RTCEx_SetTamper_IT() functions. + + (++) To wake up from the Stop mode with an RTC Wake-up event, it is necessary to + configure the RTC to generate the RTC Wake-up event using the HAL_RTCEx_SetWakeUpTimer_IT() function. + +@endverbatim + * @{ + */ + +/** + * @brief Configures the voltage threshold detected by the Power Voltage Detector(PVD). + * @param sConfigPVD pointer to an PWR_PVDTypeDef structure that contains the configuration + * information for the PVD. + * @note Refer to the electrical characteristics of your device datasheet for + * more details about the voltage threshold corresponding to each + * detection level. + * @retval None + */ +void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD) +{ + /* Check the parameters */ + assert_param(IS_PWR_PVD_LEVEL(sConfigPVD->PVDLevel)); + assert_param(IS_PWR_PVD_MODE(sConfigPVD->Mode)); + + /* Set PLS[7:5] bits according to PVDLevel value */ + MODIFY_REG(PWR->CR, PWR_CR_PLS, sConfigPVD->PVDLevel); + + /* Clear any previous config. Keep it clear if no event or IT mode is selected */ + __HAL_PWR_PVD_EXTI_DISABLE_EVENT(); + __HAL_PWR_PVD_EXTI_DISABLE_IT(); + __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE(); + __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE(); + + /* Configure interrupt mode */ + if((sConfigPVD->Mode & PVD_MODE_IT) == PVD_MODE_IT) + { + __HAL_PWR_PVD_EXTI_ENABLE_IT(); + } + + /* Configure event mode */ + if((sConfigPVD->Mode & PVD_MODE_EVT) == PVD_MODE_EVT) + { + __HAL_PWR_PVD_EXTI_ENABLE_EVENT(); + } + + /* Configure the edge */ + if((sConfigPVD->Mode & PVD_RISING_EDGE) == PVD_RISING_EDGE) + { + __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE(); + } + + if((sConfigPVD->Mode & PVD_FALLING_EDGE) == PVD_FALLING_EDGE) + { + __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE(); + } +} + +/** + * @brief Enables the Power Voltage Detector(PVD). + * @retval None + */ +void HAL_PWR_EnablePVD(void) +{ + *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)ENABLE; +} + +/** + * @brief Disables the Power Voltage Detector(PVD). + * @retval None + */ +void HAL_PWR_DisablePVD(void) +{ + *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)DISABLE; +} + +/** + * @brief Enables the Wake-up PINx functionality. + * @param WakeUpPinx Specifies the Power Wake-Up pin to enable. + * This parameter can be one of the following values: + * @arg PWR_WAKEUP_PIN1 + * @arg PWR_WAKEUP_PIN2 available only on STM32F410xx/STM32F446xx/STM32F412xx/STM32F413xx/STM32F423xx devices + * @arg PWR_WAKEUP_PIN3 available only on STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx devices + * @retval None + */ +void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx) +{ + /* Check the parameter */ + assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); + + /* Enable the wake up pin */ + SET_BIT(PWR->CSR, WakeUpPinx); +} + +/** + * @brief Disables the Wake-up PINx functionality. + * @param WakeUpPinx Specifies the Power Wake-Up pin to disable. + * This parameter can be one of the following values: + * @arg PWR_WAKEUP_PIN1 + * @arg PWR_WAKEUP_PIN2 available only on STM32F410xx/STM32F446xx/STM32F412xx/STM32F413xx/STM32F423xx devices + * @arg PWR_WAKEUP_PIN3 available only on STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx devices + * @retval None + */ +void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx) +{ + /* Check the parameter */ + assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); + + /* Disable the wake up pin */ + CLEAR_BIT(PWR->CSR, WakeUpPinx); +} + +/** + * @brief Enters Sleep mode. + * + * @note In Sleep mode, all I/O pins keep the same state as in Run mode. + * + * @note In Sleep mode, the systick is stopped to avoid exit from this mode with + * systick interrupt when used as time base for Timeout + * + * @param Regulator Specifies the regulator state in SLEEP mode. + * This parameter can be one of the following values: + * @arg PWR_MAINREGULATOR_ON: SLEEP mode with regulator ON + * @arg PWR_LOWPOWERREGULATOR_ON: SLEEP mode with low power regulator ON + * @note This parameter is not used for the STM32F4 family and is kept as parameter + * just to maintain compatibility with the lower power families. + * @param SLEEPEntry Specifies if SLEEP mode in entered with WFI or WFE instruction. + * This parameter can be one of the following values: + * @arg PWR_SLEEPENTRY_WFI : Enter SLEEP mode with WFI instruction + * @arg PWR_SLEEPENTRY_WFE : Enter SLEEP mode with WFE instruction and + * clear of pending events before. + * @arg PWR_SLEEPENTRY_WFE_NO_EVT_CLEAR : Enter SLEEP mode with WFE instruction and + * no clear of pending event before. + * @retval None + */ +void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(Regulator); + + /* Check the parameters */ + assert_param(IS_PWR_REGULATOR(Regulator)); + assert_param(IS_PWR_SLEEP_ENTRY(SLEEPEntry)); + + /* Clear SLEEPDEEP bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); + + /* Select SLEEP mode entry -------------------------------------------------*/ + if(SLEEPEntry == PWR_SLEEPENTRY_WFI) + { + /* Request Wait For Interrupt */ + __WFI(); + } + else + { + if(SLEEPEntry != PWR_SLEEPENTRY_WFE_NO_EVT_CLEAR) + { + /* Clear all pending event */ + __SEV(); + __WFE(); + } + + /* Request Wait For Event */ + __WFE(); + } +} + +/** + * @brief Enters Stop mode. + * @note In Stop mode, all I/O pins keep the same state as in Run mode. + * @note When exiting Stop mode by issuing an interrupt or a wake-up event, + * the HSI RC oscillator is selected as system clock. + * @note When the voltage regulator operates in low power mode, an additional + * startup delay is incurred when waking up from Stop mode. + * By keeping the internal regulator ON during Stop mode, the consumption + * is higher although the startup time is reduced. + * @param Regulator Specifies the regulator state in Stop mode. + * This parameter can be one of the following values: + * @arg PWR_MAINREGULATOR_ON: Stop mode with regulator ON + * @arg PWR_LOWPOWERREGULATOR_ON: Stop mode with low power regulator ON + * @param STOPEntry Specifies if Stop mode in entered with WFI or WFE instruction. + * This parameter can be one of the following values: + * @arg PWR_STOPENTRY_WFI : Enter Stop mode with WFI instruction + * @arg PWR_STOPENTRY_WFE : Enter Stop mode with WFE instruction and + * clear of pending events before. + * @arg PWR_STOPENTRY_WFE_NO_EVT_CLEAR : Enter STOP mode with WFE instruction and + * no clear of pending event before. + * @retval None + */ +void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry) +{ + /* Check the parameters */ + assert_param(IS_PWR_REGULATOR(Regulator)); + assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); + + /* Select the regulator state in Stop mode: Set PDDS and LPDS bits according to PWR_Regulator value */ + MODIFY_REG(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS), Regulator); + + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); + + /* Select Stop mode entry --------------------------------------------------*/ + if(STOPEntry == PWR_STOPENTRY_WFI) + { + /* Request Wait For Interrupt */ + __WFI(); + } + else + { + if(STOPEntry != PWR_STOPENTRY_WFE_NO_EVT_CLEAR) + { + /* Clear all pending event */ + __SEV(); + __WFE(); + } + /* Request Wait For Event */ + __WFE(); + } + /* Reset SLEEPDEEP bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); +} + +/** + * @brief Enters Standby mode. + * @note In Standby mode, all I/O pins are high impedance except for: + * - Reset pad (still available) + * - RTC_AF1 pin (PC13) if configured for tamper, time-stamp, RTC + * Alarm out, or RTC clock calibration out. + * - RTC_AF2 pin (PI8) if configured for tamper or time-stamp. + * - WKUP pin 1 (PA0) if enabled. + * @retval None + */ +void HAL_PWR_EnterSTANDBYMode(void) +{ + /* Select Standby mode */ + SET_BIT(PWR->CR, PWR_CR_PDDS); + + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); + + /* This option is used to ensure that store operations are completed */ +#if defined ( __CC_ARM) + __force_stores(); +#endif + /* Request Wait For Interrupt */ + __WFI(); +} + +/** + * @brief This function handles the PWR PVD interrupt request. + * @note This API should be called under the PVD_IRQHandler(). + * @retval None + */ +void HAL_PWR_PVD_IRQHandler(void) +{ + /* Check PWR Exti flag */ + if(__HAL_PWR_PVD_EXTI_GET_FLAG() != RESET) + { + /* PWR PVD interrupt user callback */ + HAL_PWR_PVDCallback(); + + /* Clear PWR Exti pending bit */ + __HAL_PWR_PVD_EXTI_CLEAR_FLAG(); + } +} + +/** + * @brief PWR PVD interrupt callback + * @retval None + */ +__weak void HAL_PWR_PVDCallback(void) +{ + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_PWR_PVDCallback could be implemented in the user file + */ +} + +/** + * @brief Indicates Sleep-On-Exit when returning from Handler mode to Thread mode. + * @note Set SLEEPONEXIT bit of SCR register. When this bit is set, the processor + * re-enters SLEEP mode when an interruption handling is over. + * Setting this bit is useful when the processor is expected to run only on + * interruptions handling. + * @retval None + */ +void HAL_PWR_EnableSleepOnExit(void) +{ + /* Set SLEEPONEXIT bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); +} + +/** + * @brief Disables Sleep-On-Exit feature when returning from Handler mode to Thread mode. + * @note Clears SLEEPONEXIT bit of SCR register. When this bit is set, the processor + * re-enters SLEEP mode when an interruption handling is over. + * @retval None + */ +void HAL_PWR_DisableSleepOnExit(void) +{ + /* Clear SLEEPONEXIT bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); +} + +/** + * @brief Enables CORTEX M4 SEVONPEND bit. + * @note Sets SEVONPEND bit of SCR register. When this bit is set, this causes + * WFE to wake up when an interrupt moves from inactive to pended. + * @retval None + */ +void HAL_PWR_EnableSEVOnPend(void) +{ + /* Set SEVONPEND bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); +} + +/** + * @brief Disables CORTEX M4 SEVONPEND bit. + * @note Clears SEVONPEND bit of SCR register. When this bit is set, this causes + * WFE to wake up when an interrupt moves from inactive to pended. + * @retval None + */ +void HAL_PWR_DisableSEVOnPend(void) +{ + /* Clear SEVONPEND bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_PWR_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ diff --git a/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c new file mode 100644 index 0000000..77f9c35 --- /dev/null +++ b/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/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c new file mode 100644 index 0000000..c18fa09 --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c @@ -0,0 +1,1124 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_rcc.c + * @author MCD Application Team + * @brief RCC HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Reset and Clock Control (RCC) peripheral: + * + Initialization and de-initialization functions + * + Peripheral Control functions + * + @verbatim + ============================================================================== + ##### RCC specific features ##### + ============================================================================== + [..] + After reset the device is running from Internal High Speed oscillator + (HSI 16MHz) with Flash 0 wait state, Flash prefetch buffer, D-Cache + and I-Cache are disabled, and all peripherals are off except internal + SRAM, Flash and JTAG. + (+) There is no prescaler on High speed (AHB) and Low speed (APB) busses; + all peripherals mapped on these busses are running at HSI speed. + (+) The clock for all peripherals is switched off, except the SRAM and FLASH. + (+) All GPIOs are in input floating state, except the JTAG pins which + are assigned to be used for debug purpose. + + [..] + Once the device started from reset, the user application has to: + (+) Configure the clock source to be used to drive the System clock + (if the application needs higher frequency/performance) + (+) Configure the System clock frequency and Flash settings + (+) Configure the AHB and APB busses prescalers + (+) Enable the clock for the peripheral(s) to be used + (+) Configure the clock source(s) for peripherals which clocks are not + derived from the System clock (I2S, RTC, ADC, USB OTG FS/SDIO/RNG) + + ##### RCC Limitations ##### + ============================================================================== + [..] + A delay between an RCC peripheral clock enable and the effective peripheral + enabling should be taken into account in order to manage the peripheral read/write + from/to registers. + (+) This delay depends on the peripheral mapping. + (+) If peripheral is mapped on AHB: the delay is 2 AHB clock cycle + after the clock enable bit is set on the hardware register + (+) If peripheral is mapped on APB: the delay is 2 APB clock cycle + after the clock enable bit is set on the hardware register + + [..] + Implemented Workaround: + (+) For AHB & APB peripherals, a dummy read to the peripheral register has been + inserted in each __HAL_RCC_PPP_CLK_ENABLE() macro. + + @endverbatim + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup RCC RCC + * @brief RCC HAL module driver + * @{ + */ + +#ifdef HAL_RCC_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup RCC_Private_Constants + * @{ + */ + +/* Private macro -------------------------------------------------------------*/ +#define __MCO1_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() +#define MCO1_GPIO_PORT GPIOA +#define MCO1_PIN GPIO_PIN_8 + +#define __MCO2_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE() +#define MCO2_GPIO_PORT GPIOC +#define MCO2_PIN GPIO_PIN_9 +/** + * @} + */ + +/* Private variables ---------------------------------------------------------*/ +/** @defgroup RCC_Private_Variables RCC Private Variables + * @{ + */ +/** + * @} + */ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup RCC_Exported_Functions RCC Exported Functions + * @{ + */ + +/** @defgroup RCC_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] + This section provides functions allowing to configure the internal/external oscillators + (HSE, HSI, LSE, LSI, PLL, CSS and MCO) and the System busses clocks (SYSCLK, AHB, APB1 + and APB2). + + [..] Internal/external clock and PLL configuration + (#) HSI (high-speed internal), 16 MHz factory-trimmed RC used directly or through + the PLL as System clock source. + + (#) LSI (low-speed internal), 32 KHz low consumption RC used as IWDG and/or RTC + clock source. + + (#) HSE (high-speed external), 4 to 26 MHz crystal oscillator used directly or + through the PLL as System clock source. Can be used also as RTC clock source. + + (#) LSE (low-speed external), 32 KHz oscillator used as RTC clock source. + + (#) PLL (clocked by HSI or HSE), featuring two different output clocks: + (++) The first output is used to generate the high speed system clock (up to 168 MHz) + (++) The second output is used to generate the clock for the USB OTG FS (48 MHz), + the random analog generator (<=48 MHz) and the SDIO (<= 48 MHz). + + (#) CSS (Clock security system), once enable using the macro __HAL_RCC_CSS_ENABLE() + and if a HSE clock failure occurs(HSE used directly or through PLL as System + clock source), the System clocks automatically switched to HSI and an interrupt + is generated if enabled. The interrupt is linked to the Cortex-M4 NMI + (Non-Maskable Interrupt) exception vector. + + (#) MCO1 (microcontroller clock output), used to output HSI, LSE, HSE or PLL + clock (through a configurable prescaler) on PA8 pin. + + (#) MCO2 (microcontroller clock output), used to output HSE, PLL, SYSCLK or PLLI2S + clock (through a configurable prescaler) on PC9 pin. + + [..] System, AHB and APB busses clocks configuration + (#) Several clock sources can be used to drive the System clock (SYSCLK): HSI, + HSE and PLL. + The AHB clock (HCLK) is derived from System clock through configurable + prescaler and used to clock the CPU, memory and peripherals mapped + on AHB bus (DMA, GPIO...). APB1 (PCLK1) and APB2 (PCLK2) clocks are derived + from AHB clock through configurable prescalers and used to clock + the peripherals mapped on these busses. You can use + "HAL_RCC_GetSysClockFreq()" function to retrieve the frequencies of these clocks. + + (#) For the STM32F405xx/07xx and STM32F415xx/17xx devices, the maximum + frequency of the SYSCLK and HCLK is 168 MHz, PCLK2 84 MHz and PCLK1 42 MHz. + Depending on the device voltage range, the maximum frequency should + be adapted accordingly (refer to the product datasheets for more details). + + (#) For the STM32F42xxx, STM32F43xxx, STM32F446xx, STM32F469xx and STM32F479xx devices, + the maximum frequency of the SYSCLK and HCLK is 180 MHz, PCLK2 90 MHz and PCLK1 45 MHz. + Depending on the device voltage range, the maximum frequency should + be adapted accordingly (refer to the product datasheets for more details). + + (#) For the STM32F401xx, the maximum frequency of the SYSCLK and HCLK is 84 MHz, + PCLK2 84 MHz and PCLK1 42 MHz. + Depending on the device voltage range, the maximum frequency should + be adapted accordingly (refer to the product datasheets for more details). + + (#) For the STM32F41xxx, the maximum frequency of the SYSCLK and HCLK is 100 MHz, + PCLK2 100 MHz and PCLK1 50 MHz. + Depending on the device voltage range, the maximum frequency should + be adapted accordingly (refer to the product datasheets for more details). + +@endverbatim + * @{ + */ + +/** + * @brief Resets the RCC clock configuration to the default reset state. + * @note The default reset state of the clock configuration is given below: + * - HSI ON and used as system clock source + * - HSE and PLL OFF + * - AHB, APB1 and APB2 prescaler set to 1. + * - CSS, MCO1 and MCO2 OFF + * - All interrupts disabled + * @note This function doesn't modify the configuration of the + * - Peripheral clocks + * - LSI, LSE and RTC clocks + * @retval HAL status + */ +__weak HAL_StatusTypeDef HAL_RCC_DeInit(void) +{ + return HAL_OK; +} + +/** + * @brief Initializes the RCC Oscillators according to the specified parameters in the + * RCC_OscInitTypeDef. + * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that + * contains the configuration information for the RCC Oscillators. + * @note The PLL is not disabled when used as system clock. + * @note Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not + * supported by this API. User should request a transition to LSE Off + * first and then LSE On or LSE Bypass. + * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not + * supported by this API. User should request a transition to HSE Off + * first and then HSE On or HSE Bypass. + * @retval HAL status + */ +__weak HAL_StatusTypeDef HAL_RCC_OscConfig(const RCC_OscInitTypeDef *RCC_OscInitStruct) +{ + uint32_t tickstart; + uint32_t pll_config; + /* Check Null pointer */ + if (RCC_OscInitStruct == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); + /*------------------------------- HSE Configuration ------------------------*/ + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) + { + /* Check the parameters */ + assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); + /* When the HSE is used as system clock or clock source for PLL in these cases HSE will not disabled */ + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) || \ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) + { + if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) + { + return HAL_ERROR; + } + } + else + { + /* Set the new HSE configuration ---------------------------------------*/ + __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); + + /* Check the HSE State */ + if ((RCC_OscInitStruct->HSEState) != RCC_HSE_OFF) + { + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till HSE is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till HSE is bypassed or disabled */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + } + /*----------------------------- HSI Configuration --------------------------*/ + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) + { + /* Check the parameters */ + assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); + assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); + + /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) || \ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) + { + /* When HSI is used as system clock it will not disabled */ + if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) + { + return HAL_ERROR; + } + /* Otherwise, just the calibration is allowed */ + else + { + /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ + __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + } + } + else + { + /* Check the HSI State */ + if ((RCC_OscInitStruct->HSIState) != RCC_HSI_OFF) + { + /* Enable the Internal High Speed oscillator (HSI). */ + __HAL_RCC_HSI_ENABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSI is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Adjusts the Internal High Speed oscillator (HSI) calibration value. */ + __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + } + else + { + /* Disable the Internal High Speed oscillator (HSI). */ + __HAL_RCC_HSI_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSI is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + } + /*------------------------------ LSI Configuration -------------------------*/ + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) + { + /* Check the parameters */ + assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); + + /* Check the LSI State */ + if ((RCC_OscInitStruct->LSIState) != RCC_LSI_OFF) + { + /* Enable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_ENABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSI is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Disable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_DISABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSI is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + /*------------------------------ LSE Configuration -------------------------*/ + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) + { + FlagStatus pwrclkchanged = RESET; + + /* Check the parameters */ + assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); + + /* Update LSE configuration in Backup Domain control register */ + /* Requires to enable write access to Backup Domain of necessary */ + if (__HAL_RCC_PWR_IS_CLK_DISABLED()) + { + __HAL_RCC_PWR_CLK_ENABLE(); + pwrclkchanged = SET; + } + + if (HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + { + /* Enable write access to Backup domain */ + SET_BIT(PWR->CR, PWR_CR_DBP); + + /* Wait for Backup domain Write protection disable */ + tickstart = HAL_GetTick(); + + while (HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + { + if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Set the new LSE configuration -----------------------------------------*/ + __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); + /* Check the LSE State */ + if ((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Restore clock configuration if changed */ + if (pwrclkchanged == SET) + { + __HAL_RCC_PWR_CLK_DISABLE(); + } + } + /*-------------------------------- PLL Configuration -----------------------*/ + /* Check the parameters */ + assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); + if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) + { + /* Check if the PLL is used as system clock or not */ + if (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) + { + if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) + { + /* Check the parameters */ + assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); + assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM)); + assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN)); + assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP)); + assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ)); + + /* Disable the main PLL. */ + __HAL_RCC_PLL_DISABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till PLL is disabled */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Configure the main PLL clock source, multiplication and division factors. */ + WRITE_REG(RCC->PLLCFGR, (RCC_OscInitStruct->PLL.PLLSource | \ + RCC_OscInitStruct->PLL.PLLM | \ + (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos) | \ + (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos) | \ + (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))); + /* Enable the main PLL. */ + __HAL_RCC_PLL_ENABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Disable the main PLL. */ + __HAL_RCC_PLL_DISABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till PLL is disabled */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + else + { + /* Check if there is a request to disable the PLL used as System clock source */ + if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) + { + return HAL_ERROR; + } + else + { + /* Do not return HAL_ERROR if request repeats the current configuration */ + pll_config = RCC->PLLCFGR; +#if defined (RCC_PLLCFGR_PLLR) + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLR) != (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))) +#else + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))) +#endif /* RCC_PLLCFGR_PLLR */ + { + return HAL_ERROR; + } + } + } + } + return HAL_OK; +} + +/** + * @brief Initializes the CPU, AHB and APB busses clocks according to the specified + * parameters in the RCC_ClkInitStruct. + * @param RCC_ClkInitStruct pointer to an RCC_OscInitTypeDef structure that + * contains the configuration information for the RCC peripheral. + * @param FLatency FLASH Latency, this parameter depend on device selected + * + * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency + * and updated by HAL_RCC_GetHCLKFreq() function called within this function + * + * @note The HSI is used (enabled by hardware) as system clock source after + * startup from Reset, wake-up from STOP and STANDBY mode, or in case + * of failure of the HSE used directly or indirectly as system clock + * (if the Clock Security System CSS is enabled). + * + * @note A switch from one clock source to another occurs only if the target + * clock source is ready (clock stable after startup delay or PLL locked). + * If a clock source which is not yet ready is selected, the switch will + * occur when the clock source will be ready. + * + * @note Depending on the device voltage range, the software has to set correctly + * HPRE[3:0] bits to ensure that HCLK not exceed the maximum allowed frequency + * (for more details refer to section above "Initialization/de-initialization functions") + * @retval None + */ +HAL_StatusTypeDef HAL_RCC_ClockConfig(const RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency) +{ + uint32_t tickstart; + + /* Check Null pointer */ + if (RCC_ClkInitStruct == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_RCC_CLOCKTYPE(RCC_ClkInitStruct->ClockType)); + assert_param(IS_FLASH_LATENCY(FLatency)); + + /* To correctly read data from FLASH memory, the number of wait states (LATENCY) + must be correctly programmed according to the frequency of the CPU clock + (HCLK) and the supply voltage of the device. */ + + /* Increasing the number of wait states because of higher CPU frequency */ + if (FLatency > __HAL_FLASH_GET_LATENCY()) + { + /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ + __HAL_FLASH_SET_LATENCY(FLatency); + + /* Check that the new number of wait states is taken into account to access the Flash + memory by reading the FLASH_ACR register */ + if (__HAL_FLASH_GET_LATENCY() != FLatency) + { + return HAL_ERROR; + } + } + + /*-------------------------- HCLK Configuration --------------------------*/ + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) + { + /* Set the highest APBx dividers in order to ensure that we do not go through + a non-spec phase whatever we decrease or increase HCLK. */ + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + { + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_HCLK_DIV16); + } + + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + { + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, (RCC_HCLK_DIV16 << 3)); + } + + assert_param(IS_RCC_HCLK(RCC_ClkInitStruct->AHBCLKDivider)); + MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider); + } + + /*------------------------- SYSCLK Configuration ---------------------------*/ + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) + { + assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource)); + + /* HSE is selected as System Clock Source */ + if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) + { + /* Check the HSE ready flag */ + if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + { + return HAL_ERROR; + } + } + /* PLL is selected as System Clock Source */ + else if ((RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) || + (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLRCLK)) + { + /* Check the PLL ready flag */ + if (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + { + return HAL_ERROR; + } + } + /* HSI is selected as System Clock Source */ + else + { + /* Check the HSI ready flag */ + if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + { + return HAL_ERROR; + } + } + + __HAL_RCC_SYSCLK_CONFIG(RCC_ClkInitStruct->SYSCLKSource); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos)) + { + if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Decreasing the number of wait states because of lower CPU frequency */ + if (FLatency < __HAL_FLASH_GET_LATENCY()) + { + /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ + __HAL_FLASH_SET_LATENCY(FLatency); + + /* Check that the new number of wait states is taken into account to access the Flash + memory by reading the FLASH_ACR register */ + if (__HAL_FLASH_GET_LATENCY() != FLatency) + { + return HAL_ERROR; + } + } + + /*-------------------------- PCLK1 Configuration ---------------------------*/ + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + { + assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider)); + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider); + } + + /*-------------------------- PCLK2 Configuration ---------------------------*/ + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + { + assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider)); + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3U)); + } + + /* Update the SystemCoreClock global variable */ + SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos]; + + /* Configure the source of time base considering new system clocks settings */ + HAL_InitTick(uwTickPrio); + + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup RCC_Exported_Functions_Group2 Peripheral Control functions + * @brief RCC clocks control functions + * +@verbatim + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the RCC Clocks + frequencies. + +@endverbatim + * @{ + */ + +/** + * @brief Selects the clock source to output on MCO1 pin(PA8) or on MCO2 pin(PC9). + * @note PA8/PC9 should be configured in alternate function mode. + * @param RCC_MCOx specifies the output direction for the clock source. + * This parameter can be one of the following values: + * @arg RCC_MCO1: Clock source to output on MCO1 pin(PA8). + * @arg RCC_MCO2: Clock source to output on MCO2 pin(PC9). + * @param RCC_MCOSource specifies the clock source to output. + * This parameter can be one of the following values: + * @arg RCC_MCO1SOURCE_HSI: HSI clock selected as MCO1 source + * @arg RCC_MCO1SOURCE_LSE: LSE clock selected as MCO1 source + * @arg RCC_MCO1SOURCE_HSE: HSE clock selected as MCO1 source + * @arg RCC_MCO1SOURCE_PLLCLK: main PLL clock selected as MCO1 source + * @arg RCC_MCO2SOURCE_SYSCLK: System clock (SYSCLK) selected as MCO2 source + * @arg RCC_MCO2SOURCE_PLLI2SCLK: PLLI2S clock selected as MCO2 source, available for all STM32F4 devices except STM32F410xx + * @arg RCC_MCO2SOURCE_I2SCLK: I2SCLK clock selected as MCO2 source, available only for STM32F410Rx devices + * @arg RCC_MCO2SOURCE_HSE: HSE clock selected as MCO2 source + * @arg RCC_MCO2SOURCE_PLLCLK: main PLL clock selected as MCO2 source + * @param RCC_MCODiv specifies the MCOx prescaler. + * This parameter can be one of the following values: + * @arg RCC_MCODIV_1: no division applied to MCOx clock + * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock + * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock + * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock + * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock + * @note For STM32F410Rx devices to output I2SCLK clock on MCO2 you should have + * at last one of the SPI clocks enabled (SPI1, SPI2 or SPI5). + * @retval None + */ +void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv) +{ + GPIO_InitTypeDef GPIO_InitStruct; + /* Check the parameters */ + assert_param(IS_RCC_MCO(RCC_MCOx)); + assert_param(IS_RCC_MCODIV(RCC_MCODiv)); + /* RCC_MCO1 */ + if (RCC_MCOx == RCC_MCO1) + { + assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource)); + + /* MCO1 Clock Enable */ + __MCO1_CLK_ENABLE(); + + /* Configure the MCO1 pin in alternate function mode */ + GPIO_InitStruct.Pin = MCO1_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Alternate = GPIO_AF0_MCO; + HAL_GPIO_Init(MCO1_GPIO_PORT, &GPIO_InitStruct); + + /* Mask MCO1 and MCO1PRE[2:0] bits then Select MCO1 clock source and prescaler */ + MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO1 | RCC_CFGR_MCO1PRE), (RCC_MCOSource | RCC_MCODiv)); + + /* This RCC MCO1 enable feature is available only on STM32F410xx devices */ +#if defined(RCC_CFGR_MCO1EN) + __HAL_RCC_MCO1_ENABLE(); +#endif /* RCC_CFGR_MCO1EN */ + } +#if defined(RCC_CFGR_MCO2) + else + { + assert_param(IS_RCC_MCO2SOURCE(RCC_MCOSource)); + + /* MCO2 Clock Enable */ + __MCO2_CLK_ENABLE(); + + /* Configure the MCO2 pin in alternate function mode */ + GPIO_InitStruct.Pin = MCO2_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Alternate = GPIO_AF0_MCO; + HAL_GPIO_Init(MCO2_GPIO_PORT, &GPIO_InitStruct); + + /* Mask MCO2 and MCO2PRE[2:0] bits then Select MCO2 clock source and prescaler */ + MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO2 | RCC_CFGR_MCO2PRE), (RCC_MCOSource | (RCC_MCODiv << 3U))); + + /* This RCC MCO2 enable feature is available only on STM32F410Rx devices */ +#if defined(RCC_CFGR_MCO2EN) + __HAL_RCC_MCO2_ENABLE(); +#endif /* RCC_CFGR_MCO2EN */ + } +#endif /* RCC_CFGR_MCO2 */ +} + +/** + * @brief Enables the Clock Security System. + * @note If a failure is detected on the HSE oscillator clock, this oscillator + * is automatically disabled and an interrupt is generated to inform the + * software about the failure (Clock Security System Interrupt, CSSI), + * allowing the MCU to perform rescue operations. The CSSI is linked to + * the Cortex-M4 NMI (Non-Maskable Interrupt) exception vector. + * @retval None + */ +void HAL_RCC_EnableCSS(void) +{ + *(__IO uint32_t *) RCC_CR_CSSON_BB = (uint32_t)ENABLE; +} + +/** + * @brief Disables the Clock Security System. + * @retval None + */ +void HAL_RCC_DisableCSS(void) +{ + *(__IO uint32_t *) RCC_CR_CSSON_BB = (uint32_t)DISABLE; +} + +/** + * @brief Returns the SYSCLK frequency + * + * @note The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*) + * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(**) + * @note If SYSCLK source is PLL, function returns values based on HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * @note (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * @note (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 25 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * @note The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @note This function can be used by the user application to compute the + * baudrate for the communication peripherals or configure other parameters. + * + * @note Each time SYSCLK changes, this function must be called to update the + * right SYSCLK value. Otherwise, any configuration based on this function will be incorrect. + * + * + * @retval SYSCLK frequency + */ +__weak uint32_t HAL_RCC_GetSysClockFreq(void) +{ + uint32_t pllm = 0U; + uint32_t pllvco = 0U; + uint32_t pllp = 0U; + uint32_t sysclockfreq = 0U; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (RCC->CFGR & RCC_CFGR_SWS) + { + case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */ + { + sysclockfreq = HSI_VALUE; + break; + } + case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ + { + sysclockfreq = HSE_VALUE; + break; + } + case RCC_CFGR_SWS_PLL: /* PLL used as system clock source */ + { + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + SYSCLK = PLL_VCO / PLLP */ + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + if (__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) + { + /* HSE used as PLL clock source */ + pllvco = (uint32_t)((((uint64_t) HSE_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (uint32_t)((((uint64_t) HSI_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + } + pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1U) * 2U); + + sysclockfreq = pllvco / pllp; + break; + } + default: + { + sysclockfreq = HSI_VALUE; + break; + } + } + return sysclockfreq; +} + +/** + * @brief Returns the HCLK frequency + * @note Each time HCLK changes, this function must be called to update the + * right HCLK value. Otherwise, any configuration based on this function will be incorrect. + * + * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency + * and updated within this function + * @retval HCLK frequency + */ +uint32_t HAL_RCC_GetHCLKFreq(void) +{ + return SystemCoreClock; +} + +/** + * @brief Returns the PCLK1 frequency + * @note Each time PCLK1 changes, this function must be called to update the + * right PCLK1 value. Otherwise, any configuration based on this function will be incorrect. + * @retval PCLK1 frequency + */ +uint32_t HAL_RCC_GetPCLK1Freq(void) +{ + /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/ + return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1) >> RCC_CFGR_PPRE1_Pos]); +} + +/** + * @brief Returns the PCLK2 frequency + * @note Each time PCLK2 changes, this function must be called to update the + * right PCLK2 value. Otherwise, any configuration based on this function will be incorrect. + * @retval PCLK2 frequency + */ +uint32_t HAL_RCC_GetPCLK2Freq(void) +{ + /* Get HCLK source and Compute PCLK2 frequency ---------------------------*/ + return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2) >> RCC_CFGR_PPRE2_Pos]); +} + +/** + * @brief Configures the RCC_OscInitStruct according to the internal + * RCC configuration registers. + * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that + * will be configured. + * @retval None + */ +__weak void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) +{ + /* Set all possible values for the Oscillator type parameter ---------------*/ + RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; + + /* Get the HSE configuration -----------------------------------------------*/ + if ((RCC->CR & RCC_CR_HSEBYP) == RCC_CR_HSEBYP) + { + RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; + } + else if ((RCC->CR & RCC_CR_HSEON) == RCC_CR_HSEON) + { + RCC_OscInitStruct->HSEState = RCC_HSE_ON; + } + else + { + RCC_OscInitStruct->HSEState = RCC_HSE_OFF; + } + + /* Get the HSI configuration -----------------------------------------------*/ + if ((RCC->CR & RCC_CR_HSION) == RCC_CR_HSION) + { + RCC_OscInitStruct->HSIState = RCC_HSI_ON; + } + else + { + RCC_OscInitStruct->HSIState = RCC_HSI_OFF; + } + + RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR & RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); + + /* Get the LSE configuration -----------------------------------------------*/ + if ((RCC->BDCR & RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) + { + RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; + } + else if ((RCC->BDCR & RCC_BDCR_LSEON) == RCC_BDCR_LSEON) + { + RCC_OscInitStruct->LSEState = RCC_LSE_ON; + } + else + { + RCC_OscInitStruct->LSEState = RCC_LSE_OFF; + } + + /* Get the LSI configuration -----------------------------------------------*/ + if ((RCC->CSR & RCC_CSR_LSION) == RCC_CSR_LSION) + { + RCC_OscInitStruct->LSIState = RCC_LSI_ON; + } + else + { + RCC_OscInitStruct->LSIState = RCC_LSI_OFF; + } + + /* Get the PLL configuration -----------------------------------------------*/ + if ((RCC->CR & RCC_CR_PLLON) == RCC_CR_PLLON) + { + RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; + } + else + { + RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF; + } + RCC_OscInitStruct->PLL.PLLSource = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); + RCC_OscInitStruct->PLL.PLLM = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM); + RCC_OscInitStruct->PLL.PLLN = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); + RCC_OscInitStruct->PLL.PLLP = (uint32_t)((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) + RCC_PLLCFGR_PLLP_0) << 1U) >> RCC_PLLCFGR_PLLP_Pos); + RCC_OscInitStruct->PLL.PLLQ = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos); +} + +/** + * @brief Configures the RCC_ClkInitStruct according to the internal + * RCC configuration registers. + * @param RCC_ClkInitStruct pointer to an RCC_ClkInitTypeDef structure that + * will be configured. + * @param pFLatency Pointer on the Flash Latency. + * @retval None + */ +void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency) +{ + /* Set all possible values for the Clock type parameter --------------------*/ + RCC_ClkInitStruct->ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + + /* Get the SYSCLK configuration --------------------------------------------*/ + RCC_ClkInitStruct->SYSCLKSource = (uint32_t)(RCC->CFGR & RCC_CFGR_SW); + + /* Get the HCLK configuration ----------------------------------------------*/ + RCC_ClkInitStruct->AHBCLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_HPRE); + + /* Get the APB1 configuration ----------------------------------------------*/ + RCC_ClkInitStruct->APB1CLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_PPRE1); + + /* Get the APB2 configuration ----------------------------------------------*/ + RCC_ClkInitStruct->APB2CLKDivider = (uint32_t)((RCC->CFGR & RCC_CFGR_PPRE2) >> 3U); + + /* Get the Flash Wait State (Latency) configuration ------------------------*/ + *pFLatency = (uint32_t)(FLASH->ACR & FLASH_ACR_LATENCY); +} + +/** + * @brief This function handles the RCC CSS interrupt request. + * @note This API should be called under the NMI_Handler(). + * @retval None + */ +void HAL_RCC_NMI_IRQHandler(void) +{ + /* Check RCC CSSF flag */ + if (__HAL_RCC_GET_IT(RCC_IT_CSS)) + { + /* RCC Clock Security System interrupt user callback */ + HAL_RCC_CSSCallback(); + + /* Clear RCC CSS pending bit */ + __HAL_RCC_CLEAR_IT(RCC_IT_CSS); + } +} + +/** + * @brief RCC Clock Security System interrupt callback + * @retval None + */ +__weak void HAL_RCC_CSSCallback(void) +{ + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_RCC_CSSCallback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_RCC_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + diff --git a/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c new file mode 100644 index 0000000..0431718 --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c @@ -0,0 +1,3833 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_rcc_ex.c + * @author MCD Application Team + * @brief Extension RCC HAL module driver. + * This file provides firmware functions to manage the following + * functionalities RCC extension peripheral: + * + Extended Peripheral Control functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup RCCEx RCCEx + * @brief RCCEx HAL module driver + * @{ + */ + +#ifdef HAL_RCC_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup RCCEx_Private_Constants + * @{ + */ +/** + * @} + */ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/** @defgroup RCCEx_Exported_Functions RCCEx Exported Functions + * @{ + */ + +/** @defgroup RCCEx_Exported_Functions_Group1 Extended Peripheral Control functions + * @brief Extended Peripheral Control functions + * +@verbatim + =============================================================================== + ##### Extended Peripheral Control functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the RCC Clocks + frequencies. + [..] + (@) Important note: Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to + select the RTC clock source; in this case the Backup domain will be reset in + order to modify the RTC Clock source, as consequence RTC registers (including + the backup registers) and RCC_BDCR register are set to their reset values. + +@endverbatim + * @{ + */ + +#if defined(STM32F446xx) +/** + * @brief Initializes the RCC extended peripherals clocks according to the specified + * parameters in the RCC_PeriphCLKInitTypeDef. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * contains the configuration information for the Extended Peripherals + * clocks(I2S, SAI, LTDC RTC and TIM). + * + * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select + * the RTC clock source; in this case the Backup domain will be reset in + * order to modify the RTC Clock source, as consequence RTC registers (including + * the backup registers) and RCC_BDCR register are set to their reset values. + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tickstart = 0U; + uint32_t tmpreg1 = 0U; + uint32_t plli2sp = 0U; + uint32_t plli2sq = 0U; + uint32_t plli2sr = 0U; + uint32_t pllsaip = 0U; + uint32_t pllsaiq = 0U; + uint32_t plli2sused = 0U; + uint32_t pllsaiused = 0U; + + /* Check the peripheral clock selection parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + + /*------------------------ I2S APB1 configuration --------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == (RCC_PERIPHCLK_I2S_APB1)) + { + /* Check the parameters */ + assert_param(IS_RCC_I2SAPB1CLKSOURCE(PeriphClkInit->I2sApb1ClockSelection)); + + /* Configure I2S Clock source */ + __HAL_RCC_I2S_APB1_CONFIG(PeriphClkInit->I2sApb1ClockSelection); + /* Enable the PLLI2S when it's used as clock source for I2S */ + if (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S) + { + plli2sused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- I2S APB2 configuration ----------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == (RCC_PERIPHCLK_I2S_APB2)) + { + /* Check the parameters */ + assert_param(IS_RCC_I2SAPB2CLKSOURCE(PeriphClkInit->I2sApb2ClockSelection)); + + /* Configure I2S Clock source */ + __HAL_RCC_I2S_APB2_CONFIG(PeriphClkInit->I2sApb2ClockSelection); + /* Enable the PLLI2S when it's used as clock source for I2S */ + if (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S) + { + plli2sused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*--------------------------- SAI1 configuration ---------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == (RCC_PERIPHCLK_SAI1)) + { + /* Check the parameters */ + assert_param(IS_RCC_SAI1CLKSOURCE(PeriphClkInit->Sai1ClockSelection)); + + /* Configure SAI1 Clock source */ + __HAL_RCC_SAI1_CONFIG(PeriphClkInit->Sai1ClockSelection); + /* Enable the PLLI2S when it's used as clock source for SAI */ + if (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S) + { + plli2sused = 1U; + } + /* Enable the PLLSAI when it's used as clock source for SAI */ + if (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI) + { + pllsaiused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*-------------------------- SAI2 configuration ----------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == (RCC_PERIPHCLK_SAI2)) + { + /* Check the parameters */ + assert_param(IS_RCC_SAI2CLKSOURCE(PeriphClkInit->Sai2ClockSelection)); + + /* Configure SAI2 Clock source */ + __HAL_RCC_SAI2_CONFIG(PeriphClkInit->Sai2ClockSelection); + + /* Enable the PLLI2S when it's used as clock source for SAI */ + if (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S) + { + plli2sused = 1U; + } + /* Enable the PLLSAI when it's used as clock source for SAI */ + if (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI) + { + pllsaiused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*----------------------------- RTC configuration --------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) + { + /* Check for RTC Parameters used to output RTCCLK */ + assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); + + /* Enable Power Clock*/ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Enable write access to Backup domain */ + PWR->CR |= PWR_CR_DBP; + + /* Get tick */ + tickstart = HAL_GetTick(); + + while ((PWR->CR & PWR_CR_DBP) == RESET) + { + if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ + tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); + if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) + { + /* Store the content of BDCR register before the reset of Backup Domain */ + tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); + /* RTC Clock selection can be changed only if the Backup Domain is reset */ + __HAL_RCC_BACKUPRESET_FORCE(); + __HAL_RCC_BACKUPRESET_RELEASE(); + /* Restore the Content of BDCR register */ + RCC->BDCR = tmpreg1; + + /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ + if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- TIM configuration ---------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) + { + /* Configure Timer Prescaler */ + __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- FMPI2C1 Configuration -----------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) + { + /* Check the parameters */ + assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); + + /* Configure the FMPI2C1 clock source */ + __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------ CEC Configuration -------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CEC) == RCC_PERIPHCLK_CEC) + { + /* Check the parameters */ + assert_param(IS_RCC_CECCLKSOURCE(PeriphClkInit->CecClockSelection)); + + /* Configure the CEC clock source */ + __HAL_RCC_CEC_CONFIG(PeriphClkInit->CecClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*----------------------------- CLK48 Configuration ------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) + { + /* Check the parameters */ + assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); + + /* Configure the CLK48 clock source */ + __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); + + /* Enable the PLLSAI when it's used as clock source for CLK48 */ + if (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP) + { + pllsaiused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*----------------------------- SDIO Configuration -------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) + { + /* Check the parameters */ + assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); + + /* Configure the SDIO clock source */ + __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------ SPDIFRX Configuration ---------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX) + { + /* Check the parameters */ + assert_param(IS_RCC_SPDIFRXCLKSOURCE(PeriphClkInit->SpdifClockSelection)); + + /* Configure the SPDIFRX clock source */ + __HAL_RCC_SPDIFRX_CONFIG(PeriphClkInit->SpdifClockSelection); + /* Enable the PLLI2S when it's used as clock source for SPDIFRX */ + if (PeriphClkInit->SpdifClockSelection == RCC_SPDIFRXCLKSOURCE_PLLI2SP) + { + plli2sused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- PLLI2S Configuration ------------------------*/ + /* PLLI2S is configured when a peripheral will use it as source clock : SAI1, SAI2, I2S on APB1, + I2S on APB2 or SPDIFRX */ + if ((plli2sused == 1U) || (PeriphClkInit->PeriphClockSelection == RCC_PERIPHCLK_PLLI2S)) + { + /* Disable the PLLI2S */ + __HAL_RCC_PLLI2S_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is disabled */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /* check for common PLLI2S Parameters */ + assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); + assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); + + /*------ In Case of PLLI2S is selected as source clock for I2S -----------*/ + if (((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == RCC_PERIPHCLK_I2S_APB1) + && (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == RCC_PERIPHCLK_I2S_APB2) && (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S))) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + + /* Read PLLI2SP/PLLI2SQ value from PLLI2SCFGR register (this value is not needed for I2S configuration) */ + plli2sp = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); + plli2sq = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ + /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, plli2sp, plli2sq, + PeriphClkInit->PLLI2S.PLLI2SR); + } + + /*------- In Case of PLLI2S is selected as source clock for SAI ----------*/ + if (((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) + && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S))) + { + /* Check for PLLI2S Parameters */ + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + /* Check for PLLI2S/DIVQ parameters */ + assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); + + /* Read PLLI2SP/PLLI2SR value from PLLI2SCFGR register (this value is not needed for SAI configuration) */ + plli2sp = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); + plli2sr = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, plli2sp, + PeriphClkInit->PLLI2S.PLLI2SQ, plli2sr); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ + __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); + } + + /*------ In Case of PLLI2S is selected as source clock for SPDIFRX -------*/ + if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX) + && (PeriphClkInit->SpdifClockSelection == RCC_SPDIFRXCLKSOURCE_PLLI2SP)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SP_VALUE(PeriphClkInit->PLLI2S.PLLI2SP)); + /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ + plli2sq = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); + plli2sr = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ + /* SPDIFRXCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SP, + plli2sq, plli2sr); + } + + /*----------------- In Case of PLLI2S is just selected -----------------*/ + if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) + { + /* Check for Parameters */ + assert_param(IS_RCC_PLLI2SP_VALUE(PeriphClkInit->PLLI2S.PLLI2SP)); + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SP, + PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); + } + + /* Enable the PLLI2S */ + __HAL_RCC_PLLI2S_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + /*--------------------------------------------------------------------------*/ + + /*----------------------------- PLLSAI Configuration -----------------------*/ + /* PLLSAI is configured when a peripheral will use it as source clock : SAI1, SAI2, CLK48 or SDIO */ + if (pllsaiused == 1U) + { + /* Disable PLLSAI Clock */ + __HAL_RCC_PLLSAI_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLSAI is disabled */ + while (__HAL_RCC_PLLSAI_GET_FLAG() != RESET) + { + if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /* Check the PLLSAI division factors */ + assert_param(IS_RCC_PLLSAIM_VALUE(PeriphClkInit->PLLSAI.PLLSAIM)); + assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); + + /*------ In Case of PLLSAI is selected as source clock for SAI -----------*/ + if (((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) + && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI))) + { + /* check for PLLSAIQ Parameter */ + assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); + /* check for PLLSAI/DIVQ Parameter */ + assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); + + /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ + pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); + /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIM, PeriphClkInit->PLLSAI.PLLSAIN, pllsaip, + PeriphClkInit->PLLSAI.PLLSAIQ, 0U); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ + __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); + } + + /*------ In Case of PLLSAI is selected as source clock for CLK48 ---------*/ + /* In Case of PLLI2S is selected as source clock for CLK48 */ + if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) + && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLSAIP_VALUE(PeriphClkInit->PLLSAI.PLLSAIP)); + /* Read PLLSAIQ value from PLLI2SCFGR register (this value is not need for SAI configuration) */ + pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* Configure the PLLSAI division factors */ + /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * (PLLI2SN/PLLSAIM) */ + /* 48CLK = f(PLLSAI clock output) = f(VCO clock) / PLLSAIP */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIM, PeriphClkInit->PLLSAI.PLLSAIN, PeriphClkInit->PLLSAI.PLLSAIP, + pllsaiq, 0U); + } + + /* Enable PLLSAI Clock */ + __HAL_RCC_PLLSAI_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLSAI is ready */ + while (__HAL_RCC_PLLSAI_GET_FLAG() == RESET) + { + if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + return HAL_OK; +} + +/** + * @brief Get the RCC_PeriphCLKInitTypeDef according to the internal + * RCC configuration registers. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * will be configured. + * @retval None + */ +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tempreg; + + /* Set all possible values for the extended clock type parameter------------*/ + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 | \ + RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_SAI2 | \ + RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC | \ + RCC_PERIPHCLK_CEC | RCC_PERIPHCLK_FMPI2C1 | \ + RCC_PERIPHCLK_CLK48 | RCC_PERIPHCLK_SDIO | \ + RCC_PERIPHCLK_SPDIFRX; + + /* Get the PLLI2S Clock configuration --------------------------------------*/ + PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM) >> RCC_PLLI2SCFGR_PLLI2SM_Pos); + PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); + PeriphClkInit->PLLI2S.PLLI2SP = (uint32_t)((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); + PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); + PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + /* Get the PLLSAI Clock configuration --------------------------------------*/ + PeriphClkInit->PLLSAI.PLLSAIM = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM) >> RCC_PLLSAICFGR_PLLSAIM_Pos); + PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); + PeriphClkInit->PLLSAI.PLLSAIP = (uint32_t)((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); + PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* Get the PLLSAI/PLLI2S division factors ----------------------------------*/ + PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); + PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); + + /* Get the SAI1 clock configuration ----------------------------------------*/ + PeriphClkInit->Sai1ClockSelection = __HAL_RCC_GET_SAI1_SOURCE(); + + /* Get the SAI2 clock configuration ----------------------------------------*/ + PeriphClkInit->Sai2ClockSelection = __HAL_RCC_GET_SAI2_SOURCE(); + + /* Get the I2S APB1 clock configuration ------------------------------------*/ + PeriphClkInit->I2sApb1ClockSelection = __HAL_RCC_GET_I2S_APB1_SOURCE(); + + /* Get the I2S APB2 clock configuration ------------------------------------*/ + PeriphClkInit->I2sApb2ClockSelection = __HAL_RCC_GET_I2S_APB2_SOURCE(); + + /* Get the RTC Clock configuration -----------------------------------------*/ + tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); + PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); + + /* Get the CEC clock configuration -----------------------------------------*/ + PeriphClkInit->CecClockSelection = __HAL_RCC_GET_CEC_SOURCE(); + + /* Get the FMPI2C1 clock configuration -------------------------------------*/ + PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); + + /* Get the CLK48 clock configuration ----------------------------------------*/ + PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); + + /* Get the SDIO clock configuration ----------------------------------------*/ + PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); + + /* Get the SPDIFRX clock configuration -------------------------------------*/ + PeriphClkInit->SpdifClockSelection = __HAL_RCC_GET_SPDIFRX_SOURCE(); + + /* Get the TIM Prescaler configuration -------------------------------------*/ + if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; + } + else + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; + } +} + +/** + * @brief Return the peripheral clock frequency for a given peripheral(SAI..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_SAI1: SAI1 peripheral clock + * @arg RCC_PERIPHCLK_SAI2: SAI2 peripheral clock + * @arg RCC_PERIPHCLK_I2S_APB1: I2S APB1 peripheral clock + * @arg RCC_PERIPHCLK_I2S_APB2: I2S APB2 peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + uint32_t tmpreg1 = 0U; + /* This variable used to store the SAI clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + /* This variable used to store the SAI clock source */ + uint32_t saiclocksource = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_SAI1: + case RCC_PERIPHCLK_SAI2: + { + saiclocksource = RCC->DCKCFGR; + saiclocksource &= (RCC_DCKCFGR_SAI1SRC | RCC_DCKCFGR_SAI2SRC); + switch (saiclocksource) + { + case 0U: /* PLLSAI is the clock source for SAI*/ + { + /* Configure the PLLSAI division factor */ + /* PLLSAI_VCO Input = PLL_SOURCE/PLLSAIM */ + if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + { + /* In Case the PLL Source is HSI (Internal Clock) */ + vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM)); + } + else + { + /* In Case the PLL Source is HSE (External Clock) */ + vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM))); + } + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ + tmpreg1 = (RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> 24U; + frequency = (vcoinput * ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> 6U)) / (tmpreg1); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ + tmpreg1 = (((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> 8U) + 1U); + frequency = frequency / (tmpreg1); + break; + } + case RCC_DCKCFGR_SAI1SRC_0: /* PLLI2S is the clock source for SAI*/ + case RCC_DCKCFGR_SAI2SRC_0: /* PLLI2S is the clock source for SAI*/ + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + { + /* In Case the PLL Source is HSI (Internal Clock) */ + vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* In Case the PLL Source is HSE (External Clock) */ + vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM))); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ + tmpreg1 = (RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> 24U; + frequency = (vcoinput * ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U)) / (tmpreg1); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ + tmpreg1 = ((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) + 1U); + frequency = frequency / (tmpreg1); + break; + } + case RCC_DCKCFGR_SAI1SRC_1: /* PLLR is the clock source for SAI*/ + case RCC_DCKCFGR_SAI2SRC_1: /* PLLR is the clock source for SAI*/ + { + /* Configure the PLLI2S division factor */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + { + /* In Case the PLL Source is HSI (Internal Clock) */ + vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* In Case the PLL Source is HSE (External Clock) */ + vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM))); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + /* SAI_CLK_x = PLL_VCO Output/PLLR */ + tmpreg1 = (RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U; + frequency = (vcoinput * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U)) / (tmpreg1); + break; + } + case RCC_DCKCFGR_SAI1SRC: /* External clock is the clock source for SAI*/ + { + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + case RCC_DCKCFGR_SAI2SRC: /* PLLSRC(HSE or HSI) is the clock source for SAI*/ + { + if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + { + /* In Case the PLL Source is HSI (Internal Clock) */ + frequency = (uint32_t)(HSI_VALUE); + } + else + { + /* In Case the PLL Source is HSE (External Clock) */ + frequency = (uint32_t)(HSE_VALUE); + } + break; + } + default : + { + break; + } + } + break; + } + case RCC_PERIPHCLK_I2S_APB1: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_APB1_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_PLLI2S: + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_PLLR: + { + /* Configure the PLL division factor R */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); + /* I2S_CLK = PLL_VCO Output/PLLR */ + frequency = (uint32_t)(vcooutput / (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); + break; + } + /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ + case RCC_I2SAPB1CLKSOURCE_PLLSRC: + { + if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + frequency = HSE_VALUE; + } + else + { + frequency = HSI_VALUE; + } + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + case RCC_PERIPHCLK_I2S_APB2: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_APB2_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_PLLI2S: + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_PLLR: + { + /* Configure the PLL division factor R */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); + /* I2S_CLK = PLL_VCO Output/PLLR */ + frequency = (uint32_t)(vcooutput / (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); + break; + } + /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ + case RCC_I2SAPB2CLKSOURCE_PLLSRC: + { + if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + frequency = HSE_VALUE; + } + else + { + frequency = HSI_VALUE; + } + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + default: + { + break; + } + } + return frequency; +} +#endif /* STM32F446xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Initializes the RCC extended peripherals clocks according to the specified + * parameters in the RCC_PeriphCLKInitTypeDef. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * contains the configuration information for the Extended Peripherals + * clocks(I2S, SAI, LTDC, RTC and TIM). + * + * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select + * the RTC clock source; in this case the Backup domain will be reset in + * order to modify the RTC Clock source, as consequence RTC registers (including + * the backup registers) and RCC_BDCR register are set to their reset values. + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tickstart = 0U; + uint32_t tmpreg1 = 0U; + uint32_t pllsaip = 0U; + uint32_t pllsaiq = 0U; + uint32_t pllsair = 0U; + + /* Check the parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + + /*--------------------------- CLK48 Configuration --------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) + { + /* Check the parameters */ + assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); + + /* Configure the CLK48 clock source */ + __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------ SDIO Configuration ------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) + { + /* Check the parameters */ + assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); + + /* Configure the SDIO clock source */ + __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*----------------------- SAI/I2S Configuration (PLLI2S) -------------------*/ + /*------------------- Common configuration SAI/I2S -------------------------*/ + /* In Case of SAI or I2S Clock Configuration through PLLI2S, PLLI2SN division + factor is common parameters for both peripherals */ + if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || + (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == RCC_PERIPHCLK_SAI_PLLI2S) || + (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); + + /* Disable the PLLI2S */ + __HAL_RCC_PLLI2S_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is disabled */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /*---------------------- I2S configuration -------------------------------*/ + /* In Case of I2S Clock Configuration through PLLI2S, PLLI2SR must be added + only for I2S configuration */ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == (RCC_PERIPHCLK_I2S)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x (PLLI2SN/PLLM) */ + /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SR); + } + + /*---------------------------- SAI configuration -------------------------*/ + /* In Case of SAI Clock Configuration through PLLI2S, PLLI2SQ and PLLI2S_DIVQ must + be added only for SAI configuration */ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == (RCC_PERIPHCLK_SAI_PLLI2S)) + { + /* Check the PLLI2S division factors */ + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); + + /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ + tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ + __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, tmpreg1); + /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ + __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); + } + + /*----------------- In Case of PLLI2S is just selected -----------------*/ + if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) + { + /* Check for Parameters */ + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + + /* Configure the PLLI2S multiplication and division factors */ + __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, + PeriphClkInit->PLLI2S.PLLI2SR); + } + + /* Enable the PLLI2S */ + __HAL_RCC_PLLI2S_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + /*--------------------------------------------------------------------------*/ + + /*----------------------- SAI/LTDC Configuration (PLLSAI) ------------------*/ + /*----------------------- Common configuration SAI/LTDC --------------------*/ + /* In Case of SAI, LTDC or CLK48 Clock Configuration through PLLSAI, PLLSAIN division + factor is common parameters for these peripherals */ + if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == RCC_PERIPHCLK_SAI_PLLSAI) || + (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && + (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP))) + { + /* Check the PLLSAI division factors */ + assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); + + /* Disable PLLSAI Clock */ + __HAL_RCC_PLLSAI_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLSAI is disabled */ + while (__HAL_RCC_PLLSAI_GET_FLAG() != RESET) + { + if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /*---------------------------- SAI configuration -------------------------*/ + /* In Case of SAI Clock Configuration through PLLSAI, PLLSAIQ and PLLSAI_DIVQ must + be added only for SAI configuration */ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == (RCC_PERIPHCLK_SAI_PLLSAI)) + { + assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); + assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); + + /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ + pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); + /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ + pllsair = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); + /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, pllsaip, PeriphClkInit->PLLSAI.PLLSAIQ, pllsair); + /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ + __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); + } + + /*---------------------------- LTDC configuration ------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == (RCC_PERIPHCLK_LTDC)) + { + assert_param(IS_RCC_PLLSAIR_VALUE(PeriphClkInit->PLLSAI.PLLSAIR)); + assert_param(IS_RCC_PLLSAI_DIVR_VALUE(PeriphClkInit->PLLSAIDivR)); + + /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ + pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); + /* Read PLLSAIQ value from PLLSAICFGR register (this value is not need for SAI configuration) */ + pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* LTDC_CLK(first level) = PLLSAI_VCO Output/PLLSAIR */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, pllsaip, pllsaiq, PeriphClkInit->PLLSAI.PLLSAIR); + /* LTDC_CLK = LTDC_CLK(first level)/PLLSAIDIVR */ + __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLSAIDivR); + } + + /*---------------------------- CLK48 configuration ------------------------*/ + /* Configure the PLLSAI when it is used as clock source for CLK48 */ + if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == (RCC_PERIPHCLK_CLK48)) && + (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP)) + { + assert_param(IS_RCC_PLLSAIP_VALUE(PeriphClkInit->PLLSAI.PLLSAIP)); + + /* Read PLLSAIQ value from PLLSAICFGR register (this value is not need for SAI configuration) */ + pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ + pllsair = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); + /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* CLK48_CLK(first level) = PLLSAI_VCO Output/PLLSAIP */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, PeriphClkInit->PLLSAI.PLLSAIP, pllsaiq, pllsair); + } + + /* Enable PLLSAI Clock */ + __HAL_RCC_PLLSAI_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLSAI is ready */ + while (__HAL_RCC_PLLSAI_GET_FLAG() == RESET) + { + if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + + /*--------------------------------------------------------------------------*/ + + /*---------------------------- RTC configuration ---------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) + { + /* Check for RTC Parameters used to output RTCCLK */ + assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); + + /* Enable Power Clock*/ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Enable write access to Backup domain */ + PWR->CR |= PWR_CR_DBP; + + /* Get tick */ + tickstart = HAL_GetTick(); + + while ((PWR->CR & PWR_CR_DBP) == RESET) + { + if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ + tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); + if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) + { + /* Store the content of BDCR register before the reset of Backup Domain */ + tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); + /* RTC Clock selection can be changed only if the Backup Domain is reset */ + __HAL_RCC_BACKUPRESET_FORCE(); + __HAL_RCC_BACKUPRESET_RELEASE(); + /* Restore the Content of BDCR register */ + RCC->BDCR = tmpreg1; + + /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ + if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- TIM configuration ---------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) + { + __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); + } + return HAL_OK; +} + +/** + * @brief Configures the RCC_PeriphCLKInitTypeDef according to the internal + * RCC configuration registers. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * will be configured. + * @retval None + */ +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tempreg; + + /* Set all possible values for the extended clock type parameter------------*/ + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_SAI_PLLSAI | \ + RCC_PERIPHCLK_SAI_PLLI2S | RCC_PERIPHCLK_LTDC | \ + RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC | \ + RCC_PERIPHCLK_CLK48 | RCC_PERIPHCLK_SDIO; + + /* Get the PLLI2S Clock configuration --------------------------------------*/ + PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); + PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); + /* Get the PLLSAI Clock configuration --------------------------------------*/ + PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); + PeriphClkInit->PLLSAI.PLLSAIR = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); + PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* Get the PLLSAI/PLLI2S division factors ----------------------------------*/ + PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); + PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); + PeriphClkInit->PLLSAIDivR = (uint32_t)(RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVR); + /* Get the RTC Clock configuration -----------------------------------------*/ + tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); + PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); + + /* Get the CLK48 clock configuration -------------------------------------*/ + PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); + + /* Get the SDIO clock configuration ----------------------------------------*/ + PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); + + if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; + } + else + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; + } +} + +/** + * @brief Return the peripheral clock frequency for a given peripheral(SAI..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + /* This variable used to store the I2S clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_I2S: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SCLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SCLKSOURCE_PLLI2S: + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + default: + { + break; + } + } + return frequency; +} +#endif /* STM32F469xx || STM32F479xx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Initializes the RCC extended peripherals clocks according to the specified + * parameters in the RCC_PeriphCLKInitTypeDef. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * contains the configuration information for the Extended Peripherals + * clocks(I2S, LTDC RTC and TIM). + * + * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select + * the RTC clock source; in this case the Backup domain will be reset in + * order to modify the RTC Clock source, as consequence RTC registers (including + * the backup registers) and RCC_BDCR register are set to their reset values. + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tickstart = 0U; + uint32_t tmpreg1 = 0U; +#if defined(STM32F413xx) || defined(STM32F423xx) + uint32_t plli2sq = 0U; +#endif /* STM32F413xx || STM32F423xx */ + uint32_t plli2sused = 0U; + + /* Check the peripheral clock selection parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + + /*----------------------------------- I2S APB1 configuration ---------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == (RCC_PERIPHCLK_I2S_APB1)) + { + /* Check the parameters */ + assert_param(IS_RCC_I2SAPB1CLKSOURCE(PeriphClkInit->I2sApb1ClockSelection)); + + /* Configure I2S Clock source */ + __HAL_RCC_I2S_APB1_CONFIG(PeriphClkInit->I2sApb1ClockSelection); + /* Enable the PLLI2S when it's used as clock source for I2S */ + if (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S) + { + plli2sused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*----------------------------------- I2S APB2 configuration ---------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == (RCC_PERIPHCLK_I2S_APB2)) + { + /* Check the parameters */ + assert_param(IS_RCC_I2SAPB2CLKSOURCE(PeriphClkInit->I2sApb2ClockSelection)); + + /* Configure I2S Clock source */ + __HAL_RCC_I2S_APB2_CONFIG(PeriphClkInit->I2sApb2ClockSelection); + /* Enable the PLLI2S when it's used as clock source for I2S */ + if (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S) + { + plli2sused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + +#if defined(STM32F413xx) || defined(STM32F423xx) + /*----------------------- SAI1 Block A configuration -----------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIA) == (RCC_PERIPHCLK_SAIA)) + { + /* Check the parameters */ + assert_param(IS_RCC_SAIACLKSOURCE(PeriphClkInit->SaiAClockSelection)); + + /* Configure SAI1 Clock source */ + __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(PeriphClkInit->SaiAClockSelection); + /* Enable the PLLI2S when it's used as clock source for SAI */ + if (PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLI2SR) + { + plli2sused = 1U; + } + /* Enable the PLLSAI when it's used as clock source for SAI */ + if (PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLR) + { + /* Check for PLL/DIVR parameters */ + assert_param(IS_RCC_PLL_DIVR_VALUE(PeriphClkInit->PLLDivR)); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLDIVR */ + __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLDivR); + } + } + /*--------------------------------------------------------------------------*/ + + /*---------------------- SAI1 Block B configuration ------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIB) == (RCC_PERIPHCLK_SAIB)) + { + /* Check the parameters */ + assert_param(IS_RCC_SAIBCLKSOURCE(PeriphClkInit->SaiBClockSelection)); + + /* Configure SAI1 Clock source */ + __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(PeriphClkInit->SaiBClockSelection); + /* Enable the PLLI2S when it's used as clock source for SAI */ + if (PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLI2SR) + { + plli2sused = 1U; + } + /* Enable the PLLSAI when it's used as clock source for SAI */ + if (PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLR) + { + /* Check for PLL/DIVR parameters */ + assert_param(IS_RCC_PLL_DIVR_VALUE(PeriphClkInit->PLLDivR)); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLDIVR */ + __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLDivR); + } + } + /*--------------------------------------------------------------------------*/ +#endif /* STM32F413xx || STM32F423xx */ + + /*------------------------------------ RTC configuration -------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) + { + /* Check for RTC Parameters used to output RTCCLK */ + assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); + + /* Enable Power Clock*/ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Enable write access to Backup domain */ + PWR->CR |= PWR_CR_DBP; + + /* Get tick */ + tickstart = HAL_GetTick(); + + while ((PWR->CR & PWR_CR_DBP) == RESET) + { + if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ + tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); + if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) + { + /* Store the content of BDCR register before the reset of Backup Domain */ + tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); + /* RTC Clock selection can be changed only if the Backup Domain is reset */ + __HAL_RCC_BACKUPRESET_FORCE(); + __HAL_RCC_BACKUPRESET_RELEASE(); + /* Restore the Content of BDCR register */ + RCC->BDCR = tmpreg1; + + /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ + if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------------ TIM configuration -------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) + { + /* Configure Timer Prescaler */ + __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------------- FMPI2C1 Configuration --------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) + { + /* Check the parameters */ + assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); + + /* Configure the FMPI2C1 clock source */ + __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------------- CLK48 Configuration ----------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) + { + /* Check the parameters */ + assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); + + /* Configure the SDIO clock source */ + __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); + + /* Enable the PLLI2S when it's used as clock source for CLK48 */ + if (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ) + { + plli2sused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------------- SDIO Configuration -----------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) + { + /* Check the parameters */ + assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); + + /* Configure the SDIO clock source */ + __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*-------------------------------------- PLLI2S Configuration --------------*/ + /* PLLI2S is configured when a peripheral will use it as source clock : I2S on APB1 or + I2S on APB2*/ + if ((plli2sused == 1U) || (PeriphClkInit->PeriphClockSelection == RCC_PERIPHCLK_PLLI2S)) + { + /* Disable the PLLI2S */ + __HAL_RCC_PLLI2S_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is disabled */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /* check for common PLLI2S Parameters */ + assert_param(IS_RCC_PLLI2SCLKSOURCE(PeriphClkInit->PLLI2SSelection)); + assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); + assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); + /*-------------------- Set the PLL I2S clock -----------------------------*/ + __HAL_RCC_PLL_I2S_CONFIG(PeriphClkInit->PLLI2SSelection); + + /*------- In Case of PLLI2S is selected as source clock for I2S ----------*/ + if (((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == RCC_PERIPHCLK_I2S_APB1) + && (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == RCC_PERIPHCLK_I2S_APB2) && (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) && (PeriphClkInit->SdioClockSelection == RCC_SDIOCLKSOURCE_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLI2SQ))) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ + /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, + PeriphClkInit->PLLI2S.PLLI2SR); + } + +#if defined(STM32F413xx) || defined(STM32F423xx) + /*------- In Case of PLLI2S is selected as source clock for SAI ----------*/ + if (((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIA) == RCC_PERIPHCLK_SAIA) + && (PeriphClkInit->SaiAClockSelection == RCC_SAIACLKSOURCE_PLLI2SR)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAIB) == RCC_PERIPHCLK_SAIB) && (PeriphClkInit->SaiBClockSelection == RCC_SAIBCLKSOURCE_PLLI2SR))) + { + /* Check for PLLI2S Parameters */ + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + /* Check for PLLI2S/DIVR parameters */ + assert_param(IS_RCC_PLLI2S_DIVR_VALUE(PeriphClkInit->PLLI2SDivR)); + + /* Read PLLI2SQ value from PLLI2SCFGR register (this value is not needed for SAI configuration) */ + plli2sq = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, plli2sq, + PeriphClkInit->PLLI2S.PLLI2SR); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVR */ + __HAL_RCC_PLLI2S_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLI2SDivR); + } +#endif /* STM32F413xx || STM32F423xx */ + + /*----------------- In Case of PLLI2S is just selected ------------------*/ + if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) + { + /* Check for Parameters */ + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ + /* SPDIFRXCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, + PeriphClkInit->PLLI2S.PLLI2SR); + } + + /* Enable the PLLI2S */ + __HAL_RCC_PLLI2S_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + /*--------------------------------------------------------------------------*/ + + /*-------------------- DFSDM1 clock source configuration -------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1) == RCC_PERIPHCLK_DFSDM1) + { + /* Check the parameters */ + assert_param(IS_RCC_DFSDM1CLKSOURCE(PeriphClkInit->Dfsdm1ClockSelection)); + + /* Configure the DFSDM1 interface clock source */ + __HAL_RCC_DFSDM1_CONFIG(PeriphClkInit->Dfsdm1ClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*-------------------- DFSDM1 Audio clock source configuration -------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1_AUDIO) == RCC_PERIPHCLK_DFSDM1_AUDIO) + { + /* Check the parameters */ + assert_param(IS_RCC_DFSDM1AUDIOCLKSOURCE(PeriphClkInit->Dfsdm1AudioClockSelection)); + + /* Configure the DFSDM1 Audio interface clock source */ + __HAL_RCC_DFSDM1AUDIO_CONFIG(PeriphClkInit->Dfsdm1AudioClockSelection); + } + /*--------------------------------------------------------------------------*/ + +#if defined(STM32F413xx) || defined(STM32F423xx) + /*-------------------- DFSDM2 clock source configuration -------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM2) == RCC_PERIPHCLK_DFSDM2) + { + /* Check the parameters */ + assert_param(IS_RCC_DFSDM2CLKSOURCE(PeriphClkInit->Dfsdm2ClockSelection)); + + /* Configure the DFSDM1 interface clock source */ + __HAL_RCC_DFSDM2_CONFIG(PeriphClkInit->Dfsdm2ClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*-------------------- DFSDM2 Audio clock source configuration -------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM2_AUDIO) == RCC_PERIPHCLK_DFSDM2_AUDIO) + { + /* Check the parameters */ + assert_param(IS_RCC_DFSDM2AUDIOCLKSOURCE(PeriphClkInit->Dfsdm2AudioClockSelection)); + + /* Configure the DFSDM1 Audio interface clock source */ + __HAL_RCC_DFSDM2AUDIO_CONFIG(PeriphClkInit->Dfsdm2AudioClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- LPTIM1 Configuration ------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == RCC_PERIPHCLK_LPTIM1) + { + /* Check the parameters */ + assert_param(IS_RCC_LPTIM1CLKSOURCE(PeriphClkInit->Lptim1ClockSelection)); + + /* Configure the LPTIM1 clock source */ + __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection); + } + /*--------------------------------------------------------------------------*/ +#endif /* STM32F413xx || STM32F423xx */ + + return HAL_OK; +} + +/** + * @brief Get the RCC_PeriphCLKInitTypeDef according to the internal + * RCC configuration registers. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * will be configured. + * @retval None + */ +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tempreg; + + /* Set all possible values for the extended clock type parameter------------*/ +#if defined(STM32F413xx) || defined(STM32F423xx) + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 | \ + RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC | \ + RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_CLK48 | \ + RCC_PERIPHCLK_SDIO | RCC_PERIPHCLK_DFSDM1 | \ + RCC_PERIPHCLK_DFSDM1_AUDIO | RCC_PERIPHCLK_DFSDM2 | \ + RCC_PERIPHCLK_DFSDM2_AUDIO | RCC_PERIPHCLK_LPTIM1 | \ + RCC_PERIPHCLK_SAIA | RCC_PERIPHCLK_SAIB; +#else /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 | \ + RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC | \ + RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_CLK48 | \ + RCC_PERIPHCLK_SDIO | RCC_PERIPHCLK_DFSDM1 | \ + RCC_PERIPHCLK_DFSDM1_AUDIO; +#endif /* STM32F413xx || STM32F423xx */ + + + + /* Get the PLLI2S Clock configuration --------------------------------------*/ + PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM) >> RCC_PLLI2SCFGR_PLLI2SM_Pos); + PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); + PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); + PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); +#if defined(STM32F413xx) || defined(STM32F423xx) + /* Get the PLL/PLLI2S division factors -------------------------------------*/ + PeriphClkInit->PLLI2SDivR = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVR) >> RCC_DCKCFGR_PLLI2SDIVR_Pos); + PeriphClkInit->PLLDivR = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLDIVR) >> RCC_DCKCFGR_PLLDIVR_Pos); +#endif /* STM32F413xx || STM32F423xx */ + + /* Get the I2S APB1 clock configuration ------------------------------------*/ + PeriphClkInit->I2sApb1ClockSelection = __HAL_RCC_GET_I2S_APB1_SOURCE(); + + /* Get the I2S APB2 clock configuration ------------------------------------*/ + PeriphClkInit->I2sApb2ClockSelection = __HAL_RCC_GET_I2S_APB2_SOURCE(); + + /* Get the RTC Clock configuration -----------------------------------------*/ + tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); + PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); + + /* Get the FMPI2C1 clock configuration -------------------------------------*/ + PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); + + /* Get the CLK48 clock configuration ---------------------------------------*/ + PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); + + /* Get the SDIO clock configuration ----------------------------------------*/ + PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); + + /* Get the DFSDM1 clock configuration --------------------------------------*/ + PeriphClkInit->Dfsdm1ClockSelection = __HAL_RCC_GET_DFSDM1_SOURCE(); + + /* Get the DFSDM1 Audio clock configuration --------------------------------*/ + PeriphClkInit->Dfsdm1AudioClockSelection = __HAL_RCC_GET_DFSDM1AUDIO_SOURCE(); + +#if defined(STM32F413xx) || defined(STM32F423xx) + /* Get the DFSDM2 clock configuration --------------------------------------*/ + PeriphClkInit->Dfsdm2ClockSelection = __HAL_RCC_GET_DFSDM2_SOURCE(); + + /* Get the DFSDM2 Audio clock configuration --------------------------------*/ + PeriphClkInit->Dfsdm2AudioClockSelection = __HAL_RCC_GET_DFSDM2AUDIO_SOURCE(); + + /* Get the LPTIM1 clock configuration --------------------------------------*/ + PeriphClkInit->Lptim1ClockSelection = __HAL_RCC_GET_LPTIM1_SOURCE(); + + /* Get the SAI1 Block Aclock configuration ---------------------------------*/ + PeriphClkInit->SaiAClockSelection = __HAL_RCC_GET_SAI_BLOCKA_SOURCE(); + + /* Get the SAI1 Block B clock configuration --------------------------------*/ + PeriphClkInit->SaiBClockSelection = __HAL_RCC_GET_SAI_BLOCKB_SOURCE(); +#endif /* STM32F413xx || STM32F423xx */ + + /* Get the TIM Prescaler configuration -------------------------------------*/ + if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; + } + else + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; + } +} + +/** + * @brief Return the peripheral clock frequency for a given peripheral(I2S..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_I2S_APB1: I2S APB1 peripheral clock + * @arg RCC_PERIPHCLK_I2S_APB2: I2S APB2 peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + /* This variable used to store the I2S clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_I2S_APB1: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_APB1_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_PLLI2S: + { + if ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SSRC) == RCC_PLLI2SCFGR_PLLI2SSRC) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(EXTERNAL_CLOCK_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + } + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_PLLR: + { + /* Configure the PLL division factor R */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); + /* I2S_CLK = PLL_VCO Output/PLLR */ + frequency = (uint32_t)(vcooutput / (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); + break; + } + /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ + case RCC_I2SAPB1CLKSOURCE_PLLSRC: + { + if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + frequency = HSE_VALUE; + } + else + { + frequency = HSI_VALUE; + } + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + case RCC_PERIPHCLK_I2S_APB2: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_APB2_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_PLLI2S: + { + if ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SSRC) == RCC_PLLI2SCFGR_PLLI2SSRC) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(EXTERNAL_CLOCK_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + } + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_PLLR: + { + /* Configure the PLL division factor R */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); + /* I2S_CLK = PLL_VCO Output/PLLR */ + frequency = (uint32_t)(vcooutput / (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); + break; + } + /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ + case RCC_I2SAPB2CLKSOURCE_PLLSRC: + { + if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + frequency = HSE_VALUE; + } + else + { + frequency = HSI_VALUE; + } + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + default: + { + break; + } + } + return frequency; +} +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** + * @brief Initializes the RCC extended peripherals clocks according to the specified parameters in the + * RCC_PeriphCLKInitTypeDef. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * contains the configuration information for the Extended Peripherals clocks(I2S and RTC clocks). + * + * @note A caution to be taken when HAL_RCCEx_PeriphCLKConfig() is used to select RTC clock selection, in this case + * the Reset of Backup domain will be applied in order to modify the RTC Clock source as consequence all backup + * domain (RTC and RCC_BDCR register expect BKPSRAM) will be reset + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tickstart = 0U; + uint32_t tmpreg1 = 0U; + + /* Check the parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + + /*---------------------------- RTC configuration ---------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) + { + /* Check for RTC Parameters used to output RTCCLK */ + assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); + + /* Enable Power Clock*/ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Enable write access to Backup domain */ + PWR->CR |= PWR_CR_DBP; + + /* Get tick */ + tickstart = HAL_GetTick(); + + while ((PWR->CR & PWR_CR_DBP) == RESET) + { + if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ + tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); + if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) + { + /* Store the content of BDCR register before the reset of Backup Domain */ + tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); + /* RTC Clock selection can be changed only if the Backup Domain is reset */ + __HAL_RCC_BACKUPRESET_FORCE(); + __HAL_RCC_BACKUPRESET_RELEASE(); + /* Restore the Content of BDCR register */ + RCC->BDCR = tmpreg1; + + /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ + if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- TIM configuration ---------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) + { + __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- FMPI2C1 Configuration -----------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) + { + /* Check the parameters */ + assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); + + /* Configure the FMPI2C1 clock source */ + __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- LPTIM1 Configuration ------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == RCC_PERIPHCLK_LPTIM1) + { + /* Check the parameters */ + assert_param(IS_RCC_LPTIM1CLKSOURCE(PeriphClkInit->Lptim1ClockSelection)); + + /* Configure the LPTIM1 clock source */ + __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection); + } + + /*---------------------------- I2S Configuration ---------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) + { + /* Check the parameters */ + assert_param(IS_RCC_I2SAPBCLKSOURCE(PeriphClkInit->I2SClockSelection)); + + /* Configure the I2S clock source */ + __HAL_RCC_I2S_CONFIG(PeriphClkInit->I2SClockSelection); + } + + return HAL_OK; +} + +/** + * @brief Configures the RCC_OscInitStruct according to the internal + * RCC configuration registers. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * will be configured. + * @retval None + */ +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tempreg; + + /* Set all possible values for the extended clock type parameter------------*/ + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_FMPI2C1 | RCC_PERIPHCLK_LPTIM1 | RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC; + + tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); + PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); + + if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; + } + else + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; + } + /* Get the FMPI2C1 clock configuration -------------------------------------*/ + PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); + + /* Get the I2S clock configuration -----------------------------------------*/ + PeriphClkInit->I2SClockSelection = __HAL_RCC_GET_I2S_SOURCE(); + + +} +/** + * @brief Return the peripheral clock frequency for a given peripheral(SAI..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + /* This variable used to store the I2S clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_I2S: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SAPBCLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ + case RCC_I2SAPBCLKSOURCE_PLLR: + { + /* Configure the PLL division factor R */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); + /* I2S_CLK = PLL_VCO Output/PLLR */ + frequency = (uint32_t)(vcooutput / (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); + break; + } + /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ + case RCC_I2SAPBCLKSOURCE_PLLSRC: + { + if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + frequency = HSE_VALUE; + } + else + { + frequency = HSI_VALUE; + } + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + default: + { + break; + } + } + return frequency; +} +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) +/** + * @brief Initializes the RCC extended peripherals clocks according to the specified + * parameters in the RCC_PeriphCLKInitTypeDef. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * contains the configuration information for the Extended Peripherals + * clocks(I2S, SAI, LTDC RTC and TIM). + * + * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select + * the RTC clock source; in this case the Backup domain will be reset in + * order to modify the RTC Clock source, as consequence RTC registers (including + * the backup registers) and RCC_BDCR register are set to their reset values. + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tickstart = 0U; + uint32_t tmpreg1 = 0U; + + /* Check the parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + + /*----------------------- SAI/I2S Configuration (PLLI2S) -------------------*/ + /*----------------------- Common configuration SAI/I2S ---------------------*/ + /* In Case of SAI or I2S Clock Configuration through PLLI2S, PLLI2SN division + factor is common parameters for both peripherals */ + if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || + (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == RCC_PERIPHCLK_SAI_PLLI2S) || + (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); + + /* Disable the PLLI2S */ + __HAL_RCC_PLLI2S_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is disabled */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /*---------------------------- I2S configuration -------------------------*/ + /* In Case of I2S Clock Configuration through PLLI2S, PLLI2SR must be added + only for I2S configuration */ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == (RCC_PERIPHCLK_I2S)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLM) */ + /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SR); + } + + /*---------------------------- SAI configuration -------------------------*/ + /* In Case of SAI Clock Configuration through PLLI2S, PLLI2SQ and PLLI2S_DIVQ must + be added only for SAI configuration */ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLI2S) == (RCC_PERIPHCLK_SAI_PLLI2S)) + { + /* Check the PLLI2S division factors */ + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); + + /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ + tmpreg1 = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ + __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, tmpreg1); + /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ + __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); + } + + /*----------------- In Case of PLLI2S is just selected -----------------*/ + if ((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) + { + /* Check for Parameters */ + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + + /* Configure the PLLI2S multiplication and division factors */ + __HAL_RCC_PLLI2S_SAICLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SQ, + PeriphClkInit->PLLI2S.PLLI2SR); + } + + /* Enable the PLLI2S */ + __HAL_RCC_PLLI2S_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + /*--------------------------------------------------------------------------*/ + + /*----------------------- SAI/LTDC Configuration (PLLSAI) ------------------*/ + /*----------------------- Common configuration SAI/LTDC --------------------*/ + /* In Case of SAI or LTDC Clock Configuration through PLLSAI, PLLSAIN division + factor is common parameters for both peripherals */ + if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == RCC_PERIPHCLK_SAI_PLLSAI) || + (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC)) + { + /* Check the PLLSAI division factors */ + assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); + + /* Disable PLLSAI Clock */ + __HAL_RCC_PLLSAI_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLSAI is disabled */ + while (__HAL_RCC_PLLSAI_GET_FLAG() != RESET) + { + if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /*---------------------------- SAI configuration -------------------------*/ + /* In Case of SAI Clock Configuration through PLLSAI, PLLSAIQ and PLLSAI_DIVQ must + be added only for SAI configuration */ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI_PLLSAI) == (RCC_PERIPHCLK_SAI_PLLSAI)) + { + assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); + assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); + + /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ + tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); + /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, PeriphClkInit->PLLSAI.PLLSAIQ, tmpreg1); + /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ + __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); + } + + /*---------------------------- LTDC configuration ------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == (RCC_PERIPHCLK_LTDC)) + { + assert_param(IS_RCC_PLLSAIR_VALUE(PeriphClkInit->PLLSAI.PLLSAIR)); + assert_param(IS_RCC_PLLSAI_DIVR_VALUE(PeriphClkInit->PLLSAIDivR)); + + /* Read PLLSAIR value from PLLSAICFGR register (this value is not need for SAI configuration) */ + tmpreg1 = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* LTDC_CLK(first level) = PLLSAI_VCO Output/PLLSAIR */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIN, tmpreg1, PeriphClkInit->PLLSAI.PLLSAIR); + /* LTDC_CLK = LTDC_CLK(first level)/PLLSAIDIVR */ + __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(PeriphClkInit->PLLSAIDivR); + } + /* Enable PLLSAI Clock */ + __HAL_RCC_PLLSAI_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLSAI is ready */ + while (__HAL_RCC_PLLSAI_GET_FLAG() == RESET) + { + if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- RTC configuration ---------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) + { + /* Check for RTC Parameters used to output RTCCLK */ + assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); + + /* Enable Power Clock*/ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Enable write access to Backup domain */ + PWR->CR |= PWR_CR_DBP; + + /* Get tick */ + tickstart = HAL_GetTick(); + + while ((PWR->CR & PWR_CR_DBP) == RESET) + { + if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ + tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); + if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) + { + /* Store the content of BDCR register before the reset of Backup Domain */ + tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); + /* RTC Clock selection can be changed only if the Backup Domain is reset */ + __HAL_RCC_BACKUPRESET_FORCE(); + __HAL_RCC_BACKUPRESET_RELEASE(); + /* Restore the Content of BDCR register */ + RCC->BDCR = tmpreg1; + + /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ + if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- TIM configuration ---------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) + { + __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); + } + return HAL_OK; +} + +/** + * @brief Configures the PeriphClkInit according to the internal + * RCC configuration registers. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * will be configured. + * @retval None + */ +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tempreg; + + /* Set all possible values for the extended clock type parameter------------*/ + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_SAI_PLLSAI | RCC_PERIPHCLK_SAI_PLLI2S | RCC_PERIPHCLK_LTDC | RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC; + + /* Get the PLLI2S Clock configuration -----------------------------------------------*/ + PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); + PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); + /* Get the PLLSAI Clock configuration -----------------------------------------------*/ + PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); + PeriphClkInit->PLLSAI.PLLSAIR = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIR) >> RCC_PLLSAICFGR_PLLSAIR_Pos); + PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* Get the PLLSAI/PLLI2S division factors -----------------------------------------------*/ + PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); + PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); + PeriphClkInit->PLLSAIDivR = (uint32_t)(RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVR); + /* Get the RTC Clock configuration -----------------------------------------------*/ + tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); + PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); + + if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; + } + else + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; + } +} + +/** + * @brief Return the peripheral clock frequency for a given peripheral(SAI..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + /* This variable used to store the I2S clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_I2S: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SCLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SCLKSOURCE_PLLI2S: + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ + if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + default: + { + break; + } + } + return frequency; +} +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) +/** + * @brief Initializes the RCC extended peripherals clocks according to the specified parameters in the + * RCC_PeriphCLKInitTypeDef. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * contains the configuration information for the Extended Peripherals clocks(I2S and RTC clocks). + * + * @note A caution to be taken when HAL_RCCEx_PeriphCLKConfig() is used to select RTC clock selection, in this case + * the Reset of Backup domain will be applied in order to modify the RTC Clock source as consequence all backup + * domain (RTC and RCC_BDCR register expect BKPSRAM) will be reset + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tickstart = 0U; + uint32_t tmpreg1 = 0U; + + /* Check the parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + + /*---------------------------- I2S configuration ---------------------------*/ + if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || + (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); +#if defined(STM32F411xE) + assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); +#endif /* STM32F411xE */ + /* Disable the PLLI2S */ + __HAL_RCC_PLLI2S_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is disabled */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + +#if defined(STM32F411xE) + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ + /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ + __HAL_RCC_PLLI2S_I2SCLK_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN, + PeriphClkInit->PLLI2S.PLLI2SR); +#else + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLM) */ + /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SN, PeriphClkInit->PLLI2S.PLLI2SR); +#endif /* STM32F411xE */ + + /* Enable the PLLI2S */ + __HAL_RCC_PLLI2S_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + + /*---------------------------- RTC configuration ---------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) + { + /* Check for RTC Parameters used to output RTCCLK */ + assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); + + /* Enable Power Clock*/ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Enable write access to Backup domain */ + PWR->CR |= PWR_CR_DBP; + + /* Get tick */ + tickstart = HAL_GetTick(); + + while ((PWR->CR & PWR_CR_DBP) == RESET) + { + if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ + tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); + if ((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) + { + /* Store the content of BDCR register before the reset of Backup Domain */ + tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); + /* RTC Clock selection can be changed only if the Backup Domain is reset */ + __HAL_RCC_BACKUPRESET_FORCE(); + __HAL_RCC_BACKUPRESET_RELEASE(); + /* Restore the Content of BDCR register */ + RCC->BDCR = tmpreg1; + + /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ + if (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + } +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) + /*---------------------------- TIM configuration ---------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) + { + __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); + } +#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ + return HAL_OK; +} + +/** + * @brief Configures the RCC_OscInitStruct according to the internal + * RCC configuration registers. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * will be configured. + * @retval None + */ +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tempreg; + + /* Set all possible values for the extended clock type parameter------------*/ + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_RTC; + + /* Get the PLLI2S Clock configuration --------------------------------------*/ + PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); + PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); +#if defined(STM32F411xE) + PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM); +#endif /* STM32F411xE */ + /* Get the RTC Clock configuration -----------------------------------------*/ + tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); + PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) + /* Get the TIM Prescaler configuration -------------------------------------*/ + if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; + } + else + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; + } +#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ +} + +/** + * @brief Return the peripheral clock frequency for a given peripheral(SAI..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + /* This variable used to store the I2S clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_I2S: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SCLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SCLKSOURCE_PLLI2S: + { +#if defined(STM32F411xE) + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } +#else + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ + if ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } +#endif /* STM32F411xE */ + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput / (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + default: + { + break; + } + } + return frequency; +} +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Select LSE mode + * + * @note This mode is only available for STM32F410xx/STM32F411xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices. + * + * @param Mode specifies the LSE mode. + * This parameter can be one of the following values: + * @arg RCC_LSE_LOWPOWER_MODE: LSE oscillator in low power mode selection + * @arg RCC_LSE_HIGHDRIVE_MODE: LSE oscillator in High Drive mode selection + * @retval None + */ +void HAL_RCCEx_SelectLSEMode(uint8_t Mode) +{ + /* Check the parameters */ + assert_param(IS_RCC_LSE_MODE(Mode)); + if (Mode == RCC_LSE_HIGHDRIVE_MODE) + { + SET_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); + } + else + { + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); + } +} + +#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +/** @defgroup RCCEx_Exported_Functions_Group2 Extended Clock management functions + * @brief Extended Clock management functions + * +@verbatim + =============================================================================== + ##### Extended clock management functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the + activation or deactivation of PLLI2S, PLLSAI. +@endverbatim + * @{ + */ + +#if defined(RCC_PLLI2S_SUPPORT) +/** + * @brief Enable PLLI2S. + * @param PLLI2SInit pointer to an RCC_PLLI2SInitTypeDef structure that + * contains the configuration information for the PLLI2S + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_EnablePLLI2S(RCC_PLLI2SInitTypeDef *PLLI2SInit) +{ + uint32_t tickstart; + + /* Check for parameters */ + assert_param(IS_RCC_PLLI2SN_VALUE(PLLI2SInit->PLLI2SN)); + assert_param(IS_RCC_PLLI2SR_VALUE(PLLI2SInit->PLLI2SR)); +#if defined(RCC_PLLI2SCFGR_PLLI2SM) + assert_param(IS_RCC_PLLI2SM_VALUE(PLLI2SInit->PLLI2SM)); +#endif /* RCC_PLLI2SCFGR_PLLI2SM */ +#if defined(RCC_PLLI2SCFGR_PLLI2SP) + assert_param(IS_RCC_PLLI2SP_VALUE(PLLI2SInit->PLLI2SP)); +#endif /* RCC_PLLI2SCFGR_PLLI2SP */ +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) + assert_param(IS_RCC_PLLI2SQ_VALUE(PLLI2SInit->PLLI2SQ)); +#endif /* RCC_PLLI2SCFGR_PLLI2SQ */ + + /* Disable the PLLI2S */ + __HAL_RCC_PLLI2S_DISABLE(); + + /* Wait till PLLI2S is disabled */ + tickstart = HAL_GetTick(); + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /* Configure the PLLI2S division factors */ +#if defined(STM32F446xx) + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ + /* I2SPCLK = PLLI2S_VCO / PLLI2SP */ + /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ + /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, \ + PLLI2SInit->PLLI2SP, PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); +#elif defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM)*/ + /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ + /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, \ + PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); +#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * PLLI2SN */ + /* I2SQCLK = PLLI2S_VCO / PLLI2SQ */ + /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ + __HAL_RCC_PLLI2S_SAICLK_CONFIG(PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SQ, PLLI2SInit->PLLI2SR); +#elif defined(STM32F411xE) + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ + /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ + __HAL_RCC_PLLI2S_I2SCLK_CONFIG(PLLI2SInit->PLLI2SM, PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SR); +#else + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) x PLLI2SN */ + /* I2SRCLK = PLLI2S_VCO / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SN, PLLI2SInit->PLLI2SR); +#endif /* STM32F446xx */ + + /* Enable the PLLI2S */ + __HAL_RCC_PLLI2S_ENABLE(); + + /* Wait till PLLI2S is ready */ + tickstart = HAL_GetTick(); + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + return HAL_OK; +} + +/** + * @brief Disable PLLI2S. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_DisablePLLI2S(void) +{ + uint32_t tickstart; + + /* Disable the PLLI2S */ + __HAL_RCC_PLLI2S_DISABLE(); + + /* Wait till PLLI2S is disabled */ + tickstart = HAL_GetTick(); + while (READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + return HAL_OK; +} + +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** + * @brief Enable PLLSAI. + * @param PLLSAIInit pointer to an RCC_PLLSAIInitTypeDef structure that + * contains the configuration information for the PLLSAI + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI(RCC_PLLSAIInitTypeDef *PLLSAIInit) +{ + uint32_t tickstart; + + /* Check for parameters */ + assert_param(IS_RCC_PLLSAIN_VALUE(PLLSAIInit->PLLSAIN)); + assert_param(IS_RCC_PLLSAIQ_VALUE(PLLSAIInit->PLLSAIQ)); +#if defined(RCC_PLLSAICFGR_PLLSAIM) + assert_param(IS_RCC_PLLSAIM_VALUE(PLLSAIInit->PLLSAIM)); +#endif /* RCC_PLLSAICFGR_PLLSAIM */ +#if defined(RCC_PLLSAICFGR_PLLSAIP) + assert_param(IS_RCC_PLLSAIP_VALUE(PLLSAIInit->PLLSAIP)); +#endif /* RCC_PLLSAICFGR_PLLSAIP */ +#if defined(RCC_PLLSAICFGR_PLLSAIR) + assert_param(IS_RCC_PLLSAIR_VALUE(PLLSAIInit->PLLSAIR)); +#endif /* RCC_PLLSAICFGR_PLLSAIR */ + + /* Disable the PLLSAI */ + __HAL_RCC_PLLSAI_DISABLE(); + + /* Wait till PLLSAI is disabled */ + tickstart = HAL_GetTick(); + while (__HAL_RCC_PLLSAI_GET_FLAG() != RESET) + { + if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /* Configure the PLLSAI division factors */ +#if defined(STM32F446xx) + /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * (PLLSAIN/PLLSAIM) */ + /* SAIPCLK = PLLSAI_VCO / PLLSAIP */ + /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ + /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ + __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIM, PLLSAIInit->PLLSAIN, \ + PLLSAIInit->PLLSAIP, PLLSAIInit->PLLSAIQ, 0U); +#elif defined(STM32F469xx) || defined(STM32F479xx) + /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * PLLSAIN */ + /* SAIPCLK = PLLSAI_VCO / PLLSAIP */ + /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ + /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ + __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIN, PLLSAIInit->PLLSAIP, \ + PLLSAIInit->PLLSAIQ, PLLSAIInit->PLLSAIR); +#else + /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) x PLLSAIN */ + /* SAIQCLK = PLLSAI_VCO / PLLSAIQ */ + /* SAIRCLK = PLLSAI_VCO / PLLSAIR */ + __HAL_RCC_PLLSAI_CONFIG(PLLSAIInit->PLLSAIN, PLLSAIInit->PLLSAIQ, PLLSAIInit->PLLSAIR); +#endif /* STM32F446xx */ + + /* Enable the PLLSAI */ + __HAL_RCC_PLLSAI_ENABLE(); + + /* Wait till PLLSAI is ready */ + tickstart = HAL_GetTick(); + while (__HAL_RCC_PLLSAI_GET_FLAG() == RESET) + { + if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + return HAL_OK; +} + +/** + * @brief Disable PLLSAI. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI(void) +{ + uint32_t tickstart; + + /* Disable the PLLSAI */ + __HAL_RCC_PLLSAI_DISABLE(); + + /* Wait till PLLSAI is disabled */ + tickstart = HAL_GetTick(); + while (__HAL_RCC_PLLSAI_GET_FLAG() != RESET) + { + if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + return HAL_OK; +} + +#endif /* RCC_PLLSAI_SUPPORT */ + +/** + * @} + */ + +#if defined(STM32F446xx) +/** + * @brief Returns the SYSCLK frequency + * + * @note This function implementation is valid only for STM32F446xx devices. + * @note This function add the PLL/PLLR System clock source + * + * @note The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*) + * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(**) + * @note If SYSCLK source is PLL or PLLR, function returns values based on HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * @note (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * @note (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 25 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * @note The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @note This function can be used by the user application to compute the + * baudrate for the communication peripherals or configure other parameters. + * + * @note Each time SYSCLK changes, this function must be called to update the + * right SYSCLK value. Otherwise, any configuration based on this function will be incorrect. + * + * + * @retval SYSCLK frequency + */ +uint32_t HAL_RCC_GetSysClockFreq(void) +{ + uint32_t pllm = 0U; + uint32_t pllvco = 0U; + uint32_t pllp = 0U; + uint32_t pllr = 0U; + uint32_t sysclockfreq = 0U; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (RCC->CFGR & RCC_CFGR_SWS) + { + case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */ + { + sysclockfreq = HSI_VALUE; + break; + } + case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ + { + sysclockfreq = HSE_VALUE; + break; + } + case RCC_CFGR_SWS_PLL: /* PLL/PLLP used as system clock source */ + { + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + SYSCLK = PLL_VCO / PLLP */ + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + if (__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) + { + /* HSE used as PLL clock source */ + pllvco = (uint32_t)((((uint64_t) HSE_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (uint32_t)((((uint64_t) HSI_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + } + pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1U) * 2U); + + sysclockfreq = pllvco / pllp; + break; + } + case RCC_CFGR_SWS_PLLR: /* PLL/PLLR used as system clock source */ + { + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + SYSCLK = PLL_VCO / PLLR */ + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + if (__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) + { + /* HSE used as PLL clock source */ + pllvco = (uint32_t)((((uint64_t) HSE_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (uint32_t)((((uint64_t) HSI_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + } + pllr = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos); + + sysclockfreq = pllvco / pllr; + break; + } + default: + { + sysclockfreq = HSI_VALUE; + break; + } + } + return sysclockfreq; +} +#endif /* STM32F446xx */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @brief Resets the RCC clock configuration to the default reset state. + * @note The default reset state of the clock configuration is given below: + * - HSI ON and used as system clock source + * - HSE, PLL, PLLI2S and PLLSAI OFF + * - AHB, APB1 and APB2 prescaler set to 1. + * - CSS, MCO1 and MCO2 OFF + * - All interrupts disabled + * @note This function doesn't modify the configuration of the + * - Peripheral clocks + * - LSI, LSE and RTC clocks + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCC_DeInit(void) +{ + uint32_t tickstart; + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Set HSION bit to the reset value */ + SET_BIT(RCC->CR, RCC_CR_HSION); + + /* Wait till HSI is ready */ + while (READ_BIT(RCC->CR, RCC_CR_HSIRDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Set HSITRIM[4:0] bits to the reset value */ + SET_BIT(RCC->CR, RCC_CR_HSITRIM_4); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Reset CFGR register */ + CLEAR_REG(RCC->CFGR); + + /* Wait till clock switch is ready */ + while (READ_BIT(RCC->CFGR, RCC_CFGR_SWS) != RESET) + { + if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Clear HSEON, HSEBYP and CSSON bits */ + CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_CSSON); + + /* Wait till HSE is disabled */ + while (READ_BIT(RCC->CR, RCC_CR_HSERDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Clear PLLON bit */ + CLEAR_BIT(RCC->CR, RCC_CR_PLLON); + + /* Wait till PLL is disabled */ + while (READ_BIT(RCC->CR, RCC_CR_PLLRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + +#if defined(RCC_PLLI2S_SUPPORT) + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Reset PLLI2SON bit */ + CLEAR_BIT(RCC->CR, RCC_CR_PLLI2SON); + + /* Wait till PLLI2S is disabled */ + while (READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Reset PLLSAI bit */ + CLEAR_BIT(RCC->CR, RCC_CR_PLLSAION); + + /* Wait till PLLSAI is disabled */ + while (READ_BIT(RCC->CR, RCC_CR_PLLSAIRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLLSAI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } +#endif /* RCC_PLLSAI_SUPPORT */ + + /* Once PLL, PLLI2S and PLLSAI are OFF, reset PLLCFGR register to default value */ +#if defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || \ + defined(STM32F423xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) + RCC->PLLCFGR = RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2 | RCC_PLLCFGR_PLLR_1; +#elif defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) + RCC->PLLCFGR = RCC_PLLCFGR_PLLR_0 | RCC_PLLCFGR_PLLR_1 | RCC_PLLCFGR_PLLR_2 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_0 | RCC_PLLCFGR_PLLQ_1 | RCC_PLLCFGR_PLLQ_2 | RCC_PLLCFGR_PLLQ_3; +#else + RCC->PLLCFGR = RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2; +#endif /* STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx || STM32F446xx || STM32F469xx || STM32F479xx */ + + /* Reset PLLI2SCFGR register to default value */ +#if defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || \ + defined(STM32F423xx) || defined(STM32F446xx) + RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SR_1; +#elif defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) + RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SR_1; +#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) + RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SR_1; +#elif defined(STM32F411xE) + RCC->PLLI2SCFGR = RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SR_1; +#endif /* STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx || STM32F446xx */ + + /* Reset PLLSAICFGR register */ +#if defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F437xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) + RCC->PLLSAICFGR = RCC_PLLSAICFGR_PLLSAIN_6 | RCC_PLLSAICFGR_PLLSAIN_7 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIR_1; +#elif defined(STM32F446xx) + RCC->PLLSAICFGR = RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIN_6 | RCC_PLLSAICFGR_PLLSAIN_7 | RCC_PLLSAICFGR_PLLSAIQ_2; +#endif /* STM32F427xx || STM32F429xx || STM32F437xx || STM32F439xx || STM32F469xx || STM32F479xx */ + + /* Disable all interrupts */ + CLEAR_BIT(RCC->CIR, RCC_CIR_LSIRDYIE | RCC_CIR_LSERDYIE | RCC_CIR_HSIRDYIE | RCC_CIR_HSERDYIE | RCC_CIR_PLLRDYIE); + +#if defined(RCC_CIR_PLLI2SRDYIE) + CLEAR_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE); +#endif /* RCC_CIR_PLLI2SRDYIE */ + +#if defined(RCC_CIR_PLLSAIRDYIE) + CLEAR_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE); +#endif /* RCC_CIR_PLLSAIRDYIE */ + + /* Clear all interrupt flags */ + SET_BIT(RCC->CIR, RCC_CIR_LSIRDYC | RCC_CIR_LSERDYC | RCC_CIR_HSIRDYC | RCC_CIR_HSERDYC | RCC_CIR_PLLRDYC | + RCC_CIR_CSSC); + +#if defined(RCC_CIR_PLLI2SRDYC) + SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYC); +#endif /* RCC_CIR_PLLI2SRDYC */ + +#if defined(RCC_CIR_PLLSAIRDYC) + SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYC); +#endif /* RCC_CIR_PLLSAIRDYC */ + + /* Clear LSION bit */ + CLEAR_BIT(RCC->CSR, RCC_CSR_LSION); + + /* Reset all CSR flags */ + SET_BIT(RCC->CSR, RCC_CSR_RMVF); + + /* Update the SystemCoreClock global variable */ + SystemCoreClock = HSI_VALUE; + + /* Adapt Systick interrupt period */ + if (HAL_InitTick(uwTickPrio) != HAL_OK) + { + return HAL_ERROR; + } + else + { + return HAL_OK; + } +} + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Initializes the RCC Oscillators according to the specified parameters in the + * RCC_OscInitTypeDef. + * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that + * contains the configuration information for the RCC Oscillators. + * @note The PLL is not disabled when used as system clock. + * @note Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not + * supported by this API. User should request a transition to LSE Off + * first and then LSE On or LSE Bypass. + * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not + * supported by this API. User should request a transition to HSE Off + * first and then HSE On or HSE Bypass. + * @note This function add the PLL/PLLR factor management during PLL configuration this feature + * is only available in STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCC_OscConfig(const RCC_OscInitTypeDef *RCC_OscInitStruct) +{ + uint32_t tickstart; + uint32_t pll_config; + + /* Check Null pointer */ + if (RCC_OscInitStruct == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); + /*------------------------------- HSE Configuration ------------------------*/ + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) + { + /* Check the parameters */ + assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); + /* When the HSE is used as system clock or clock source for PLL in these cases HSE will not disabled */ +#if defined(STM32F446xx) + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) + || \ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE)) || \ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) +#else + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) + || \ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) +#endif /* STM32F446xx */ + { + if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) + { + return HAL_ERROR; + } + } + else + { + /* Set the new HSE configuration ---------------------------------------*/ + __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); + + /* Check the HSE State */ + if ((RCC_OscInitStruct->HSEState) != RCC_HSE_OFF) + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSE is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSE is bypassed or disabled */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + } + /*----------------------------- HSI Configuration --------------------------*/ + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) + { + /* Check the parameters */ + assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); + assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); + + /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ +#if defined(STM32F446xx) + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) + || \ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI)) || \ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) +#else + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) + || \ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) +#endif /* STM32F446xx */ + { + /* When HSI is used as system clock it will not disabled */ + if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) + { + return HAL_ERROR; + } + /* Otherwise, just the calibration is allowed */ + else + { + /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ + __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + } + } + else + { + /* Check the HSI State */ + if ((RCC_OscInitStruct->HSIState) != RCC_HSI_OFF) + { + /* Enable the Internal High Speed oscillator (HSI). */ + __HAL_RCC_HSI_ENABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSI is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ + __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + } + else + { + /* Disable the Internal High Speed oscillator (HSI). */ + __HAL_RCC_HSI_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSI is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + } + /*------------------------------ LSI Configuration -------------------------*/ + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) + { + /* Check the parameters */ + assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); + + /* Check the LSI State */ + if ((RCC_OscInitStruct->LSIState) != RCC_LSI_OFF) + { + /* Enable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_ENABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSI is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Disable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSI is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + /*------------------------------ LSE Configuration -------------------------*/ + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) + { + FlagStatus pwrclkchanged = RESET; + + /* Check the parameters */ + assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); + + /* Update LSE configuration in Backup Domain control register */ + /* Requires to enable write access to Backup Domain of necessary */ + if (__HAL_RCC_PWR_IS_CLK_DISABLED()) + { + __HAL_RCC_PWR_CLK_ENABLE(); + pwrclkchanged = SET; + } + + if (HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + { + /* Enable write access to Backup domain */ + SET_BIT(PWR->CR, PWR_CR_DBP); + + /* Wait for Backup domain Write protection disable */ + tickstart = HAL_GetTick(); + + while (HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + { + if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Set the new LSE configuration -----------------------------------------*/ + __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); + /* Check the LSE State */ + if ((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Restore clock configuration if changed */ + if (pwrclkchanged == SET) + { + __HAL_RCC_PWR_CLK_DISABLE(); + } + } + /*-------------------------------- PLL Configuration -----------------------*/ + /* Check the parameters */ + assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); + if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) + { + /* Check if the PLL is used as system clock or not */ + if (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) + { + if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) + { + /* Check the parameters */ + assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); + assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM)); + assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN)); + assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP)); + assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ)); + assert_param(IS_RCC_PLLR_VALUE(RCC_OscInitStruct->PLL.PLLR)); + + /* Disable the main PLL. */ + __HAL_RCC_PLL_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Configure the main PLL clock source, multiplication and division factors. */ + WRITE_REG(RCC->PLLCFGR, (RCC_OscInitStruct->PLL.PLLSource | \ + RCC_OscInitStruct->PLL.PLLM | \ + (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos) | \ + (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos) | \ + (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos) | \ + (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))); + /* Enable the main PLL. */ + __HAL_RCC_PLL_ENABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Disable the main PLL. */ + __HAL_RCC_PLL_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + else + { + /* Check if there is a request to disable the PLL used as System clock source */ + if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) + { + return HAL_ERROR; + } + else + { + /* Do not return HAL_ERROR if request repeats the current configuration */ + pll_config = RCC->PLLCFGR; +#if defined (RCC_PLLCFGR_PLLR) + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLR) != (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))) +#else + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))) +#endif /* RCC_PLLCFGR_PLLR */ + { + return HAL_ERROR; + } + } + } + } + return HAL_OK; +} + +/** + * @brief Configures the RCC_OscInitStruct according to the internal + * RCC configuration registers. + * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that will be configured. + * + * @note This function is only available in case of STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices. + * @note This function add the PLL/PLLR factor management + * @retval None + */ +void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) +{ + /* Set all possible values for the Oscillator type parameter ---------------*/ + RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; + + /* Get the HSE configuration -----------------------------------------------*/ + if ((RCC->CR & RCC_CR_HSEBYP) == RCC_CR_HSEBYP) + { + RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; + } + else if ((RCC->CR & RCC_CR_HSEON) == RCC_CR_HSEON) + { + RCC_OscInitStruct->HSEState = RCC_HSE_ON; + } + else + { + RCC_OscInitStruct->HSEState = RCC_HSE_OFF; + } + + /* Get the HSI configuration -----------------------------------------------*/ + if ((RCC->CR & RCC_CR_HSION) == RCC_CR_HSION) + { + RCC_OscInitStruct->HSIState = RCC_HSI_ON; + } + else + { + RCC_OscInitStruct->HSIState = RCC_HSI_OFF; + } + + RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR & RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); + + /* Get the LSE configuration -----------------------------------------------*/ + if ((RCC->BDCR & RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) + { + RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; + } + else if ((RCC->BDCR & RCC_BDCR_LSEON) == RCC_BDCR_LSEON) + { + RCC_OscInitStruct->LSEState = RCC_LSE_ON; + } + else + { + RCC_OscInitStruct->LSEState = RCC_LSE_OFF; + } + + /* Get the LSI configuration -----------------------------------------------*/ + if ((RCC->CSR & RCC_CSR_LSION) == RCC_CSR_LSION) + { + RCC_OscInitStruct->LSIState = RCC_LSI_ON; + } + else + { + RCC_OscInitStruct->LSIState = RCC_LSI_OFF; + } + + /* Get the PLL configuration -----------------------------------------------*/ + if ((RCC->CR & RCC_CR_PLLON) == RCC_CR_PLLON) + { + RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; + } + else + { + RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF; + } + RCC_OscInitStruct->PLL.PLLSource = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); + RCC_OscInitStruct->PLL.PLLM = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM); + RCC_OscInitStruct->PLL.PLLN = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); + RCC_OscInitStruct->PLL.PLLP = (uint32_t)((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) + RCC_PLLCFGR_PLLP_0) << 1U) >> RCC_PLLCFGR_PLLP_Pos); + RCC_OscInitStruct->PLL.PLLQ = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos); + RCC_OscInitStruct->PLL.PLLR = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos); +} +#endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#endif /* HAL_RCC_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + diff --git a/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c new file mode 100644 index 0000000..92757d8 --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c @@ -0,0 +1,3945 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_spi.c + * @author MCD Application Team + * @brief SPI HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Serial Peripheral Interface (SPI) peripheral: + * + Initialization and de-initialization functions + * + IO operation functions + * + Peripheral Control functions + * + Peripheral State functions + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The SPI HAL driver can be used as follows: + + (#) Declare a SPI_HandleTypeDef handle structure, for example: + SPI_HandleTypeDef hspi; + + (#)Initialize the SPI low level resources by implementing the HAL_SPI_MspInit() API: + (##) Enable the SPIx interface clock + (##) SPI pins configuration + (+++) Enable the clock for the SPI GPIOs + (+++) Configure these SPI pins as alternate function push-pull + (##) NVIC configuration if you need to use interrupt process + (+++) Configure the SPIx interrupt priority + (+++) Enable the NVIC SPI IRQ handle + (##) DMA Configuration if you need to use DMA process + (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive Stream/Channel + (+++) Enable the DMAx clock + (+++) Configure the DMA handle parameters + (+++) Configure the DMA Tx or Rx Stream/Channel + (+++) Associate the initialized hdma_tx(or _rx) handle to the hspi DMA Tx or Rx handle + (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx + or Rx Stream/Channel + + (#) Program the Mode, BidirectionalMode , Data size, Baudrate Prescaler, NSS + management, Clock polarity and phase, FirstBit and CRC configuration in the hspi Init structure. + + (#) Initialize the SPI registers by calling the HAL_SPI_Init() API: + (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc) + by calling the customized HAL_SPI_MspInit() API. + [..] + Circular mode restriction: + (#) The DMA circular mode cannot be used when the SPI is configured in these modes: + (##) Master 2Lines RxOnly + (##) Master 1Line Rx + (#) The CRC feature is not managed when the DMA circular mode is enabled + (#) When the SPI DMA Pause/Stop features are used, we must use the following APIs + the HAL_SPI_DMAPause()/ HAL_SPI_DMAStop() only under the SPI callbacks + [..] + Master Receive mode restriction: + (#) In Master unidirectional receive-only mode (MSTR =1, BIDIMODE=0, RXONLY=1) or + bidirectional receive mode (MSTR=1, BIDIMODE=1, BIDIOE=0), to ensure that the SPI + does not initiate a new transfer the following procedure has to be respected: + (##) HAL_SPI_DeInit() + (##) HAL_SPI_Init() + [..] + Callback registration: + + (#) The compilation flag USE_HAL_SPI_REGISTER_CALLBACKS when set to 1U + allows the user to configure dynamically the driver callbacks. + Use Functions HAL_SPI_RegisterCallback() to register an interrupt callback. + + Function HAL_SPI_RegisterCallback() allows to register following callbacks: + (++) TxCpltCallback : SPI Tx Completed callback + (++) RxCpltCallback : SPI Rx Completed callback + (++) TxRxCpltCallback : SPI TxRx Completed callback + (++) TxHalfCpltCallback : SPI Tx Half Completed callback + (++) RxHalfCpltCallback : SPI Rx Half Completed callback + (++) TxRxHalfCpltCallback : SPI TxRx Half Completed callback + (++) ErrorCallback : SPI Error callback + (++) AbortCpltCallback : SPI Abort callback + (++) MspInitCallback : SPI Msp Init callback + (++) MspDeInitCallback : SPI Msp DeInit callback + This function takes as parameters the HAL peripheral handle, the Callback ID + and a pointer to the user callback function. + + + (#) Use function HAL_SPI_UnRegisterCallback to reset a callback to the default + weak function. + HAL_SPI_UnRegisterCallback takes as parameters the HAL peripheral handle, + and the Callback ID. + This function allows to reset following callbacks: + (++) TxCpltCallback : SPI Tx Completed callback + (++) RxCpltCallback : SPI Rx Completed callback + (++) TxRxCpltCallback : SPI TxRx Completed callback + (++) TxHalfCpltCallback : SPI Tx Half Completed callback + (++) RxHalfCpltCallback : SPI Rx Half Completed callback + (++) TxRxHalfCpltCallback : SPI TxRx Half Completed callback + (++) ErrorCallback : SPI Error callback + (++) AbortCpltCallback : SPI Abort callback + (++) MspInitCallback : SPI Msp Init callback + (++) MspDeInitCallback : SPI Msp DeInit callback + + [..] + By default, after the HAL_SPI_Init() and when the state is HAL_SPI_STATE_RESET + all callbacks are set to the corresponding weak functions: + examples HAL_SPI_MasterTxCpltCallback(), HAL_SPI_MasterRxCpltCallback(). + Exception done for MspInit and MspDeInit functions that are + reset to the legacy weak functions in the HAL_SPI_Init()/ HAL_SPI_DeInit() only when + these callbacks are null (not registered beforehand). + If MspInit or MspDeInit are not null, the HAL_SPI_Init()/ HAL_SPI_DeInit() + keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state. + + [..] + Callbacks can be registered/unregistered in HAL_SPI_STATE_READY state only. + Exception done MspInit/MspDeInit functions that can be registered/unregistered + in HAL_SPI_STATE_READY or HAL_SPI_STATE_RESET state, + thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit. + Then, the user first registers the MspInit/MspDeInit user callbacks + using HAL_SPI_RegisterCallback() before calling HAL_SPI_DeInit() + or HAL_SPI_Init() function. + + [..] + When the compilation define USE_HAL_PPP_REGISTER_CALLBACKS is set to 0 or + not defined, the callback registering feature is not available + and weak (surcharged) callbacks are used. + + [..] + Using the HAL it is not possible to reach all supported SPI frequency with the different SPI Modes, + the following table resume the max SPI frequency reached with data size 8bits/16bits, + according to frequency of the APBx Peripheral Clock (fPCLK) used by the SPI instance. + + @endverbatim + + Additional table : + + DataSize = SPI_DATASIZE_8BIT: + +----------------------------------------------------------------------------------------------+ + | | | 2Lines Fullduplex | 2Lines RxOnly | 1Line | + | Process | Transfer mode |---------------------|----------------------|----------------------| + | | | Master | Slave | Master | Slave | Master | Slave | + |==============================================================================================| + | T | Polling | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | / | Interrupt | Fpclk/4 | Fpclk/8 | NA | NA | NA | NA | + | R |----------------|----------|----------|-----------|----------|-----------|----------| + | X | DMA | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | + |=========|================|==========|==========|===========|==========|===========|==========| + | | Polling | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/64 | Fpclk/2 | + | |----------------|----------|----------|-----------|----------|-----------|----------| + | R | Interrupt | Fpclk/8 | Fpclk/8 | Fpclk/64 | Fpclk/2 | Fpclk/64 | Fpclk/2 | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | | DMA | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/128 | Fpclk/2 | + |=========|================|==========|==========|===========|==========|===========|==========| + | | Polling | Fpclk/2 | Fpclk/4 | NA | NA | Fpclk/2 | Fpclk/64 | + | |----------------|----------|----------|-----------|----------|-----------|----------| + | T | Interrupt | Fpclk/2 | Fpclk/4 | NA | NA | Fpclk/2 | Fpclk/64 | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | | DMA | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/128| + +----------------------------------------------------------------------------------------------+ + + DataSize = SPI_DATASIZE_16BIT: + +----------------------------------------------------------------------------------------------+ + | | | 2Lines Fullduplex | 2Lines RxOnly | 1Line | + | Process | Transfer mode |---------------------|----------------------|----------------------| + | | | Master | Slave | Master | Slave | Master | Slave | + |==============================================================================================| + | T | Polling | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | / | Interrupt | Fpclk/4 | Fpclk/4 | NA | NA | NA | NA | + | R |----------------|----------|----------|-----------|----------|-----------|----------| + | X | DMA | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | + |=========|================|==========|==========|===========|==========|===========|==========| + | | Polling | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/32 | Fpclk/2 | + | |----------------|----------|----------|-----------|----------|-----------|----------| + | R | Interrupt | Fpclk/4 | Fpclk/4 | Fpclk/64 | Fpclk/2 | Fpclk/64 | Fpclk/2 | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | | DMA | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/128 | Fpclk/2 | + |=========|================|==========|==========|===========|==========|===========|==========| + | | Polling | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/32 | + | |----------------|----------|----------|-----------|----------|-----------|----------| + | T | Interrupt | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/64 | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | | DMA | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/128| + +----------------------------------------------------------------------------------------------+ + @note The max SPI frequency depend on SPI data size (8bits, 16bits), + SPI mode(2 Lines fullduplex, 2 lines RxOnly, 1 line TX/RX) and Process mode (Polling, IT, DMA). + @note + (#) TX/RX processes are HAL_SPI_TransmitReceive(), HAL_SPI_TransmitReceive_IT() and + HAL_SPI_TransmitReceive_DMA() + (#) RX processes are HAL_SPI_Receive(), HAL_SPI_Receive_IT() and HAL_SPI_Receive_DMA() + (#) TX processes are HAL_SPI_Transmit(), HAL_SPI_Transmit_IT() and HAL_SPI_Transmit_DMA() + + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup SPI SPI + * @brief SPI HAL module driver + * @{ + */ +#ifdef HAL_SPI_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private defines -----------------------------------------------------------*/ +/** @defgroup SPI_Private_Constants SPI Private Constants + * @{ + */ +#define SPI_DEFAULT_TIMEOUT 100U +#define SPI_BSY_FLAG_WORKAROUND_TIMEOUT 1000U /*!< Timeout 1000 us */ +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** @defgroup SPI_Private_Functions SPI Private Functions + * @{ + */ +static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma); +static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma); +static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma); +static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma); +static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma); +static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma); +static void SPI_DMAError(DMA_HandleTypeDef *hdma); +static void SPI_DMAAbortOnError(DMA_HandleTypeDef *hdma); +static void SPI_DMATxAbortCallback(DMA_HandleTypeDef *hdma); +static void SPI_DMARxAbortCallback(DMA_HandleTypeDef *hdma); +static HAL_StatusTypeDef SPI_WaitFlagStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus State, + uint32_t Timeout, uint32_t Tickstart); +static void SPI_TxISR_8BIT(struct __SPI_HandleTypeDef *hspi); +static void SPI_TxISR_16BIT(struct __SPI_HandleTypeDef *hspi); +static void SPI_RxISR_8BIT(struct __SPI_HandleTypeDef *hspi); +static void SPI_RxISR_16BIT(struct __SPI_HandleTypeDef *hspi); +static void SPI_2linesRxISR_8BIT(struct __SPI_HandleTypeDef *hspi); +static void SPI_2linesTxISR_8BIT(struct __SPI_HandleTypeDef *hspi); +static void SPI_2linesTxISR_16BIT(struct __SPI_HandleTypeDef *hspi); +static void SPI_2linesRxISR_16BIT(struct __SPI_HandleTypeDef *hspi); +#if (USE_SPI_CRC != 0U) +static void SPI_RxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi); +static void SPI_RxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi); +static void SPI_2linesRxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi); +static void SPI_2linesRxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi); +#endif /* USE_SPI_CRC */ +static void SPI_AbortRx_ISR(SPI_HandleTypeDef *hspi); +static void SPI_AbortTx_ISR(SPI_HandleTypeDef *hspi); +static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi); +static void SPI_CloseRx_ISR(SPI_HandleTypeDef *hspi); +static void SPI_CloseTx_ISR(SPI_HandleTypeDef *hspi); +static HAL_StatusTypeDef SPI_EndRxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart); +static HAL_StatusTypeDef SPI_EndRxTxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart); +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup SPI_Exported_Functions SPI Exported Functions + * @{ + */ + +/** @defgroup SPI_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] This subsection provides a set of functions allowing to initialize and + de-initialize the SPIx peripheral: + + (+) User must implement HAL_SPI_MspInit() function in which he configures + all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ). + + (+) Call the function HAL_SPI_Init() to configure the selected device with + the selected configuration: + (++) Mode + (++) Direction + (++) Data Size + (++) Clock Polarity and Phase + (++) NSS Management + (++) BaudRate Prescaler + (++) FirstBit + (++) TIMode + (++) CRC Calculation + (++) CRC Polynomial if CRC enabled + + (+) Call the function HAL_SPI_DeInit() to restore the default configuration + of the selected SPIx peripheral. + +@endverbatim + * @{ + */ + +/** + * @brief Initialize the SPI according to the specified parameters + * in the SPI_InitTypeDef and initialize the associated handle. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi) +{ + /* Check the SPI handle allocation */ + if (hspi == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance)); + assert_param(IS_SPI_MODE(hspi->Init.Mode)); + assert_param(IS_SPI_DIRECTION(hspi->Init.Direction)); + assert_param(IS_SPI_DATASIZE(hspi->Init.DataSize)); + assert_param(IS_SPI_NSS(hspi->Init.NSS)); + assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler)); + assert_param(IS_SPI_FIRST_BIT(hspi->Init.FirstBit)); + assert_param(IS_SPI_TIMODE(hspi->Init.TIMode)); + if (hspi->Init.TIMode == SPI_TIMODE_DISABLE) + { + assert_param(IS_SPI_CPOL(hspi->Init.CLKPolarity)); + assert_param(IS_SPI_CPHA(hspi->Init.CLKPhase)); + + if (hspi->Init.Mode == SPI_MODE_MASTER) + { + assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler)); + } + else + { + /* Baudrate prescaler not use in Motoraola Slave mode. force to default value */ + hspi->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + } + } + else + { + assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler)); + + /* Force polarity and phase to TI protocaol requirements */ + hspi->Init.CLKPolarity = SPI_POLARITY_LOW; + hspi->Init.CLKPhase = SPI_PHASE_1EDGE; + } +#if (USE_SPI_CRC != 0U) + assert_param(IS_SPI_CRC_CALCULATION(hspi->Init.CRCCalculation)); + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + assert_param(IS_SPI_CRC_POLYNOMIAL(hspi->Init.CRCPolynomial)); + } +#else + hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; +#endif /* USE_SPI_CRC */ + + if (hspi->State == HAL_SPI_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + hspi->Lock = HAL_UNLOCKED; + +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + /* Init the SPI Callback settings */ + hspi->TxCpltCallback = HAL_SPI_TxCpltCallback; /* Legacy weak TxCpltCallback */ + hspi->RxCpltCallback = HAL_SPI_RxCpltCallback; /* Legacy weak RxCpltCallback */ + hspi->TxRxCpltCallback = HAL_SPI_TxRxCpltCallback; /* Legacy weak TxRxCpltCallback */ + hspi->TxHalfCpltCallback = HAL_SPI_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */ + hspi->RxHalfCpltCallback = HAL_SPI_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */ + hspi->TxRxHalfCpltCallback = HAL_SPI_TxRxHalfCpltCallback; /* Legacy weak TxRxHalfCpltCallback */ + hspi->ErrorCallback = HAL_SPI_ErrorCallback; /* Legacy weak ErrorCallback */ + hspi->AbortCpltCallback = HAL_SPI_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ + + if (hspi->MspInitCallback == NULL) + { + hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit */ + } + + /* Init the low level hardware : GPIO, CLOCK, NVIC... */ + hspi->MspInitCallback(hspi); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC... */ + HAL_SPI_MspInit(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } + + hspi->State = HAL_SPI_STATE_BUSY; + + /* Disable the selected SPI peripheral */ + __HAL_SPI_DISABLE(hspi); + + /*----------------------- SPIx CR1 & CR2 Configuration ---------------------*/ + /* Configure : SPI Mode, Communication Mode, Data size, Clock polarity and phase, NSS management, + Communication speed, First bit and CRC calculation state */ + WRITE_REG(hspi->Instance->CR1, ((hspi->Init.Mode & (SPI_CR1_MSTR | SPI_CR1_SSI)) | + (hspi->Init.Direction & (SPI_CR1_RXONLY | SPI_CR1_BIDIMODE)) | + (hspi->Init.DataSize & SPI_CR1_DFF) | + (hspi->Init.CLKPolarity & SPI_CR1_CPOL) | + (hspi->Init.CLKPhase & SPI_CR1_CPHA) | + (hspi->Init.NSS & SPI_CR1_SSM) | + (hspi->Init.BaudRatePrescaler & SPI_CR1_BR_Msk) | + (hspi->Init.FirstBit & SPI_CR1_LSBFIRST) | + (hspi->Init.CRCCalculation & SPI_CR1_CRCEN))); + + /* Configure : NSS management, TI Mode */ + WRITE_REG(hspi->Instance->CR2, (((hspi->Init.NSS >> 16U) & SPI_CR2_SSOE) | (hspi->Init.TIMode & SPI_CR2_FRF))); + +#if (USE_SPI_CRC != 0U) + /*---------------------------- SPIx CRCPOLY Configuration ------------------*/ + /* Configure : CRC Polynomial */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + WRITE_REG(hspi->Instance->CRCPR, (hspi->Init.CRCPolynomial & SPI_CRCPR_CRCPOLY_Msk)); + } +#endif /* USE_SPI_CRC */ + +#if defined(SPI_I2SCFGR_I2SMOD) + /* Activate the SPI mode (Make sure that I2SMOD bit in I2SCFGR register is reset) */ + CLEAR_BIT(hspi->Instance->I2SCFGR, SPI_I2SCFGR_I2SMOD); +#endif /* SPI_I2SCFGR_I2SMOD */ + + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->State = HAL_SPI_STATE_READY; + + return HAL_OK; +} + +/** + * @brief De-Initialize the SPI peripheral. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi) +{ + /* Check the SPI handle allocation */ + if (hspi == NULL) + { + return HAL_ERROR; + } + + /* Check SPI Instance parameter */ + assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance)); + + hspi->State = HAL_SPI_STATE_BUSY; + + /* Disable the SPI Peripheral Clock */ + __HAL_SPI_DISABLE(hspi); + +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + if (hspi->MspDeInitCallback == NULL) + { + hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit */ + } + + /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */ + hspi->MspDeInitCallback(hspi); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */ + HAL_SPI_MspDeInit(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->State = HAL_SPI_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(hspi); + + return HAL_OK; +} + +/** + * @brief Initialize the SPI MSP. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +__weak void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SPI_MspInit should be implemented in the user file + */ +} + +/** + * @brief De-Initialize the SPI MSP. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +__weak void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SPI_MspDeInit should be implemented in the user file + */ +} + +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +/** + * @brief Register a User SPI Callback + * To be used instead of the weak predefined callback + * @param hspi Pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for the specified SPI. + * @param CallbackID ID of the callback to be registered + * @param pCallback pointer to the Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_RegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID, + pSPI_CallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hspi->ErrorCode |= HAL_SPI_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + /* Process locked */ + __HAL_LOCK(hspi); + + if (HAL_SPI_STATE_READY == hspi->State) + { + switch (CallbackID) + { + case HAL_SPI_TX_COMPLETE_CB_ID : + hspi->TxCpltCallback = pCallback; + break; + + case HAL_SPI_RX_COMPLETE_CB_ID : + hspi->RxCpltCallback = pCallback; + break; + + case HAL_SPI_TX_RX_COMPLETE_CB_ID : + hspi->TxRxCpltCallback = pCallback; + break; + + case HAL_SPI_TX_HALF_COMPLETE_CB_ID : + hspi->TxHalfCpltCallback = pCallback; + break; + + case HAL_SPI_RX_HALF_COMPLETE_CB_ID : + hspi->RxHalfCpltCallback = pCallback; + break; + + case HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID : + hspi->TxRxHalfCpltCallback = pCallback; + break; + + case HAL_SPI_ERROR_CB_ID : + hspi->ErrorCallback = pCallback; + break; + + case HAL_SPI_ABORT_CB_ID : + hspi->AbortCpltCallback = pCallback; + break; + + case HAL_SPI_MSPINIT_CB_ID : + hspi->MspInitCallback = pCallback; + break; + + case HAL_SPI_MSPDEINIT_CB_ID : + hspi->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (HAL_SPI_STATE_RESET == hspi->State) + { + switch (CallbackID) + { + case HAL_SPI_MSPINIT_CB_ID : + hspi->MspInitCallback = pCallback; + break; + + case HAL_SPI_MSPDEINIT_CB_ID : + hspi->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hspi); + return status; +} + +/** + * @brief Unregister an SPI Callback + * SPI callback is redirected to the weak predefined callback + * @param hspi Pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for the specified SPI. + * @param CallbackID ID of the callback to be unregistered + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_UnRegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hspi); + + if (HAL_SPI_STATE_READY == hspi->State) + { + switch (CallbackID) + { + case HAL_SPI_TX_COMPLETE_CB_ID : + hspi->TxCpltCallback = HAL_SPI_TxCpltCallback; /* Legacy weak TxCpltCallback */ + break; + + case HAL_SPI_RX_COMPLETE_CB_ID : + hspi->RxCpltCallback = HAL_SPI_RxCpltCallback; /* Legacy weak RxCpltCallback */ + break; + + case HAL_SPI_TX_RX_COMPLETE_CB_ID : + hspi->TxRxCpltCallback = HAL_SPI_TxRxCpltCallback; /* Legacy weak TxRxCpltCallback */ + break; + + case HAL_SPI_TX_HALF_COMPLETE_CB_ID : + hspi->TxHalfCpltCallback = HAL_SPI_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */ + break; + + case HAL_SPI_RX_HALF_COMPLETE_CB_ID : + hspi->RxHalfCpltCallback = HAL_SPI_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */ + break; + + case HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID : + hspi->TxRxHalfCpltCallback = HAL_SPI_TxRxHalfCpltCallback; /* Legacy weak TxRxHalfCpltCallback */ + break; + + case HAL_SPI_ERROR_CB_ID : + hspi->ErrorCallback = HAL_SPI_ErrorCallback; /* Legacy weak ErrorCallback */ + break; + + case HAL_SPI_ABORT_CB_ID : + hspi->AbortCpltCallback = HAL_SPI_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ + break; + + case HAL_SPI_MSPINIT_CB_ID : + hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit */ + break; + + case HAL_SPI_MSPDEINIT_CB_ID : + hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit */ + break; + + default : + /* Update the error code */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (HAL_SPI_STATE_RESET == hspi->State) + { + switch (CallbackID) + { + case HAL_SPI_MSPINIT_CB_ID : + hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit */ + break; + + case HAL_SPI_MSPDEINIT_CB_ID : + hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit */ + break; + + default : + /* Update the error code */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hspi); + return status; +} +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +/** + * @} + */ + +/** @defgroup SPI_Exported_Functions_Group2 IO operation functions + * @brief Data transfers functions + * +@verbatim + ============================================================================== + ##### IO operation functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to manage the SPI + data transfers. + + [..] The SPI supports master and slave mode : + + (#) There are two modes of transfer: + (++) Blocking mode: The communication is performed in polling mode. + The HAL status of all data processing is returned by the same function + after finishing transfer. + (++) No-Blocking mode: The communication is performed using Interrupts + or DMA, These APIs return the HAL status. + The end of the data processing will be indicated through the + dedicated SPI IRQ when using Interrupt mode or the DMA IRQ when + using DMA mode. + The HAL_SPI_TxCpltCallback(), HAL_SPI_RxCpltCallback() and HAL_SPI_TxRxCpltCallback() user callbacks + will be executed respectively at the end of the transmit or Receive process + The HAL_SPI_ErrorCallback()user callback will be executed when a communication error is detected + + (#) APIs provided for these 2 transfer modes (Blocking mode or Non blocking mode using either Interrupt or DMA) + exist for 1Line (simplex) and 2Lines (full duplex) modes. + +@endverbatim + * @{ + */ + +/** + * @brief Transmit an amount of data in blocking mode. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param pData pointer to data buffer (u8 or u16 data elements) + * @param Size amount of data elements (u8 or u16) to be sent + * @param Timeout Timeout duration in ms + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ + uint32_t tickstart; + uint16_t initial_TxXferCount; + + /* Check Direction parameter */ + assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + initial_TxXferCount = Size; + + if (hspi->State != HAL_SPI_STATE_READY) + { + return HAL_BUSY; + } + + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(hspi); + + /* Set the transaction information */ + hspi->State = HAL_SPI_STATE_BUSY_TX; + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->pTxBuffPtr = (const uint8_t *)pData; + hspi->TxXferSize = Size; + hspi->TxXferCount = Size; + + /*Init field not used in handle to zero */ + hspi->pRxBuffPtr = (uint8_t *)NULL; + hspi->RxXferSize = 0U; + hspi->RxXferCount = 0U; + hspi->TxISR = NULL; + hspi->RxISR = NULL; + + /* Configure communication direction : 1Line */ + if (hspi->Init.Direction == SPI_DIRECTION_1LINE) + { + /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ + __HAL_SPI_DISABLE(hspi); + SPI_1LINE_TX(hspi); + } + +#if (USE_SPI_CRC != 0U) + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + SPI_RESET_CRC(hspi); + } +#endif /* USE_SPI_CRC */ + + /* Check if the SPI is already enabled */ + if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) + { + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + } + + /* Transmit data in 16 Bit mode */ + if (hspi->Init.DataSize == SPI_DATASIZE_16BIT) + { + if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) + { + hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint16_t); + hspi->TxXferCount--; + } + /* Transmit data in 16 Bit mode */ + while (hspi->TxXferCount > 0U) + { + /* Wait until TXE flag is set to send data */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) + { + hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint16_t); + hspi->TxXferCount--; + } + else + { + /* Timeout management */ + if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) + { + hspi->State = HAL_SPI_STATE_READY; + __HAL_UNLOCK(hspi); + return HAL_TIMEOUT; + } + } + } + } + /* Transmit data in 8 Bit mode */ + else + { + if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) + { + *((__IO uint8_t *)&hspi->Instance->DR) = *((const uint8_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint8_t); + hspi->TxXferCount--; + } + while (hspi->TxXferCount > 0U) + { + /* Wait until TXE flag is set to send data */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) + { + *((__IO uint8_t *)&hspi->Instance->DR) = *((const uint8_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint8_t); + hspi->TxXferCount--; + } + else + { + /* Timeout management */ + if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) + { + hspi->State = HAL_SPI_STATE_READY; + __HAL_UNLOCK(hspi); + return HAL_TIMEOUT; + } + } + } + } +#if (USE_SPI_CRC != 0U) + /* Enable CRC Transmission */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + } +#endif /* USE_SPI_CRC */ + + /* Check the end of the transaction */ + if (SPI_EndRxTxTransaction(hspi, Timeout, tickstart) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_FLAG; + } + + /* Clear overrun flag in 2 Lines communication mode because received is not read */ + if (hspi->Init.Direction == SPI_DIRECTION_2LINES) + { + __HAL_SPI_CLEAR_OVRFLAG(hspi); + } + + hspi->State = HAL_SPI_STATE_READY; + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + + if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) + { + return HAL_ERROR; + } + else + { + return HAL_OK; + } +} + +/** + * @brief Receive an amount of data in blocking mode. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param pData pointer to data buffer (u8 or u16 data elements) + * @param Size amount of data elements (u8 or u16) to be received + * @param Timeout Timeout duration in ms + * @retval HAL status + * @note In master mode, if the direction is set to SPI_DIRECTION_2LINES + * the receive buffer is written to data register (DR) to generate + * clock pulses and receive data + */ +HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ +#if (USE_SPI_CRC != 0U) + __IO uint32_t tmpreg = 0U; +#endif /* USE_SPI_CRC */ + uint32_t tickstart; + + if (hspi->State != HAL_SPI_STATE_READY) + { + return HAL_BUSY; + } + + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + if ((hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES)) + { + hspi->State = HAL_SPI_STATE_BUSY_RX; + /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */ + return HAL_SPI_TransmitReceive(hspi, pData, pData, Size, Timeout); + } + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + /* Process Locked */ + __HAL_LOCK(hspi); + + /* Set the transaction information */ + hspi->State = HAL_SPI_STATE_BUSY_RX; + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->pRxBuffPtr = (uint8_t *)pData; + hspi->RxXferSize = Size; + hspi->RxXferCount = Size; + + /*Init field not used in handle to zero */ + hspi->pTxBuffPtr = (uint8_t *)NULL; + hspi->TxXferSize = 0U; + hspi->TxXferCount = 0U; + hspi->RxISR = NULL; + hspi->TxISR = NULL; + +#if (USE_SPI_CRC != 0U) + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + SPI_RESET_CRC(hspi); + /* this is done to handle the CRCNEXT before the latest data */ + hspi->RxXferCount--; + } +#endif /* USE_SPI_CRC */ + + /* Configure communication direction: 1Line */ + if (hspi->Init.Direction == SPI_DIRECTION_1LINE) + { + /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ + __HAL_SPI_DISABLE(hspi); + SPI_1LINE_RX(hspi); + } + + /* Check if the SPI is already enabled */ + if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) + { + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + } + + /* Receive data in 8 Bit mode */ + if (hspi->Init.DataSize == SPI_DATASIZE_8BIT) + { + /* Transfer loop */ + while (hspi->RxXferCount > 0U) + { + /* Check the RXNE flag */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) + { + /* read the received data */ + (* (uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR; + hspi->pRxBuffPtr += sizeof(uint8_t); + hspi->RxXferCount--; + } + else + { + /* Timeout management */ + if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) + { + hspi->State = HAL_SPI_STATE_READY; + __HAL_UNLOCK(hspi); + return HAL_TIMEOUT; + } + } + } + } + else + { + /* Transfer loop */ + while (hspi->RxXferCount > 0U) + { + /* Check the RXNE flag */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) + { + *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR; + hspi->pRxBuffPtr += sizeof(uint16_t); + hspi->RxXferCount--; + } + else + { + /* Timeout management */ + if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) + { + hspi->State = HAL_SPI_STATE_READY; + __HAL_UNLOCK(hspi); + return HAL_TIMEOUT; + } + } + } + } + +#if (USE_SPI_CRC != 0U) + /* Handle the CRC Transmission */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + /* freeze the CRC before the latest data */ + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + + /* Read the latest data */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK) + { + /* the latest data has not been received */ + __HAL_UNLOCK(hspi); + return HAL_TIMEOUT; + } + + /* Receive last data in 16 Bit mode */ + if (hspi->Init.DataSize == SPI_DATASIZE_16BIT) + { + *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR; + } + /* Receive last data in 8 Bit mode */ + else + { + (*(uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR; + } + + /* Wait the CRC data */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + hspi->State = HAL_SPI_STATE_READY; + __HAL_UNLOCK(hspi); + return HAL_TIMEOUT; + } + + /* Read CRC to Flush DR and RXNE flag */ + tmpreg = READ_REG(hspi->Instance->DR); + /* To avoid GCC warning */ + UNUSED(tmpreg); + } +#endif /* USE_SPI_CRC */ + + /* Check the end of the transaction */ + if (SPI_EndRxTransaction(hspi, Timeout, tickstart) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_FLAG; + } + +#if (USE_SPI_CRC != 0U) + /* Check if CRC error occurred */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + __HAL_SPI_CLEAR_CRCERRFLAG(hspi); + } +#endif /* USE_SPI_CRC */ + + hspi->State = HAL_SPI_STATE_READY; + /* Unlock the process */ + __HAL_UNLOCK(hspi); + if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) + { + return HAL_ERROR; + } + else + { + return HAL_OK; + } +} + +/** + * @brief Transmit and Receive an amount of data in blocking mode. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param pTxData pointer to transmission data buffer (u8 or u16 data elements) + * @param pRxData pointer to reception data buffer (u8 or u16 data elements) + * @param Size amount of data elements (u8 or u16) to be sent and received + * @param Timeout Timeout duration in ms + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, + uint16_t Size, uint32_t Timeout) +{ + uint16_t initial_TxXferCount; + uint32_t tmp_mode; + HAL_SPI_StateTypeDef tmp_state; + uint32_t tickstart; +#if (USE_SPI_CRC != 0U) + __IO uint32_t tmpreg = 0U; +#endif /* USE_SPI_CRC */ + + /* Variable used to alternate Rx and Tx during transfer */ + uint32_t txallowed = 1U; + + /* Check Direction parameter */ + assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + /* Init temporary variables */ + tmp_state = hspi->State; + tmp_mode = hspi->Init.Mode; + initial_TxXferCount = Size; + + if (!((tmp_state == HAL_SPI_STATE_READY) || \ + ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && + (tmp_state == HAL_SPI_STATE_BUSY_RX)))) + { + return HAL_BUSY; + } + + if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(hspi); + + /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ + if (hspi->State != HAL_SPI_STATE_BUSY_RX) + { + hspi->State = HAL_SPI_STATE_BUSY_TX_RX; + } + + /* Set the transaction information */ + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->pRxBuffPtr = (uint8_t *)pRxData; + hspi->RxXferCount = Size; + hspi->RxXferSize = Size; + hspi->pTxBuffPtr = (const uint8_t *)pTxData; + hspi->TxXferCount = Size; + hspi->TxXferSize = Size; + + /*Init field not used in handle to zero */ + hspi->RxISR = NULL; + hspi->TxISR = NULL; + +#if (USE_SPI_CRC != 0U) + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + SPI_RESET_CRC(hspi); + } +#endif /* USE_SPI_CRC */ + + /* Check if the SPI is already enabled */ + if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) + { + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + } + + /* Transmit and Receive data in 16 Bit mode */ + if (hspi->Init.DataSize == SPI_DATASIZE_16BIT) + { + if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) + { + hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint16_t); + hspi->TxXferCount--; + +#if (USE_SPI_CRC != 0U) + /* Enable CRC Transmission */ + if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) + { + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + } +#endif /* USE_SPI_CRC */ + + } + while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U)) + { + /* Check TXE flag */ + if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U)) + { + hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint16_t); + hspi->TxXferCount--; + /* Next Data is a reception (Rx). Tx not allowed */ + txallowed = 0U; + +#if (USE_SPI_CRC != 0U) + /* Enable CRC Transmission */ + if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) + { + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + } +#endif /* USE_SPI_CRC */ + } + + /* Check RXNE flag */ + if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U)) + { + *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR; + hspi->pRxBuffPtr += sizeof(uint16_t); + hspi->RxXferCount--; + /* Next Data is a Transmission (Tx). Tx is allowed */ + txallowed = 1U; + } + if (((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) + { + hspi->State = HAL_SPI_STATE_READY; + __HAL_UNLOCK(hspi); + return HAL_TIMEOUT; + } + } + } + /* Transmit and Receive data in 8 Bit mode */ + else + { + if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) + { + *((__IO uint8_t *)&hspi->Instance->DR) = *((const uint8_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint8_t); + hspi->TxXferCount--; + +#if (USE_SPI_CRC != 0U) + /* Enable CRC Transmission */ + if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) + { + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + } +#endif /* USE_SPI_CRC */ + } + while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U)) + { + /* Check TXE flag */ + if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U)) + { + *(__IO uint8_t *)&hspi->Instance->DR = *((const uint8_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr++; + hspi->TxXferCount--; + /* Next Data is a reception (Rx). Tx not allowed */ + txallowed = 0U; + +#if (USE_SPI_CRC != 0U) + /* Enable CRC Transmission */ + if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) + { + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + } +#endif /* USE_SPI_CRC */ + } + + /* Wait until RXNE flag is reset */ + if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U)) + { + (*(uint8_t *)hspi->pRxBuffPtr) = hspi->Instance->DR; + hspi->pRxBuffPtr++; + hspi->RxXferCount--; + /* Next Data is a Transmission (Tx). Tx is allowed */ + txallowed = 1U; + } + if ((((HAL_GetTick() - tickstart) >= Timeout) && ((Timeout != HAL_MAX_DELAY))) || (Timeout == 0U)) + { + hspi->State = HAL_SPI_STATE_READY; + __HAL_UNLOCK(hspi); + return HAL_TIMEOUT; + } + } + } + +#if (USE_SPI_CRC != 0U) + /* Read CRC from DR to close CRC calculation process */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + /* Wait until TXE flag */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK) + { + /* Error on the CRC reception */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + hspi->State = HAL_SPI_STATE_READY; + __HAL_UNLOCK(hspi); + return HAL_TIMEOUT; + } + /* Read CRC */ + tmpreg = READ_REG(hspi->Instance->DR); + /* To avoid GCC warning */ + UNUSED(tmpreg); + } + + /* Check if CRC error occurred */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + /* Clear CRC Flag */ + __HAL_SPI_CLEAR_CRCERRFLAG(hspi); + __HAL_UNLOCK(hspi); + return HAL_ERROR; + } +#endif /* USE_SPI_CRC */ + + /* Check the end of the transaction */ + if (SPI_EndRxTxTransaction(hspi, Timeout, tickstart) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_FLAG; + __HAL_UNLOCK(hspi); + return HAL_ERROR; + } + + /* Clear overrun flag in 2 Lines communication mode because received is not read */ + if (hspi->Init.Direction == SPI_DIRECTION_2LINES) + { + __HAL_SPI_CLEAR_OVRFLAG(hspi); + } + + + hspi->State = HAL_SPI_STATE_READY; + /* Unlock the process */ + __HAL_UNLOCK(hspi); + + if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) + { + return HAL_ERROR; + } + else + { + return HAL_OK; + } +} + +/** + * @brief Transmit an amount of data in non-blocking mode with Interrupt. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param pData pointer to data buffer (u8 or u16 data elements) + * @param Size amount of data elements (u8 or u16) to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size) +{ + + /* Check Direction parameter */ + assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); + + + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + if (hspi->State != HAL_SPI_STATE_READY) + { + return HAL_BUSY; + } + + /* Process Locked */ + __HAL_LOCK(hspi); + + /* Set the transaction information */ + hspi->State = HAL_SPI_STATE_BUSY_TX; + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->pTxBuffPtr = (const uint8_t *)pData; + hspi->TxXferSize = Size; + hspi->TxXferCount = Size; + + /* Init field not used in handle to zero */ + hspi->pRxBuffPtr = (uint8_t *)NULL; + hspi->RxXferSize = 0U; + hspi->RxXferCount = 0U; + hspi->RxISR = NULL; + + /* Set the function for IT treatment */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + hspi->TxISR = SPI_TxISR_16BIT; + } + else + { + hspi->TxISR = SPI_TxISR_8BIT; + } + + /* Configure communication direction : 1Line */ + if (hspi->Init.Direction == SPI_DIRECTION_1LINE) + { + /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ + __HAL_SPI_DISABLE(hspi); + SPI_1LINE_TX(hspi); + } + +#if (USE_SPI_CRC != 0U) + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + SPI_RESET_CRC(hspi); + } +#endif /* USE_SPI_CRC */ + + /* Check if the SPI is already enabled */ + if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) + { + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + } + + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + /* Enable TXE and ERR interrupt */ + __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_ERR)); + + return HAL_OK; +} + +/** + * @brief Receive an amount of data in non-blocking mode with Interrupt. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param pData pointer to data buffer (u8 or u16 data elements) + * @param Size amount of data elements (u8 or u16) to be received + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) +{ + + if (hspi->State != HAL_SPI_STATE_READY) + { + return HAL_BUSY; + } + + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER)) + { + hspi->State = HAL_SPI_STATE_BUSY_RX; + /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */ + return HAL_SPI_TransmitReceive_IT(hspi, pData, pData, Size); + } + + + /* Process Locked */ + __HAL_LOCK(hspi); + + /* Set the transaction information */ + hspi->State = HAL_SPI_STATE_BUSY_RX; + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->pRxBuffPtr = (uint8_t *)pData; + hspi->RxXferSize = Size; + hspi->RxXferCount = Size; + + /* Init field not used in handle to zero */ + hspi->pTxBuffPtr = (uint8_t *)NULL; + hspi->TxXferSize = 0U; + hspi->TxXferCount = 0U; + hspi->TxISR = NULL; + + /* Set the function for IT treatment */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + hspi->RxISR = SPI_RxISR_16BIT; + } + else + { + hspi->RxISR = SPI_RxISR_8BIT; + } + + /* Configure communication direction : 1Line */ + if (hspi->Init.Direction == SPI_DIRECTION_1LINE) + { + /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ + __HAL_SPI_DISABLE(hspi); + SPI_1LINE_RX(hspi); + } + +#if (USE_SPI_CRC != 0U) + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + SPI_RESET_CRC(hspi); + } +#endif /* USE_SPI_CRC */ + + /* Note : The SPI must be enabled after unlocking current process + to avoid the risk of SPI interrupt handle execution before current + process unlock */ + + /* Check if the SPI is already enabled */ + if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) + { + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + } + + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + /* Enable RXNE and ERR interrupt */ + __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); + + return HAL_OK; +} + +/** + * @brief Transmit and Receive an amount of data in non-blocking mode with Interrupt. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param pTxData pointer to transmission data buffer (u8 or u16 data elements) + * @param pRxData pointer to reception data buffer (u8 or u16 data elements) + * @param Size amount of data elements (u8 or u16) to be sent and received + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, + uint16_t Size) +{ + uint32_t tmp_mode; + HAL_SPI_StateTypeDef tmp_state; + + /* Check Direction parameter */ + assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); + + /* Init temporary variables */ + tmp_state = hspi->State; + tmp_mode = hspi->Init.Mode; + + if (!((tmp_state == HAL_SPI_STATE_READY) || \ + ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && + (tmp_state == HAL_SPI_STATE_BUSY_RX)))) + { + return HAL_BUSY; + } + + if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(hspi); + + /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ + if (hspi->State != HAL_SPI_STATE_BUSY_RX) + { + hspi->State = HAL_SPI_STATE_BUSY_TX_RX; + } + + /* Set the transaction information */ + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->pTxBuffPtr = (const uint8_t *)pTxData; + hspi->TxXferSize = Size; + hspi->TxXferCount = Size; + hspi->pRxBuffPtr = (uint8_t *)pRxData; + hspi->RxXferSize = Size; + hspi->RxXferCount = Size; + + /* Set the function for IT treatment */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + hspi->RxISR = SPI_2linesRxISR_16BIT; + hspi->TxISR = SPI_2linesTxISR_16BIT; + } + else + { + hspi->RxISR = SPI_2linesRxISR_8BIT; + hspi->TxISR = SPI_2linesTxISR_8BIT; + } + +#if (USE_SPI_CRC != 0U) + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + SPI_RESET_CRC(hspi); + } +#endif /* USE_SPI_CRC */ + + + /* Check if the SPI is already enabled */ + if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) + { + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + } + + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + /* Enable TXE, RXNE and ERR interrupt */ + __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR)); + + return HAL_OK; +} + +/** + * @brief Transmit an amount of data in non-blocking mode with DMA. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param pData pointer to data buffer (u8 or u16 data elements) + * @param Size amount of data elements (u8 or u16) to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size) +{ + + /* Check tx dma handle */ + assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx)); + + /* Check Direction parameter */ + assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); + + if (hspi->State != HAL_SPI_STATE_READY) + { + return HAL_BUSY; + } + + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(hspi); + + /* Set the transaction information */ + hspi->State = HAL_SPI_STATE_BUSY_TX; + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->pTxBuffPtr = (const uint8_t *)pData; + hspi->TxXferSize = Size; + hspi->TxXferCount = Size; + + /* Init field not used in handle to zero */ + hspi->pRxBuffPtr = (uint8_t *)NULL; + hspi->TxISR = NULL; + hspi->RxISR = NULL; + hspi->RxXferSize = 0U; + hspi->RxXferCount = 0U; + + /* Configure communication direction : 1Line */ + if (hspi->Init.Direction == SPI_DIRECTION_1LINE) + { + /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ + __HAL_SPI_DISABLE(hspi); + SPI_1LINE_TX(hspi); + } + +#if (USE_SPI_CRC != 0U) + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + SPI_RESET_CRC(hspi); + } +#endif /* USE_SPI_CRC */ + + /* Set the SPI TxDMA Half transfer complete callback */ + hspi->hdmatx->XferHalfCpltCallback = SPI_DMAHalfTransmitCplt; + + /* Set the SPI TxDMA transfer complete callback */ + hspi->hdmatx->XferCpltCallback = SPI_DMATransmitCplt; + + /* Set the DMA error callback */ + hspi->hdmatx->XferErrorCallback = SPI_DMAError; + + /* Set the DMA AbortCpltCallback */ + hspi->hdmatx->XferAbortCallback = NULL; + + /* Enable the Tx DMA Stream/Channel */ + if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR, + hspi->TxXferCount)) + { + /* Update SPI error code */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + return HAL_ERROR; + } + + /* Check if the SPI is already enabled */ + if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) + { + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + } + + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + + /* Enable the SPI Error Interrupt Bit */ + __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR)); + + /* Enable Tx DMA Request */ + SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); + + return HAL_OK; +} + +/** + * @brief Receive an amount of data in non-blocking mode with DMA. + * @note In case of MASTER mode and SPI_DIRECTION_2LINES direction, hdmatx shall be defined. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param pData pointer to data buffer (u8 or u16 data elements) + * @note When the CRC feature is enabled the pData Length must be Size + 1. + * @param Size amount of data elements (u8 or u16) to be received + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) +{ + /* Check rx dma handle */ + assert_param(IS_SPI_DMA_HANDLE(hspi->hdmarx)); + + if (hspi->State != HAL_SPI_STATE_READY) + { + return HAL_BUSY; + } + + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER)) + { + hspi->State = HAL_SPI_STATE_BUSY_RX; + + /* Check tx dma handle */ + assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx)); + + /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */ + return HAL_SPI_TransmitReceive_DMA(hspi, pData, pData, Size); + } + + /* Process Locked */ + __HAL_LOCK(hspi); + + /* Set the transaction information */ + hspi->State = HAL_SPI_STATE_BUSY_RX; + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->pRxBuffPtr = (uint8_t *)pData; + hspi->RxXferSize = Size; + hspi->RxXferCount = Size; + + /*Init field not used in handle to zero */ + hspi->RxISR = NULL; + hspi->TxISR = NULL; + hspi->TxXferSize = 0U; + hspi->TxXferCount = 0U; + + /* Configure communication direction : 1Line */ + if (hspi->Init.Direction == SPI_DIRECTION_1LINE) + { + /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ + __HAL_SPI_DISABLE(hspi); + SPI_1LINE_RX(hspi); + } + +#if (USE_SPI_CRC != 0U) + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + SPI_RESET_CRC(hspi); + } +#endif /* USE_SPI_CRC */ + + /* Set the SPI RxDMA Half transfer complete callback */ + hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt; + + /* Set the SPI Rx DMA transfer complete callback */ + hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; + + /* Set the DMA error callback */ + hspi->hdmarx->XferErrorCallback = SPI_DMAError; + + /* Set the DMA AbortCpltCallback */ + hspi->hdmarx->XferAbortCallback = NULL; + + /* Enable the Rx DMA Stream/Channel */ + if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, + hspi->RxXferCount)) + { + /* Update SPI error code */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + return HAL_ERROR; + } + + /* Check if the SPI is already enabled */ + if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) + { + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + } + + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + + /* Enable the SPI Error Interrupt Bit */ + __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR)); + + /* Enable Rx DMA Request */ + SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); + + return HAL_OK; +} + +/** + * @brief Transmit and Receive an amount of data in non-blocking mode with DMA. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param pTxData pointer to transmission data buffer (u8 or u16 data elements) + * @param pRxData pointer to reception data buffer (u8 or u16 data elements) + * @note When the CRC feature is enabled the pRxData Length must be Size + 1 + * @param Size amount of data elements (u8 or u16) to be sent and received + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, + uint16_t Size) +{ + uint32_t tmp_mode; + HAL_SPI_StateTypeDef tmp_state; + + /* Check rx & tx dma handles */ + assert_param(IS_SPI_DMA_HANDLE(hspi->hdmarx)); + assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx)); + + /* Check Direction parameter */ + assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); + + /* Init temporary variables */ + tmp_state = hspi->State; + tmp_mode = hspi->Init.Mode; + + if (!((tmp_state == HAL_SPI_STATE_READY) || + ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && + (tmp_state == HAL_SPI_STATE_BUSY_RX)))) + { + return HAL_BUSY; + } + + if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(hspi); + + /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ + if (hspi->State != HAL_SPI_STATE_BUSY_RX) + { + hspi->State = HAL_SPI_STATE_BUSY_TX_RX; + } + + /* Set the transaction information */ + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->pTxBuffPtr = (const uint8_t *)pTxData; + hspi->TxXferSize = Size; + hspi->TxXferCount = Size; + hspi->pRxBuffPtr = (uint8_t *)pRxData; + hspi->RxXferSize = Size; + hspi->RxXferCount = Size; + + /* Init field not used in handle to zero */ + hspi->RxISR = NULL; + hspi->TxISR = NULL; + +#if (USE_SPI_CRC != 0U) + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + SPI_RESET_CRC(hspi); + } +#endif /* USE_SPI_CRC */ + + /* Check if we are in Rx only or in Rx/Tx Mode and configure the DMA transfer complete callback */ + if (hspi->State == HAL_SPI_STATE_BUSY_RX) + { + /* Set the SPI Rx DMA Half transfer complete callback */ + hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt; + hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; + } + else + { + /* Set the SPI Tx/Rx DMA Half transfer complete callback */ + hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfTransmitReceiveCplt; + hspi->hdmarx->XferCpltCallback = SPI_DMATransmitReceiveCplt; + } + + /* Set the DMA error callback */ + hspi->hdmarx->XferErrorCallback = SPI_DMAError; + + /* Set the DMA AbortCpltCallback */ + hspi->hdmarx->XferAbortCallback = NULL; + + /* Enable the Rx DMA Stream/Channel */ + if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, + hspi->RxXferCount)) + { + /* Update SPI error code */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + return HAL_ERROR; + } + + /* Enable Rx DMA Request */ + SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); + + /* Set the SPI Tx DMA transfer complete callback as NULL because the communication closing + is performed in DMA reception complete callback */ + hspi->hdmatx->XferHalfCpltCallback = NULL; + hspi->hdmatx->XferCpltCallback = NULL; + hspi->hdmatx->XferErrorCallback = NULL; + hspi->hdmatx->XferAbortCallback = NULL; + + /* Enable the Tx DMA Stream/Channel */ + if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR, + hspi->TxXferCount)) + { + /* Update SPI error code */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + return HAL_ERROR; + } + + /* Check if the SPI is already enabled */ + if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) + { + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + } + + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + + /* Enable the SPI Error Interrupt Bit */ + __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR)); + + /* Enable Tx DMA Request */ + SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); + + return HAL_OK; +} + +/** + * @brief Abort ongoing transfer (blocking mode). + * @param hspi SPI handle. + * @note This procedure could be used for aborting any ongoing transfer (Tx and Rx), + * started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable SPI Interrupts (depending of transfer direction) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) + * - Set handle State to READY + * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_Abort(SPI_HandleTypeDef *hspi) +{ + HAL_StatusTypeDef errorcode; + __IO uint32_t count; + __IO uint32_t resetcount; + + /* Initialized local variable */ + errorcode = HAL_OK; + resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); + count = resetcount; + + /* Clear ERRIE interrupt to avoid error interrupts generation during Abort procedure */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE); + + /* Disable TXEIE, RXNEIE and ERRIE(mode fault event, overrun error, TI frame error) interrupts */ + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE)) + { + hspi->TxISR = SPI_AbortTx_ISR; + /* Wait HAL_SPI_STATE_ABORT state */ + do + { + if (count == 0U) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + break; + } + count--; + } while (hspi->State != HAL_SPI_STATE_ABORT); + /* Reset Timeout Counter */ + count = resetcount; + } + + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)) + { + hspi->RxISR = SPI_AbortRx_ISR; + /* Wait HAL_SPI_STATE_ABORT state */ + do + { + if (count == 0U) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + break; + } + count--; + } while (hspi->State != HAL_SPI_STATE_ABORT); + /* Reset Timeout Counter */ + count = resetcount; + } + + /* Disable the SPI DMA Tx request if enabled */ + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN)) + { + /* Abort the SPI DMA Tx Stream/Channel : use blocking DMA Abort API (no callback) */ + if (hspi->hdmatx != NULL) + { + /* Set the SPI DMA Abort callback : + will lead to call HAL_SPI_AbortCpltCallback() at end of DMA abort procedure */ + hspi->hdmatx->XferAbortCallback = NULL; + + /* Abort DMA Tx Handle linked to SPI Peripheral */ + if (HAL_DMA_Abort(hspi->hdmatx) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Disable Tx DMA Request */ + CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXDMAEN)); + + /* Wait until TXE flag is set */ + do + { + if (count == 0U) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + break; + } + count--; + } while ((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); + } + } + + /* Disable the SPI DMA Rx request if enabled */ + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN)) + { + /* Abort the SPI DMA Rx Stream/Channel : use blocking DMA Abort API (no callback) */ + if (hspi->hdmarx != NULL) + { + /* Set the SPI DMA Abort callback : + will lead to call HAL_SPI_AbortCpltCallback() at end of DMA abort procedure */ + hspi->hdmarx->XferAbortCallback = NULL; + + /* Abort DMA Rx Handle linked to SPI Peripheral */ + if (HAL_DMA_Abort(hspi->hdmarx) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Disable peripheral */ + __HAL_SPI_DISABLE(hspi); + + /* Disable Rx DMA Request */ + CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_RXDMAEN)); + } + } + /* Reset Tx and Rx transfer counters */ + hspi->RxXferCount = 0U; + hspi->TxXferCount = 0U; + + /* Check error during Abort procedure */ + if (hspi->ErrorCode == HAL_SPI_ERROR_ABORT) + { + /* return HAL_Error in case of error during Abort procedure */ + errorcode = HAL_ERROR; + } + else + { + /* Reset errorCode */ + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + } + + /* Clear the Error flags in the SR register */ + __HAL_SPI_CLEAR_OVRFLAG(hspi); + __HAL_SPI_CLEAR_FREFLAG(hspi); + + /* Restore hspi->state to ready */ + hspi->State = HAL_SPI_STATE_READY; + + return errorcode; +} + +/** + * @brief Abort ongoing transfer (Interrupt mode). + * @param hspi SPI handle. + * @note This procedure could be used for aborting any ongoing transfer (Tx and Rx), + * started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable SPI Interrupts (depending of transfer direction) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) + * - Set handle State to READY + * - At abort completion, call user abort complete callback + * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be + * considered as completed only when user abort complete callback is executed (not when exiting function). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_Abort_IT(SPI_HandleTypeDef *hspi) +{ + HAL_StatusTypeDef errorcode; + uint32_t abortcplt ; + __IO uint32_t count; + __IO uint32_t resetcount; + + /* Initialized local variable */ + errorcode = HAL_OK; + abortcplt = 1U; + resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); + count = resetcount; + + /* Clear ERRIE interrupt to avoid error interrupts generation during Abort procedure */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE); + + /* Change Rx and Tx Irq Handler to Disable TXEIE, RXNEIE and ERRIE interrupts */ + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE)) + { + hspi->TxISR = SPI_AbortTx_ISR; + /* Wait HAL_SPI_STATE_ABORT state */ + do + { + if (count == 0U) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + break; + } + count--; + } while (hspi->State != HAL_SPI_STATE_ABORT); + /* Reset Timeout Counter */ + count = resetcount; + } + + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)) + { + hspi->RxISR = SPI_AbortRx_ISR; + /* Wait HAL_SPI_STATE_ABORT state */ + do + { + if (count == 0U) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + break; + } + count--; + } while (hspi->State != HAL_SPI_STATE_ABORT); + /* Reset Timeout Counter */ + count = resetcount; + } + + /* If DMA Tx and/or DMA Rx Handles are associated to SPI Handle, DMA Abort complete callbacks should be initialised + before any call to DMA Abort functions */ + /* DMA Tx Handle is valid */ + if (hspi->hdmatx != NULL) + { + /* Set DMA Abort Complete callback if UART DMA Tx request if enabled. + Otherwise, set it to NULL */ + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN)) + { + hspi->hdmatx->XferAbortCallback = SPI_DMATxAbortCallback; + } + else + { + hspi->hdmatx->XferAbortCallback = NULL; + } + } + /* DMA Rx Handle is valid */ + if (hspi->hdmarx != NULL) + { + /* Set DMA Abort Complete callback if UART DMA Rx request if enabled. + Otherwise, set it to NULL */ + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN)) + { + hspi->hdmarx->XferAbortCallback = SPI_DMARxAbortCallback; + } + else + { + hspi->hdmarx->XferAbortCallback = NULL; + } + } + + /* Disable the SPI DMA Tx request if enabled */ + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN)) + { + /* Abort the SPI DMA Tx Stream/Channel */ + if (hspi->hdmatx != NULL) + { + /* Abort DMA Tx Handle linked to SPI Peripheral */ + if (HAL_DMA_Abort_IT(hspi->hdmatx) != HAL_OK) + { + hspi->hdmatx->XferAbortCallback = NULL; + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + else + { + abortcplt = 0U; + } + } + } + /* Disable the SPI DMA Rx request if enabled */ + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN)) + { + /* Abort the SPI DMA Rx Stream/Channel */ + if (hspi->hdmarx != NULL) + { + /* Abort DMA Rx Handle linked to SPI Peripheral */ + if (HAL_DMA_Abort_IT(hspi->hdmarx) != HAL_OK) + { + hspi->hdmarx->XferAbortCallback = NULL; + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + else + { + abortcplt = 0U; + } + } + } + + if (abortcplt == 1U) + { + /* Reset Tx and Rx transfer counters */ + hspi->RxXferCount = 0U; + hspi->TxXferCount = 0U; + + /* Check error during Abort procedure */ + if (hspi->ErrorCode == HAL_SPI_ERROR_ABORT) + { + /* return HAL_Error in case of error during Abort procedure */ + errorcode = HAL_ERROR; + } + else + { + /* Reset errorCode */ + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + } + + /* Clear the Error flags in the SR register */ + __HAL_SPI_CLEAR_OVRFLAG(hspi); + __HAL_SPI_CLEAR_FREFLAG(hspi); + + /* Restore hspi->State to Ready */ + hspi->State = HAL_SPI_STATE_READY; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->AbortCpltCallback(hspi); +#else + HAL_SPI_AbortCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } + + return errorcode; +} + +/** + * @brief Pause the DMA Transfer. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for the specified SPI module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_DMAPause(SPI_HandleTypeDef *hspi) +{ + /* Process Locked */ + __HAL_LOCK(hspi); + + /* Disable the SPI DMA Tx & Rx requests */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); + + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + + return HAL_OK; +} + +/** + * @brief Resume the DMA Transfer. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for the specified SPI module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_DMAResume(SPI_HandleTypeDef *hspi) +{ + /* Process Locked */ + __HAL_LOCK(hspi); + + /* Enable the SPI DMA Tx & Rx requests */ + SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); + + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + + return HAL_OK; +} + +/** + * @brief Stop the DMA Transfer. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for the specified SPI module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi) +{ + HAL_StatusTypeDef errorcode = HAL_OK; + /* The Lock is not implemented on this API to allow the user application + to call the HAL SPI API under callbacks HAL_SPI_TxCpltCallback() or HAL_SPI_RxCpltCallback() or + HAL_SPI_TxRxCpltCallback(): + when calling HAL_DMA_Abort() API the DMA TX/RX Transfer complete interrupt is generated + and the correspond call back is executed HAL_SPI_TxCpltCallback() or HAL_SPI_RxCpltCallback() or + HAL_SPI_TxRxCpltCallback() + */ + + /* Abort the SPI DMA tx Stream/Channel */ + if (hspi->hdmatx != NULL) + { + if (HAL_OK != HAL_DMA_Abort(hspi->hdmatx)) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); + errorcode = HAL_ERROR; + } + } + /* Abort the SPI DMA rx Stream/Channel */ + if (hspi->hdmarx != NULL) + { + if (HAL_OK != HAL_DMA_Abort(hspi->hdmarx)) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); + errorcode = HAL_ERROR; + } + } + + /* Disable the SPI DMA Tx & Rx requests */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); + hspi->State = HAL_SPI_STATE_READY; + return errorcode; +} + +/** + * @brief Handle SPI interrupt request. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for the specified SPI module. + * @retval None + */ +void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi) +{ + uint32_t itsource = hspi->Instance->CR2; + uint32_t itflag = hspi->Instance->SR; + + /* SPI in mode Receiver ----------------------------------------------------*/ + if ((SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) == RESET) && + (SPI_CHECK_FLAG(itflag, SPI_FLAG_RXNE) != RESET) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_RXNE) != RESET)) + { + hspi->RxISR(hspi); + return; + } + + /* SPI in mode Transmitter -------------------------------------------------*/ + if ((SPI_CHECK_FLAG(itflag, SPI_FLAG_TXE) != RESET) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_TXE) != RESET)) + { + hspi->TxISR(hspi); + return; + } + + /* SPI in Error Treatment --------------------------------------------------*/ + if (((SPI_CHECK_FLAG(itflag, SPI_FLAG_MODF) != RESET) || (SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) != RESET) + || (SPI_CHECK_FLAG(itflag, SPI_FLAG_FRE) != RESET)) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_ERR) != RESET)) + { + /* SPI Overrun error interrupt occurred ----------------------------------*/ + if (SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) != RESET) + { + if (hspi->State != HAL_SPI_STATE_BUSY_TX) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_OVR); + __HAL_SPI_CLEAR_OVRFLAG(hspi); + } + else + { + __HAL_SPI_CLEAR_OVRFLAG(hspi); + return; + } + } + + /* SPI Mode Fault error interrupt occurred -------------------------------*/ + if (SPI_CHECK_FLAG(itflag, SPI_FLAG_MODF) != RESET) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_MODF); + __HAL_SPI_CLEAR_MODFFLAG(hspi); + } + + /* SPI Frame error interrupt occurred ------------------------------------*/ + if (SPI_CHECK_FLAG(itflag, SPI_FLAG_FRE) != RESET) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FRE); + __HAL_SPI_CLEAR_FREFLAG(hspi); + } + + if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) + { + /* Disable all interrupts */ + __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE | SPI_IT_TXE | SPI_IT_ERR); + + hspi->State = HAL_SPI_STATE_READY; + /* Disable the SPI DMA requests if enabled */ + if ((HAL_IS_BIT_SET(itsource, SPI_CR2_TXDMAEN)) || (HAL_IS_BIT_SET(itsource, SPI_CR2_RXDMAEN))) + { + CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN)); + + /* Abort the SPI DMA Rx channel */ + if (hspi->hdmarx != NULL) + { + /* Set the SPI DMA Abort callback : + will lead to call HAL_SPI_ErrorCallback() at end of DMA abort procedure */ + hspi->hdmarx->XferAbortCallback = SPI_DMAAbortOnError; + if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmarx)) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + } + } + /* Abort the SPI DMA Tx channel */ + if (hspi->hdmatx != NULL) + { + /* Set the SPI DMA Abort callback : + will lead to call HAL_SPI_ErrorCallback() at end of DMA abort procedure */ + hspi->hdmatx->XferAbortCallback = SPI_DMAAbortOnError; + if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmatx)) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + } + } + } + else + { + /* Call user error callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->ErrorCallback(hspi); +#else + HAL_SPI_ErrorCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } + } + return; + } +} + +/** + * @brief Tx Transfer completed callback. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +__weak void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SPI_TxCpltCallback should be implemented in the user file + */ +} + +/** + * @brief Rx Transfer completed callback. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +__weak void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SPI_RxCpltCallback should be implemented in the user file + */ +} + +/** + * @brief Tx and Rx Transfer completed callback. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +__weak void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SPI_TxRxCpltCallback should be implemented in the user file + */ +} + +/** + * @brief Tx Half Transfer completed callback. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +__weak void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SPI_TxHalfCpltCallback should be implemented in the user file + */ +} + +/** + * @brief Rx Half Transfer completed callback. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +__weak void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SPI_RxHalfCpltCallback() should be implemented in the user file + */ +} + +/** + * @brief Tx and Rx Half Transfer callback. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +__weak void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SPI_TxRxHalfCpltCallback() should be implemented in the user file + */ +} + +/** + * @brief SPI error callback. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +__weak void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SPI_ErrorCallback should be implemented in the user file + */ + /* NOTE : The ErrorCode parameter in the hspi handle is updated by the SPI processes + and user can use HAL_SPI_GetError() API to check the latest error occurred + */ +} + +/** + * @brief SPI Abort Complete callback. + * @param hspi SPI handle. + * @retval None + */ +__weak void HAL_SPI_AbortCpltCallback(SPI_HandleTypeDef *hspi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SPI_AbortCpltCallback can be implemented in the user file. + */ +} + +/** + * @} + */ + +/** @defgroup SPI_Exported_Functions_Group3 Peripheral State and Errors functions + * @brief SPI control functions + * +@verbatim + =============================================================================== + ##### Peripheral State and Errors functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the SPI. + (+) HAL_SPI_GetState() API can be helpful to check in run-time the state of the SPI peripheral + (+) HAL_SPI_GetError() check in run-time Errors occurring during communication +@endverbatim + * @{ + */ + +/** + * @brief Return the SPI handle state. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval SPI state + */ +HAL_SPI_StateTypeDef HAL_SPI_GetState(const SPI_HandleTypeDef *hspi) +{ + /* Return SPI handle state */ + return hspi->State; +} + +/** + * @brief Return the SPI error code. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval SPI error code in bitmap format + */ +uint32_t HAL_SPI_GetError(const SPI_HandleTypeDef *hspi) +{ + /* Return SPI ErrorCode */ + return hspi->ErrorCode; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup SPI_Private_Functions + * @brief Private functions + * @{ + */ + +/** + * @brief DMA SPI transmit process complete callback. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma) +{ + SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); + uint32_t tickstart; + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + /* DMA Normal Mode */ + if ((hdma->Instance->CR & DMA_SxCR_CIRC) != DMA_SxCR_CIRC) + { + /* Disable ERR interrupt */ + __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); + + /* Disable Tx DMA Request */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); + + /* Check the end of the transaction */ + if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + } + + /* Clear overrun flag in 2 Lines communication mode because received data is not read */ + if (hspi->Init.Direction == SPI_DIRECTION_2LINES) + { + __HAL_SPI_CLEAR_OVRFLAG(hspi); + } + + hspi->TxXferCount = 0U; + hspi->State = HAL_SPI_STATE_READY; + + if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) + { + /* Call user error callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->ErrorCallback(hspi); +#else + HAL_SPI_ErrorCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + return; + } + } + /* Call user Tx complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->TxCpltCallback(hspi); +#else + HAL_SPI_TxCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA SPI receive process complete callback. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma) +{ + SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); + uint32_t tickstart; +#if (USE_SPI_CRC != 0U) + __IO uint32_t tmpreg = 0U; +#endif /* USE_SPI_CRC */ + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + /* DMA Normal Mode */ + if ((hdma->Instance->CR & DMA_SxCR_CIRC) != DMA_SxCR_CIRC) + { + /* Disable ERR interrupt */ + __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); + +#if (USE_SPI_CRC != 0U) + /* CRC handling */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + /* Wait until RXNE flag */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) + { + /* Error on the CRC reception */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + } + /* Read CRC */ + tmpreg = READ_REG(hspi->Instance->DR); + /* To avoid GCC warning */ + UNUSED(tmpreg); + } +#endif /* USE_SPI_CRC */ + + /* Check if we are in Master RX 2 line mode */ + if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER)) + { + /* Disable Rx/Tx DMA Request (done by default to handle the case master rx direction 2 lines) */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); + } + else + { + /* Normal case */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); + } + + /* Check the end of the transaction */ + if (SPI_EndRxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_FLAG; + } + + hspi->RxXferCount = 0U; + hspi->State = HAL_SPI_STATE_READY; + +#if (USE_SPI_CRC != 0U) + /* Check if CRC error occurred */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + __HAL_SPI_CLEAR_CRCERRFLAG(hspi); + } +#endif /* USE_SPI_CRC */ + + if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) + { + /* Call user error callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->ErrorCallback(hspi); +#else + HAL_SPI_ErrorCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + return; + } + } + /* Call user Rx complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->RxCpltCallback(hspi); +#else + HAL_SPI_RxCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA SPI transmit receive process complete callback. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma) +{ + SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); + uint32_t tickstart; +#if (USE_SPI_CRC != 0U) + __IO uint32_t tmpreg = 0U; +#endif /* USE_SPI_CRC */ + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + /* DMA Normal Mode */ + if ((hdma->Instance->CR & DMA_SxCR_CIRC) != DMA_SxCR_CIRC) + { + /* Disable ERR interrupt */ + __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); + +#if (USE_SPI_CRC != 0U) + /* CRC handling */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + /* Wait the CRC data */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + } + /* Read CRC to Flush DR and RXNE flag */ + tmpreg = READ_REG(hspi->Instance->DR); + /* To avoid GCC warning */ + UNUSED(tmpreg); + } +#endif /* USE_SPI_CRC */ + + /* Check the end of the transaction */ + if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + } + + /* Disable Rx/Tx DMA Request */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); + + hspi->TxXferCount = 0U; + hspi->RxXferCount = 0U; + hspi->State = HAL_SPI_STATE_READY; + +#if (USE_SPI_CRC != 0U) + /* Check if CRC error occurred */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + __HAL_SPI_CLEAR_CRCERRFLAG(hspi); + } +#endif /* USE_SPI_CRC */ + + if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) + { + /* Call user error callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->ErrorCallback(hspi); +#else + HAL_SPI_ErrorCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + return; + } + } + /* Call user TxRx complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->TxRxCpltCallback(hspi); +#else + HAL_SPI_TxRxCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA SPI half transmit process complete callback. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma) +{ + SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); + + /* Call user Tx half complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->TxHalfCpltCallback(hspi); +#else + HAL_SPI_TxHalfCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA SPI half receive process complete callback + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma) +{ + SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); + + /* Call user Rx half complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->RxHalfCpltCallback(hspi); +#else + HAL_SPI_RxHalfCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA SPI half transmit receive process complete callback. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma) +{ + SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); + + /* Call user TxRx half complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->TxRxHalfCpltCallback(hspi); +#else + HAL_SPI_TxRxHalfCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA SPI communication error callback. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void SPI_DMAError(DMA_HandleTypeDef *hdma) +{ + SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); + + /* Stop the disable DMA transfer on SPI side */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); + + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); + hspi->State = HAL_SPI_STATE_READY; + /* Call user error callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->ErrorCallback(hspi); +#else + HAL_SPI_ErrorCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA SPI communication abort callback, when initiated by HAL services on Error + * (To be called at end of DMA Abort procedure following error occurrence). + * @param hdma DMA handle. + * @retval None + */ +static void SPI_DMAAbortOnError(DMA_HandleTypeDef *hdma) +{ + SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); + hspi->RxXferCount = 0U; + hspi->TxXferCount = 0U; + + /* Call user error callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->ErrorCallback(hspi); +#else + HAL_SPI_ErrorCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA SPI Tx communication abort callback, when initiated by user + * (To be called at end of DMA Tx Abort procedure following user abort request). + * @note When this callback is executed, User Abort complete call back is called only if no + * Abort still ongoing for Rx DMA Handle. + * @param hdma DMA handle. + * @retval None + */ +static void SPI_DMATxAbortCallback(DMA_HandleTypeDef *hdma) +{ + SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); + __IO uint32_t count; + + hspi->hdmatx->XferAbortCallback = NULL; + count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); + + /* Disable Tx DMA Request */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); + + /* Wait until TXE flag is set */ + do + { + if (count == 0U) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + break; + } + count--; + } while ((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); + + /* Check if an Abort process is still ongoing */ + if (hspi->hdmarx != NULL) + { + if (hspi->hdmarx->XferAbortCallback != NULL) + { + return; + } + } + + /* No Abort process still ongoing : All DMA Stream/Channel are aborted, call user Abort Complete callback */ + hspi->RxXferCount = 0U; + hspi->TxXferCount = 0U; + + /* Check no error during Abort procedure */ + if (hspi->ErrorCode != HAL_SPI_ERROR_ABORT) + { + /* Reset errorCode */ + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + } + + /* Clear the Error flags in the SR register */ + __HAL_SPI_CLEAR_OVRFLAG(hspi); + __HAL_SPI_CLEAR_FREFLAG(hspi); + + /* Restore hspi->State to Ready */ + hspi->State = HAL_SPI_STATE_READY; + + /* Call user Abort complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->AbortCpltCallback(hspi); +#else + HAL_SPI_AbortCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA SPI Rx communication abort callback, when initiated by user + * (To be called at end of DMA Rx Abort procedure following user abort request). + * @note When this callback is executed, User Abort complete call back is called only if no + * Abort still ongoing for Tx DMA Handle. + * @param hdma DMA handle. + * @retval None + */ +static void SPI_DMARxAbortCallback(DMA_HandleTypeDef *hdma) +{ + SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); + + /* Disable SPI Peripheral */ + __HAL_SPI_DISABLE(hspi); + + hspi->hdmarx->XferAbortCallback = NULL; + + /* Disable Rx DMA Request */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); + + /* Check Busy flag */ + if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + } + + /* Check if an Abort process is still ongoing */ + if (hspi->hdmatx != NULL) + { + if (hspi->hdmatx->XferAbortCallback != NULL) + { + return; + } + } + + /* No Abort process still ongoing : All DMA Stream/Channel are aborted, call user Abort Complete callback */ + hspi->RxXferCount = 0U; + hspi->TxXferCount = 0U; + + /* Check no error during Abort procedure */ + if (hspi->ErrorCode != HAL_SPI_ERROR_ABORT) + { + /* Reset errorCode */ + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + } + + /* Clear the Error flags in the SR register */ + __HAL_SPI_CLEAR_OVRFLAG(hspi); + __HAL_SPI_CLEAR_FREFLAG(hspi); + + /* Restore hspi->State to Ready */ + hspi->State = HAL_SPI_STATE_READY; + + /* Call user Abort complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->AbortCpltCallback(hspi); +#else + HAL_SPI_AbortCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +} + +/** + * @brief Rx 8-bit handler for Transmit and Receive in Interrupt mode. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_2linesRxISR_8BIT(struct __SPI_HandleTypeDef *hspi) +{ + /* Receive data in 8bit mode */ + *hspi->pRxBuffPtr = *((__IO uint8_t *)&hspi->Instance->DR); + hspi->pRxBuffPtr++; + hspi->RxXferCount--; + + /* Check end of the reception */ + if (hspi->RxXferCount == 0U) + { +#if (USE_SPI_CRC != 0U) + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + hspi->RxISR = SPI_2linesRxISR_8BITCRC; + return; + } +#endif /* USE_SPI_CRC */ + + /* Disable RXNE and ERR interrupt */ + __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); + + if (hspi->TxXferCount == 0U) + { + SPI_CloseRxTx_ISR(hspi); + } + } +} + +#if (USE_SPI_CRC != 0U) +/** + * @brief Rx 8-bit handler for Transmit and Receive in Interrupt mode. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_2linesRxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi) +{ + __IO uint8_t *ptmpreg8; + __IO uint8_t tmpreg8 = 0; + + /* Initialize the 8bit temporary pointer */ + ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; + /* Read 8bit CRC to flush Data Register */ + tmpreg8 = *ptmpreg8; + /* To avoid GCC warning */ + UNUSED(tmpreg8); + + /* Disable RXNE and ERR interrupt */ + __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); + + if (hspi->TxXferCount == 0U) + { + SPI_CloseRxTx_ISR(hspi); + } +} +#endif /* USE_SPI_CRC */ + +/** + * @brief Tx 8-bit handler for Transmit and Receive in Interrupt mode. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_2linesTxISR_8BIT(struct __SPI_HandleTypeDef *hspi) +{ + *(__IO uint8_t *)&hspi->Instance->DR = *((const uint8_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr++; + hspi->TxXferCount--; + + /* Check the end of the transmission */ + if (hspi->TxXferCount == 0U) + { +#if (USE_SPI_CRC != 0U) + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + /* Set CRC Next Bit to send CRC */ + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + /* Disable TXE interrupt */ + __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); + return; + } +#endif /* USE_SPI_CRC */ + + /* Disable TXE interrupt */ + __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); + + if (hspi->RxXferCount == 0U) + { + SPI_CloseRxTx_ISR(hspi); + } + } +} + +/** + * @brief Rx 16-bit handler for Transmit and Receive in Interrupt mode. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_2linesRxISR_16BIT(struct __SPI_HandleTypeDef *hspi) +{ + /* Receive data in 16 Bit mode */ + *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR); + hspi->pRxBuffPtr += sizeof(uint16_t); + hspi->RxXferCount--; + + if (hspi->RxXferCount == 0U) + { +#if (USE_SPI_CRC != 0U) + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + hspi->RxISR = SPI_2linesRxISR_16BITCRC; + return; + } +#endif /* USE_SPI_CRC */ + + /* Disable RXNE interrupt */ + __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE); + + if (hspi->TxXferCount == 0U) + { + SPI_CloseRxTx_ISR(hspi); + } + } +} + +#if (USE_SPI_CRC != 0U) +/** + * @brief Manage the CRC 16-bit receive for Transmit and Receive in Interrupt mode. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_2linesRxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi) +{ + __IO uint32_t tmpreg = 0U; + + /* Read 16bit CRC to flush Data Register */ + tmpreg = READ_REG(hspi->Instance->DR); + /* To avoid GCC warning */ + UNUSED(tmpreg); + + /* Disable RXNE interrupt */ + __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE); + + SPI_CloseRxTx_ISR(hspi); +} +#endif /* USE_SPI_CRC */ + +/** + * @brief Tx 16-bit handler for Transmit and Receive in Interrupt mode. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_2linesTxISR_16BIT(struct __SPI_HandleTypeDef *hspi) +{ + /* Transmit data in 16 Bit mode */ + hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint16_t); + hspi->TxXferCount--; + + /* Enable CRC Transmission */ + if (hspi->TxXferCount == 0U) + { +#if (USE_SPI_CRC != 0U) + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + /* Set CRC Next Bit to send CRC */ + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + /* Disable TXE interrupt */ + __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); + return; + } +#endif /* USE_SPI_CRC */ + + /* Disable TXE interrupt */ + __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); + + if (hspi->RxXferCount == 0U) + { + SPI_CloseRxTx_ISR(hspi); + } + } +} + +#if (USE_SPI_CRC != 0U) +/** + * @brief Manage the CRC 8-bit receive in Interrupt context. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_RxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi) +{ + __IO uint8_t *ptmpreg8; + __IO uint8_t tmpreg8 = 0; + + /* Initialize the 8bit temporary pointer */ + ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; + /* Read 8bit CRC to flush Data Register */ + tmpreg8 = *ptmpreg8; + /* To avoid GCC warning */ + UNUSED(tmpreg8); + + SPI_CloseRx_ISR(hspi); +} +#endif /* USE_SPI_CRC */ + +/** + * @brief Manage the receive 8-bit in Interrupt context. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_RxISR_8BIT(struct __SPI_HandleTypeDef *hspi) +{ + *hspi->pRxBuffPtr = (*(__IO uint8_t *)&hspi->Instance->DR); + hspi->pRxBuffPtr++; + hspi->RxXferCount--; + +#if (USE_SPI_CRC != 0U) + /* Enable CRC Transmission */ + if ((hspi->RxXferCount == 1U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) + { + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + } +#endif /* USE_SPI_CRC */ + + if (hspi->RxXferCount == 0U) + { +#if (USE_SPI_CRC != 0U) + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + hspi->RxISR = SPI_RxISR_8BITCRC; + return; + } +#endif /* USE_SPI_CRC */ + SPI_CloseRx_ISR(hspi); + } +} + +#if (USE_SPI_CRC != 0U) +/** + * @brief Manage the CRC 16-bit receive in Interrupt context. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_RxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi) +{ + __IO uint32_t tmpreg = 0U; + + /* Read 16bit CRC to flush Data Register */ + tmpreg = READ_REG(hspi->Instance->DR); + /* To avoid GCC warning */ + UNUSED(tmpreg); + + /* Disable RXNE and ERR interrupt */ + __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); + + SPI_CloseRx_ISR(hspi); +} +#endif /* USE_SPI_CRC */ + +/** + * @brief Manage the 16-bit receive in Interrupt context. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_RxISR_16BIT(struct __SPI_HandleTypeDef *hspi) +{ + *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR); + hspi->pRxBuffPtr += sizeof(uint16_t); + hspi->RxXferCount--; + +#if (USE_SPI_CRC != 0U) + /* Enable CRC Transmission */ + if ((hspi->RxXferCount == 1U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) + { + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + } +#endif /* USE_SPI_CRC */ + + if (hspi->RxXferCount == 0U) + { +#if (USE_SPI_CRC != 0U) + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + hspi->RxISR = SPI_RxISR_16BITCRC; + return; + } +#endif /* USE_SPI_CRC */ + SPI_CloseRx_ISR(hspi); + } +} + +/** + * @brief Handle the data 8-bit transmit in Interrupt mode. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_TxISR_8BIT(struct __SPI_HandleTypeDef *hspi) +{ + *(__IO uint8_t *)&hspi->Instance->DR = *((const uint8_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr++; + hspi->TxXferCount--; + + if (hspi->TxXferCount == 0U) + { +#if (USE_SPI_CRC != 0U) + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + /* Enable CRC Transmission */ + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + } +#endif /* USE_SPI_CRC */ + SPI_CloseTx_ISR(hspi); + } +} + +/** + * @brief Handle the data 16-bit transmit in Interrupt mode. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_TxISR_16BIT(struct __SPI_HandleTypeDef *hspi) +{ + /* Transmit data in 16 Bit mode */ + hspi->Instance->DR = *((const uint16_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint16_t); + hspi->TxXferCount--; + + if (hspi->TxXferCount == 0U) + { +#if (USE_SPI_CRC != 0U) + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + /* Enable CRC Transmission */ + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + } +#endif /* USE_SPI_CRC */ + SPI_CloseTx_ISR(hspi); + } +} + +/** + * @brief Handle SPI Communication Timeout. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param Flag SPI flag to check + * @param State flag state to check + * @param Timeout Timeout duration + * @param Tickstart tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef SPI_WaitFlagStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus State, + uint32_t Timeout, uint32_t Tickstart) +{ + __IO uint32_t count; + uint32_t tmp_timeout; + uint32_t tmp_tickstart; + + /* Adjust Timeout value in case of end of transfer */ + tmp_timeout = Timeout - (HAL_GetTick() - Tickstart); + tmp_tickstart = HAL_GetTick(); + + /* Calculate Timeout based on a software loop to avoid blocking issue if Systick is disabled */ + count = tmp_timeout * ((SystemCoreClock * 32U) >> 20U); + + while ((__HAL_SPI_GET_FLAG(hspi, Flag) ? SET : RESET) != State) + { + if (Timeout != HAL_MAX_DELAY) + { + if (((HAL_GetTick() - tmp_tickstart) >= tmp_timeout) || (tmp_timeout == 0U)) + { + /* Disable the SPI and reset the CRC: the CRC value should be cleared + on both master and slave sides in order to resynchronize the master + and slave for their respective CRC calculation */ + + /* Disable TXE, RXNE and ERR interrupts for the interrupt process */ + __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR)); + + if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE) + || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY))) + { + /* Disable SPI peripheral */ + __HAL_SPI_DISABLE(hspi); + } + + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + SPI_RESET_CRC(hspi); + } + + hspi->State = HAL_SPI_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + + return HAL_TIMEOUT; + } + /* If Systick is disabled or not incremented, deactivate timeout to go in disable loop procedure */ + if (count == 0U) + { + tmp_timeout = 0U; + } + else + { + count--; + } + } + } + + return HAL_OK; +} + +/** + * @brief Handle the check of the RX transaction complete. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param Timeout Timeout duration + * @param Tickstart tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef SPI_EndRxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart) +{ + if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE) + || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY))) + { + /* Disable SPI peripheral */ + __HAL_SPI_DISABLE(hspi); + } + + /* Erratasheet: BSY bit may stay high at the end of a data transfer in Slave mode */ + if (hspi->Init.Mode == SPI_MODE_MASTER) + { + if (hspi->Init.Direction != SPI_DIRECTION_2LINES_RXONLY) + { + /* Control the BSY flag */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, Timeout, Tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + return HAL_TIMEOUT; + } + } + else + { + /* Wait the RXNE reset */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout, Tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + return HAL_TIMEOUT; + } + } + } + else + { + /* Wait the RXNE reset */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout, Tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + return HAL_TIMEOUT; + } + } + return HAL_OK; +} + +/** + * @brief Handle the check of the RXTX or TX transaction complete. + * @param hspi SPI handle + * @param Timeout Timeout duration + * @param Tickstart tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef SPI_EndRxTxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart) +{ + __IO uint32_t count; + + /* Wait until TXE flag */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_TXE, SET, Timeout, Tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + return HAL_TIMEOUT; + } + + /* Timeout in us */ + count = SPI_BSY_FLAG_WORKAROUND_TIMEOUT * (SystemCoreClock / 24U / 1000000U); + /* Erratasheet: BSY bit may stay high at the end of a data transfer in Slave mode */ + if (hspi->Init.Mode == SPI_MODE_MASTER) + { + /* Control the BSY flag */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, Timeout, Tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + return HAL_TIMEOUT; + } + } + else + { + /* Wait BSY flag during 1 Byte time transfer in case of Full-Duplex and Tx transfer + * If Timeout is reached, the transfer is considered as finish. + * User have to calculate the timeout value to fit with the time of 1 byte transfer. + * This time is directly link with the SPI clock from Master device. + */ + do + { + if (count == 0U) + { + break; + } + count--; + } while (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_BSY) != RESET); + } + + return HAL_OK; +} + +/** + * @brief Handle the end of the RXTX transaction. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi) +{ + uint32_t tickstart; + __IO uint32_t count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); + + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + + /* Disable ERR interrupt */ + __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); + + /* Wait until TXE flag is set */ + do + { + if (count == 0U) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + break; + } + count--; + } while ((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); + + /* Check the end of the transaction */ + if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + } + + /* Clear overrun flag in 2 Lines communication mode because received is not read */ + if (hspi->Init.Direction == SPI_DIRECTION_2LINES) + { + __HAL_SPI_CLEAR_OVRFLAG(hspi); + } + +#if (USE_SPI_CRC != 0U) + /* Check if CRC error occurred */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET) + { + hspi->State = HAL_SPI_STATE_READY; + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + __HAL_SPI_CLEAR_CRCERRFLAG(hspi); + /* Call user error callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->ErrorCallback(hspi); +#else + HAL_SPI_ErrorCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } + else + { +#endif /* USE_SPI_CRC */ + if (hspi->ErrorCode == HAL_SPI_ERROR_NONE) + { + if (hspi->State == HAL_SPI_STATE_BUSY_RX) + { + hspi->State = HAL_SPI_STATE_READY; + /* Call user Rx complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->RxCpltCallback(hspi); +#else + HAL_SPI_RxCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } + else + { + hspi->State = HAL_SPI_STATE_READY; + /* Call user TxRx complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->TxRxCpltCallback(hspi); +#else + HAL_SPI_TxRxCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } + } + else + { + hspi->State = HAL_SPI_STATE_READY; + /* Call user error callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->ErrorCallback(hspi); +#else + HAL_SPI_ErrorCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } +#if (USE_SPI_CRC != 0U) + } +#endif /* USE_SPI_CRC */ +} + +/** + * @brief Handle the end of the RX transaction. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_CloseRx_ISR(SPI_HandleTypeDef *hspi) +{ + /* Disable RXNE and ERR interrupt */ + __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); + + /* Check the end of the transaction */ + if (SPI_EndRxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + } + + /* Clear overrun flag in 2 Lines communication mode because received is not read */ + if (hspi->Init.Direction == SPI_DIRECTION_2LINES) + { + __HAL_SPI_CLEAR_OVRFLAG(hspi); + } + hspi->State = HAL_SPI_STATE_READY; + +#if (USE_SPI_CRC != 0U) + /* Check if CRC error occurred */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + __HAL_SPI_CLEAR_CRCERRFLAG(hspi); + /* Call user error callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->ErrorCallback(hspi); +#else + HAL_SPI_ErrorCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } + else + { +#endif /* USE_SPI_CRC */ + if (hspi->ErrorCode == HAL_SPI_ERROR_NONE) + { + /* Call user Rx complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->RxCpltCallback(hspi); +#else + HAL_SPI_RxCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } + else + { + /* Call user error callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->ErrorCallback(hspi); +#else + HAL_SPI_ErrorCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } +#if (USE_SPI_CRC != 0U) + } +#endif /* USE_SPI_CRC */ +} + +/** + * @brief Handle the end of the TX transaction. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_CloseTx_ISR(SPI_HandleTypeDef *hspi) +{ + uint32_t tickstart; + __IO uint32_t count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + /* Wait until TXE flag is set */ + do + { + if (count == 0U) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + break; + } + count--; + } while ((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); + + /* Disable TXE and ERR interrupt */ + __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_ERR)); + + /* Check the end of the transaction */ + if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + } + + /* Clear overrun flag in 2 Lines communication mode because received is not read */ + if (hspi->Init.Direction == SPI_DIRECTION_2LINES) + { + __HAL_SPI_CLEAR_OVRFLAG(hspi); + } + + hspi->State = HAL_SPI_STATE_READY; + if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) + { + /* Call user error callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->ErrorCallback(hspi); +#else + HAL_SPI_ErrorCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } + else + { + /* Call user Rx complete callback */ +#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + hspi->TxCpltCallback(hspi); +#else + HAL_SPI_TxCpltCallback(hspi); +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } +} + +/** + * @brief Handle abort a Rx transaction. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_AbortRx_ISR(SPI_HandleTypeDef *hspi) +{ + __IO uint32_t tmpreg = 0U; + __IO uint32_t count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); + + /* Wait until TXE flag is set */ + do + { + if (count == 0U) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + break; + } + count--; + } while ((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); + + /* Disable SPI Peripheral */ + __HAL_SPI_DISABLE(hspi); + + /* Disable TXEIE, RXNEIE and ERRIE(mode fault event, overrun error, TI frame error) interrupts */ + CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXEIE | SPI_CR2_RXNEIE | SPI_CR2_ERRIE)); + + /* Flush Data Register by a blank read */ + tmpreg = READ_REG(hspi->Instance->DR); + /* To avoid GCC warning */ + UNUSED(tmpreg); + + hspi->State = HAL_SPI_STATE_ABORT; +} + +/** + * @brief Handle abort a Tx or Rx/Tx transaction. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_AbortTx_ISR(SPI_HandleTypeDef *hspi) +{ + /* Disable TXEIE interrupt */ + CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXEIE)); + + /* Disable SPI Peripheral */ + __HAL_SPI_DISABLE(hspi); + + hspi->State = HAL_SPI_STATE_ABORT; +} + +/** + * @} + */ + +#endif /* HAL_SPI_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + diff --git a/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c new file mode 100644 index 0000000..f056ebf --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c @@ -0,0 +1,7629 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_tim.c + * @author MCD Application Team + * @brief TIM HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Timer (TIM) peripheral: + * + TIM Time Base Initialization + * + TIM Time Base Start + * + TIM Time Base Start Interruption + * + TIM Time Base Start DMA + * + TIM Output Compare/PWM Initialization + * + TIM Output Compare/PWM Channel Configuration + * + TIM Output Compare/PWM Start + * + TIM Output Compare/PWM Start Interruption + * + TIM Output Compare/PWM Start DMA + * + TIM Input Capture Initialization + * + TIM Input Capture Channel Configuration + * + TIM Input Capture Start + * + TIM Input Capture Start Interruption + * + TIM Input Capture Start DMA + * + TIM One Pulse Initialization + * + TIM One Pulse Channel Configuration + * + TIM One Pulse Start + * + TIM Encoder Interface Initialization + * + TIM Encoder Interface Start + * + TIM Encoder Interface Start Interruption + * + TIM Encoder Interface Start DMA + * + Commutation Event configuration with Interruption and DMA + * + TIM OCRef clear configuration + * + TIM External Clock configuration + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### TIMER Generic features ##### + ============================================================================== + [..] The Timer features include: + (#) 16-bit up, down, up/down auto-reload counter. + (#) 16-bit programmable prescaler allowing dividing (also on the fly) the + counter clock frequency either by any factor between 1 and 65536. + (#) Up to 4 independent channels for: + (++) Input Capture + (++) Output Compare + (++) PWM generation (Edge and Center-aligned Mode) + (++) One-pulse mode output + (#) Synchronization circuit to control the timer with external signals and to interconnect + several timers together. + (#) Supports incremental encoder for positioning purposes + + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Initialize the TIM low level resources by implementing the following functions + depending on the selected feature: + (++) Time Base : HAL_TIM_Base_MspInit() + (++) Input Capture : HAL_TIM_IC_MspInit() + (++) Output Compare : HAL_TIM_OC_MspInit() + (++) PWM generation : HAL_TIM_PWM_MspInit() + (++) One-pulse mode output : HAL_TIM_OnePulse_MspInit() + (++) Encoder mode output : HAL_TIM_Encoder_MspInit() + + (#) Initialize the TIM low level resources : + (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE(); + (##) TIM pins configuration + (+++) Enable the clock for the TIM GPIOs using the following function: + __HAL_RCC_GPIOx_CLK_ENABLE(); + (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init(); + + (#) The external Clock can be configured, if needed (the default clock is the + internal clock from the APBx), using the following function: + HAL_TIM_ConfigClockSource, the clock configuration should be done before + any start function. + + (#) Configure the TIM in the desired functioning mode using one of the + Initialization function of this driver: + (++) HAL_TIM_Base_Init: to use the Timer to generate a simple time base + (++) HAL_TIM_OC_Init and HAL_TIM_OC_ConfigChannel: to use the Timer to generate an + Output Compare signal. + (++) HAL_TIM_PWM_Init and HAL_TIM_PWM_ConfigChannel: to use the Timer to generate a + PWM signal. + (++) HAL_TIM_IC_Init and HAL_TIM_IC_ConfigChannel: to use the Timer to measure an + external signal. + (++) HAL_TIM_OnePulse_Init and HAL_TIM_OnePulse_ConfigChannel: to use the Timer + in One Pulse Mode. + (++) HAL_TIM_Encoder_Init: to use the Timer Encoder Interface. + + (#) Activate the TIM peripheral using one of the start functions depending from the feature used: + (++) Time Base : HAL_TIM_Base_Start(), HAL_TIM_Base_Start_DMA(), HAL_TIM_Base_Start_IT() + (++) Input Capture : HAL_TIM_IC_Start(), HAL_TIM_IC_Start_DMA(), HAL_TIM_IC_Start_IT() + (++) Output Compare : HAL_TIM_OC_Start(), HAL_TIM_OC_Start_DMA(), HAL_TIM_OC_Start_IT() + (++) PWM generation : HAL_TIM_PWM_Start(), HAL_TIM_PWM_Start_DMA(), HAL_TIM_PWM_Start_IT() + (++) One-pulse mode output : HAL_TIM_OnePulse_Start(), HAL_TIM_OnePulse_Start_IT() + (++) Encoder mode output : HAL_TIM_Encoder_Start(), HAL_TIM_Encoder_Start_DMA(), HAL_TIM_Encoder_Start_IT(). + + (#) The DMA Burst is managed with the two following functions: + HAL_TIM_DMABurst_WriteStart() + HAL_TIM_DMABurst_ReadStart() + + *** Callback registration *** + ============================================= + + [..] + The compilation define USE_HAL_TIM_REGISTER_CALLBACKS when set to 1 + allows the user to configure dynamically the driver callbacks. + + [..] + Use Function HAL_TIM_RegisterCallback() to register a callback. + HAL_TIM_RegisterCallback() takes as parameters the HAL peripheral handle, + the Callback ID and a pointer to the user callback function. + + [..] + Use function HAL_TIM_UnRegisterCallback() to reset a callback to the default + weak function. + HAL_TIM_UnRegisterCallback takes as parameters the HAL peripheral handle, + and the Callback ID. + + [..] + These functions allow to register/unregister following callbacks: + (+) Base_MspInitCallback : TIM Base Msp Init Callback. + (+) Base_MspDeInitCallback : TIM Base Msp DeInit Callback. + (+) IC_MspInitCallback : TIM IC Msp Init Callback. + (+) IC_MspDeInitCallback : TIM IC Msp DeInit Callback. + (+) OC_MspInitCallback : TIM OC Msp Init Callback. + (+) OC_MspDeInitCallback : TIM OC Msp DeInit Callback. + (+) PWM_MspInitCallback : TIM PWM Msp Init Callback. + (+) PWM_MspDeInitCallback : TIM PWM Msp DeInit Callback. + (+) OnePulse_MspInitCallback : TIM One Pulse Msp Init Callback. + (+) OnePulse_MspDeInitCallback : TIM One Pulse Msp DeInit Callback. + (+) Encoder_MspInitCallback : TIM Encoder Msp Init Callback. + (+) Encoder_MspDeInitCallback : TIM Encoder Msp DeInit Callback. + (+) HallSensor_MspInitCallback : TIM Hall Sensor Msp Init Callback. + (+) HallSensor_MspDeInitCallback : TIM Hall Sensor Msp DeInit Callback. + (+) PeriodElapsedCallback : TIM Period Elapsed Callback. + (+) PeriodElapsedHalfCpltCallback : TIM Period Elapsed half complete Callback. + (+) TriggerCallback : TIM Trigger Callback. + (+) TriggerHalfCpltCallback : TIM Trigger half complete Callback. + (+) IC_CaptureCallback : TIM Input Capture Callback. + (+) IC_CaptureHalfCpltCallback : TIM Input Capture half complete Callback. + (+) OC_DelayElapsedCallback : TIM Output Compare Delay Elapsed Callback. + (+) PWM_PulseFinishedCallback : TIM PWM Pulse Finished Callback. + (+) PWM_PulseFinishedHalfCpltCallback : TIM PWM Pulse Finished half complete Callback. + (+) ErrorCallback : TIM Error Callback. + (+) CommutationCallback : TIM Commutation Callback. + (+) CommutationHalfCpltCallback : TIM Commutation half complete Callback. + (+) BreakCallback : TIM Break Callback. + + [..] +By default, after the Init and when the state is HAL_TIM_STATE_RESET +all interrupt callbacks are set to the corresponding weak functions: + examples HAL_TIM_TriggerCallback(), HAL_TIM_ErrorCallback(). + + [..] + Exception done for MspInit and MspDeInit functions that are reset to the legacy weak + functionalities in the Init / DeInit only when these callbacks are null + (not registered beforehand). If not, MspInit or MspDeInit are not null, the Init / DeInit + keep and use the user MspInit / MspDeInit callbacks(registered beforehand) + + [..] + Callbacks can be registered / unregistered in HAL_TIM_STATE_READY state only. + Exception done MspInit / MspDeInit that can be registered / unregistered + in HAL_TIM_STATE_READY or HAL_TIM_STATE_RESET state, + thus registered(user) MspInit / DeInit callbacks can be used during the Init / DeInit. + In that case first register the MspInit/MspDeInit user callbacks + using HAL_TIM_RegisterCallback() before calling DeInit or Init function. + + [..] + When The compilation define USE_HAL_TIM_REGISTER_CALLBACKS is set to 0 or + not defined, the callback registration feature is not available and all callbacks + are set to the corresponding weak functions. + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup TIM TIM + * @brief TIM HAL module driver + * @{ + */ + +#ifdef HAL_TIM_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** @addtogroup TIM_Private_Functions + * @{ + */ +static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config); +static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config); +static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config); +static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter); +static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter); +static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter); +static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter); +static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter); +static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource); +static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma); +static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma); +static void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma); +static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma); +static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma); +static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, + const TIM_SlaveConfigTypeDef *sSlaveConfig); +/** + * @} + */ +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup TIM_Exported_Functions TIM Exported Functions + * @{ + */ + +/** @defgroup TIM_Exported_Functions_Group1 TIM Time Base functions + * @brief Time Base functions + * +@verbatim + ============================================================================== + ##### Time Base functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM base. + (+) De-initialize the TIM base. + (+) Start the Time Base. + (+) Stop the Time Base. + (+) Start the Time Base and enable interrupt. + (+) Stop the Time Base and disable interrupt. + (+) Start the Time Base and enable DMA transfer. + (+) Stop the Time Base and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Time base Unit according to the specified + * parameters in the TIM_HandleTypeDef and initialize the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_Base_DeInit() before HAL_TIM_Base_Init() + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->Base_MspInitCallback == NULL) + { + htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->Base_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + HAL_TIM_Base_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Set the Time Base configuration */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Initialize the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + + /* Initialize the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM Base peripheral + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->Base_MspDeInitCallback == NULL) + { + htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; + } + /* DeInit the low level hardware */ + htim->Base_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_TIM_Base_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; + + /* Change the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Base MSP. + * @param htim TIM Base handle + * @retval None + */ +__weak void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_Base_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Base MSP. + * @param htim TIM Base handle + * @retval None + */ +__weak void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_Base_MspDeInit could be implemented in the user file + */ +} + + +/** + * @brief Starts the TIM Base generation. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + /* Check the TIM state */ + if (htim->State != HAL_TIM_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Base generation. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Base generation in interrupt mode. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + /* Check the TIM state */ + if (htim->State != HAL_TIM_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Enable the TIM Update interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Base generation in interrupt mode. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + /* Disable the TIM Update interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_UPDATE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Base generation in DMA mode. + * @param htim TIM Base handle + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, const uint32_t *pData, uint16_t Length) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); + + /* Set the TIM state */ + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if ((pData == NULL) || (Length == 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + return HAL_ERROR; + } + + /* Set the DMA Period elapsed callbacks */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; + htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)pData, (uint32_t)&htim->Instance->ARR, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + + /* Enable the TIM Update DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_UPDATE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Base generation in DMA mode. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); + + /* Disable the TIM Update DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_UPDATE); + + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group2 TIM Output Compare functions + * @brief TIM Output Compare functions + * +@verbatim + ============================================================================== + ##### TIM Output Compare functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM Output Compare. + (+) De-initialize the TIM Output Compare. + (+) Start the TIM Output Compare. + (+) Stop the TIM Output Compare. + (+) Start the TIM Output Compare and enable interrupt. + (+) Stop the TIM Output Compare and disable interrupt. + (+) Start the TIM Output Compare and enable DMA transfer. + (+) Stop the TIM Output Compare and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Output Compare according to the specified + * parameters in the TIM_HandleTypeDef and initializes the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_OC_DeInit() before HAL_TIM_OC_Init() + * @param htim TIM Output Compare handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->OC_MspInitCallback == NULL) + { + htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->OC_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_OC_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Init the base time for the Output Compare */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Initialize the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + + /* Initialize the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM peripheral + * @param htim TIM Output Compare handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->OC_MspDeInitCallback == NULL) + { + htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; + } + /* DeInit the low level hardware */ + htim->OC_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_OC_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; + + /* Change the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Output Compare MSP. + * @param htim TIM Output Compare handle + * @retval None + */ +__weak void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OC_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Output Compare MSP. + * @param htim TIM Output Compare handle + * @retval None + */ +__weak void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OC_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM Output Compare signal generation. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM channel state */ + if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Output Compare signal generation. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Disable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Output Compare signal generation in interrupt mode. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM channel state */ + if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Enable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM Output Compare signal generation in interrupt mode. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @brief Starts the TIM Output Compare signal generation in DMA mode. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to TIM peripheral + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, + uint16_t Length) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Set the TIM channel state */ + if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) + { + return HAL_BUSY; + } + else if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) + { + if ((pData == NULL) || (Length == 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + + /* Enable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + + /* Enable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 4 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM Output Compare signal generation in DMA mode. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group3 TIM PWM functions + * @brief TIM PWM functions + * +@verbatim + ============================================================================== + ##### TIM PWM functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM PWM. + (+) De-initialize the TIM PWM. + (+) Start the TIM PWM. + (+) Stop the TIM PWM. + (+) Start the TIM PWM and enable interrupt. + (+) Stop the TIM PWM and disable interrupt. + (+) Start the TIM PWM and enable DMA transfer. + (+) Stop the TIM PWM and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM PWM Time Base according to the specified + * parameters in the TIM_HandleTypeDef and initializes the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_PWM_DeInit() before HAL_TIM_PWM_Init() + * @param htim TIM PWM handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->PWM_MspInitCallback == NULL) + { + htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->PWM_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_PWM_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Init the base time for the PWM */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Initialize the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + + /* Initialize the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM peripheral + * @param htim TIM PWM handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->PWM_MspDeInitCallback == NULL) + { + htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; + } + /* DeInit the low level hardware */ + htim->PWM_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_PWM_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; + + /* Change the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM PWM MSP. + * @param htim TIM PWM handle + * @retval None + */ +__weak void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PWM_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM PWM MSP. + * @param htim TIM PWM handle + * @retval None + */ +__weak void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PWM_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the PWM signal generation. + * @param htim TIM handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM channel state */ + if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the PWM signal generation. + * @param htim TIM PWM handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Disable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the PWM signal generation in interrupt mode. + * @param htim TIM PWM handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM channel state */ + if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Enable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the PWM signal generation in interrupt mode. + * @param htim TIM PWM handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @brief Starts the TIM PWM signal generation in DMA mode. + * @param htim TIM PWM handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to TIM peripheral + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, + uint16_t Length) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Set the TIM channel state */ + if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) + { + return HAL_BUSY; + } + else if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) + { + if ((pData == NULL) || (Length == 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + + /* Enable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Output Capture/Compare 3 request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 4 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM PWM signal generation in DMA mode. + * @param htim TIM PWM handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group4 TIM Input Capture functions + * @brief TIM Input Capture functions + * +@verbatim + ============================================================================== + ##### TIM Input Capture functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM Input Capture. + (+) De-initialize the TIM Input Capture. + (+) Start the TIM Input Capture. + (+) Stop the TIM Input Capture. + (+) Start the TIM Input Capture and enable interrupt. + (+) Stop the TIM Input Capture and disable interrupt. + (+) Start the TIM Input Capture and enable DMA transfer. + (+) Stop the TIM Input Capture and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Input Capture Time base according to the specified + * parameters in the TIM_HandleTypeDef and initializes the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_IC_DeInit() before HAL_TIM_IC_Init() + * @param htim TIM Input Capture handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->IC_MspInitCallback == NULL) + { + htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->IC_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_IC_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Init the base time for the input capture */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Initialize the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + + /* Initialize the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM peripheral + * @param htim TIM Input Capture handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->IC_MspDeInitCallback == NULL) + { + htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; + } + /* DeInit the low level hardware */ + htim->IC_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_IC_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; + + /* Change the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Input Capture MSP. + * @param htim TIM Input Capture handle + * @retval None + */ +__weak void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_IC_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Input Capture MSP. + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_IC_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM Input Capture measurement. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + HAL_TIM_ChannelStateTypeDef channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); + HAL_TIM_ChannelStateTypeDef complementary_channel_state = TIM_CHANNEL_N_STATE_GET(htim, Channel); + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM channel state */ + if ((channel_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Input Capture measurement. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Disable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Input Capture measurement in interrupt mode. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + HAL_TIM_ChannelStateTypeDef channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); + HAL_TIM_ChannelStateTypeDef complementary_channel_state = TIM_CHANNEL_N_STATE_GET(htim, Channel); + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM channel state */ + if ((channel_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Enable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM Input Capture measurement in interrupt mode. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @brief Starts the TIM Input Capture measurement in DMA mode. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param pData The destination Buffer address. + * @param Length The length of data to be transferred from TIM peripheral to memory. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + HAL_TIM_ChannelStateTypeDef channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); + HAL_TIM_ChannelStateTypeDef complementary_channel_state = TIM_CHANNEL_N_STATE_GET(htim, Channel); + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + + /* Set the TIM channel state */ + if ((channel_state == HAL_TIM_CHANNEL_STATE_BUSY) + || (complementary_channel_state == HAL_TIM_CHANNEL_STATE_BUSY)) + { + return HAL_BUSY; + } + else if ((channel_state == HAL_TIM_CHANNEL_STATE_READY) + && (complementary_channel_state == HAL_TIM_CHANNEL_STATE_READY)) + { + if ((pData == NULL) || (Length == 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + + /* Enable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->CCR3, (uint32_t)pData, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->CCR4, (uint32_t)pData, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 4 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM Input Capture measurement in DMA mode. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group5 TIM One Pulse functions + * @brief TIM One Pulse functions + * +@verbatim + ============================================================================== + ##### TIM One Pulse functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM One Pulse. + (+) De-initialize the TIM One Pulse. + (+) Start the TIM One Pulse. + (+) Stop the TIM One Pulse. + (+) Start the TIM One Pulse and enable interrupt. + (+) Stop the TIM One Pulse and disable interrupt. + (+) Start the TIM One Pulse and enable DMA transfer. + (+) Stop the TIM One Pulse and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM One Pulse Time Base according to the specified + * parameters in the TIM_HandleTypeDef and initializes the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_OnePulse_DeInit() before HAL_TIM_OnePulse_Init() + * @note When the timer instance is initialized in One Pulse mode, timer + * channels 1 and channel 2 are reserved and cannot be used for other + * purpose. + * @param htim TIM One Pulse handle + * @param OnePulseMode Select the One pulse mode. + * This parameter can be one of the following values: + * @arg TIM_OPMODE_SINGLE: Only one pulse will be generated. + * @arg TIM_OPMODE_REPETITIVE: Repetitive pulses will be generated. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_OPM_MODE(OnePulseMode)); + assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->OnePulse_MspInitCallback == NULL) + { + htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->OnePulse_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_OnePulse_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Configure the Time base in the One Pulse Mode */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Reset the OPM Bit */ + htim->Instance->CR1 &= ~TIM_CR1_OPM; + + /* Configure the OPM Mode */ + htim->Instance->CR1 |= OnePulseMode; + + /* Initialize the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + + /* Initialize the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM One Pulse + * @param htim TIM One Pulse handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->OnePulse_MspDeInitCallback == NULL) + { + htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; + } + /* DeInit the low level hardware */ + htim->OnePulse_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_TIM_OnePulse_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM One Pulse MSP. + * @param htim TIM One Pulse handle + * @retval None + */ +__weak void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OnePulse_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM One Pulse MSP. + * @param htim TIM One Pulse handle + * @retval None + */ +__weak void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OnePulse_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM One Pulse signal generation. + * @note Though OutputChannel parameter is deprecated and ignored by the function + * it has been kept to avoid HAL_TIM API compatibility break. + * @note The pulse output channel is determined when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel See note above + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + + /* Check the TIM channels state */ + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Capture compare and the Input Capture channels + (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) + if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and + if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output + whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together + + No need to enable the counter, it's enabled automatically by hardware + (the counter starts in response to a stimulus and generate a pulse */ + + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM One Pulse signal generation. + * @note Though OutputChannel parameter is deprecated and ignored by the function + * it has been kept to avoid HAL_TIM API compatibility break. + * @note The pulse output channel is determined when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel See note above + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + + /* Disable the Capture compare and the Input Capture channels + (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) + if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and + if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output + whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */ + + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM One Pulse signal generation in interrupt mode. + * @note Though OutputChannel parameter is deprecated and ignored by the function + * it has been kept to avoid HAL_TIM API compatibility break. + * @note The pulse output channel is determined when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel See note above + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + + /* Check the TIM channels state */ + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Capture compare and the Input Capture channels + (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) + if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and + if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output + whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together + + No need to enable the counter, it's enabled automatically by hardware + (the counter starts in response to a stimulus and generate a pulse */ + + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM One Pulse signal generation in interrupt mode. + * @note Though OutputChannel parameter is deprecated and ignored by the function + * it has been kept to avoid HAL_TIM API compatibility break. + * @note The pulse output channel is determined when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel See note above + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + + /* Disable the Capture compare and the Input Capture channels + (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) + if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and + if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output + whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group6 TIM Encoder functions + * @brief TIM Encoder functions + * +@verbatim + ============================================================================== + ##### TIM Encoder functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM Encoder. + (+) De-initialize the TIM Encoder. + (+) Start the TIM Encoder. + (+) Stop the TIM Encoder. + (+) Start the TIM Encoder and enable interrupt. + (+) Stop the TIM Encoder and disable interrupt. + (+) Start the TIM Encoder and enable DMA transfer. + (+) Stop the TIM Encoder and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Encoder Interface and initialize the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_Encoder_DeInit() before HAL_TIM_Encoder_Init() + * @note Encoder mode and External clock mode 2 are not compatible and must not be selected together + * Ex: A call for @ref HAL_TIM_Encoder_Init will erase the settings of @ref HAL_TIM_ConfigClockSource + * using TIM_CLOCKSOURCE_ETRMODE2 and vice versa + * @note When the timer instance is initialized in Encoder mode, timer + * channels 1 and channel 2 are reserved and cannot be used for other + * purpose. + * @param htim TIM Encoder Interface handle + * @param sConfig TIM Encoder Interface configuration structure + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, const TIM_Encoder_InitTypeDef *sConfig) +{ + uint32_t tmpsmcr; + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + assert_param(IS_TIM_ENCODER_MODE(sConfig->EncoderMode)); + assert_param(IS_TIM_IC_SELECTION(sConfig->IC1Selection)); + assert_param(IS_TIM_IC_SELECTION(sConfig->IC2Selection)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC1Polarity)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC2Polarity)); + assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); + assert_param(IS_TIM_IC_PRESCALER(sConfig->IC2Prescaler)); + assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); + assert_param(IS_TIM_IC_FILTER(sConfig->IC2Filter)); + assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->Encoder_MspInitCallback == NULL) + { + htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->Encoder_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_Encoder_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Reset the SMS and ECE bits */ + htim->Instance->SMCR &= ~(TIM_SMCR_SMS | TIM_SMCR_ECE); + + /* Configure the Time base in the Encoder Mode */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Get the TIMx SMCR register value */ + tmpsmcr = htim->Instance->SMCR; + + /* Get the TIMx CCMR1 register value */ + tmpccmr1 = htim->Instance->CCMR1; + + /* Get the TIMx CCER register value */ + tmpccer = htim->Instance->CCER; + + /* Set the encoder Mode */ + tmpsmcr |= sConfig->EncoderMode; + + /* Select the Capture Compare 1 and the Capture Compare 2 as input */ + tmpccmr1 &= ~(TIM_CCMR1_CC1S | TIM_CCMR1_CC2S); + tmpccmr1 |= (sConfig->IC1Selection | (sConfig->IC2Selection << 8U)); + + /* Set the Capture Compare 1 and the Capture Compare 2 prescalers and filters */ + tmpccmr1 &= ~(TIM_CCMR1_IC1PSC | TIM_CCMR1_IC2PSC); + tmpccmr1 &= ~(TIM_CCMR1_IC1F | TIM_CCMR1_IC2F); + tmpccmr1 |= sConfig->IC1Prescaler | (sConfig->IC2Prescaler << 8U); + tmpccmr1 |= (sConfig->IC1Filter << 4U) | (sConfig->IC2Filter << 12U); + + /* Set the TI1 and the TI2 Polarities */ + tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC2P); + tmpccer &= ~(TIM_CCER_CC1NP | TIM_CCER_CC2NP); + tmpccer |= sConfig->IC1Polarity | (sConfig->IC2Polarity << 4U); + + /* Write to TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + + /* Write to TIMx CCMR1 */ + htim->Instance->CCMR1 = tmpccmr1; + + /* Write to TIMx CCER */ + htim->Instance->CCER = tmpccer; + + /* Initialize the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + + +/** + * @brief DeInitializes the TIM Encoder interface + * @param htim TIM Encoder Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->Encoder_MspDeInitCallback == NULL) + { + htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; + } + /* DeInit the low level hardware */ + htim->Encoder_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_TIM_Encoder_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Encoder Interface MSP. + * @param htim TIM Encoder Interface handle + * @retval None + */ +__weak void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_Encoder_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Encoder Interface MSP. + * @param htim TIM Encoder Interface handle + * @retval None + */ +__weak void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_Encoder_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM Encoder Interface. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); + + /* Set the TIM channel(s) state */ + if (Channel == TIM_CHANNEL_1) + { + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else if (Channel == TIM_CHANNEL_2) + { + if ((channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + + /* Enable the encoder interface channels */ + switch (Channel) + { + case TIM_CHANNEL_1: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + break; + } + + case TIM_CHANNEL_2: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + break; + } + + default : + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + break; + } + } + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Encoder Interface. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channels 1 and 2 + (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ + switch (Channel) + { + case TIM_CHANNEL_1: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + break; + } + + case TIM_CHANNEL_2: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + break; + } + + default : + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + break; + } + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel(s) state */ + if ((Channel == TIM_CHANNEL_1) || (Channel == TIM_CHANNEL_2)) + { + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Encoder Interface in interrupt mode. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); + + /* Set the TIM channel(s) state */ + if (Channel == TIM_CHANNEL_1) + { + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else if (Channel == TIM_CHANNEL_2) + { + if ((channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + + /* Enable the encoder interface channels */ + /* Enable the capture compare Interrupts 1 and/or 2 */ + switch (Channel) + { + case TIM_CHANNEL_1: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + default : + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + } + + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Encoder Interface in interrupt mode. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channels 1 and 2 + (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ + if (Channel == TIM_CHANNEL_1) + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + /* Disable the capture compare Interrupts 1 */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + } + else if (Channel == TIM_CHANNEL_2) + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + /* Disable the capture compare Interrupts 2 */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + } + else + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + /* Disable the capture compare Interrupts 1 and 2 */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel(s) state */ + if ((Channel == TIM_CHANNEL_1) || (Channel == TIM_CHANNEL_2)) + { + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Encoder Interface in DMA mode. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @param pData1 The destination Buffer address for IC1. + * @param pData2 The destination Buffer address for IC2. + * @param Length The length of data to be transferred from TIM peripheral to memory. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length) +{ + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); + + /* Set the TIM channel(s) state */ + if (Channel == TIM_CHANNEL_1) + { + if ((channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) + || (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY)) + { + return HAL_BUSY; + } + else if ((channel_1_state == HAL_TIM_CHANNEL_STATE_READY) + && (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_READY)) + { + if ((pData1 == NULL) || (Length == 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + } + else if (Channel == TIM_CHANNEL_2) + { + if ((channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY) + || (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY)) + { + return HAL_BUSY; + } + else if ((channel_2_state == HAL_TIM_CHANNEL_STATE_READY) + && (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_READY)) + { + if ((pData2 == NULL) || (Length == 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + } + else + { + if ((channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) + || (channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY) + || (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) + || (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY)) + { + return HAL_BUSY; + } + else if ((channel_1_state == HAL_TIM_CHANNEL_STATE_READY) + && (channel_2_state == HAL_TIM_CHANNEL_STATE_READY) + && (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_READY) + && (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_READY)) + { + if ((((pData1 == NULL) || (pData2 == NULL))) || (Length == 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Input Capture DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError; + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Input Capture DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + break; + } + + default: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + + /* Enable the TIM Input Capture DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + /* Enable the TIM Input Capture DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + break; + } + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Encoder Interface in DMA mode. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channels 1 and 2 + (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ + if (Channel == TIM_CHANNEL_1) + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + /* Disable the capture compare DMA Request 1 */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + } + else if (Channel == TIM_CHANNEL_2) + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + /* Disable the capture compare DMA Request 2 */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + } + else + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + /* Disable the capture compare DMA Request 1 and 2 */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel(s) state */ + if ((Channel == TIM_CHANNEL_1) || (Channel == TIM_CHANNEL_2)) + { + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ +/** @defgroup TIM_Exported_Functions_Group7 TIM IRQ handler management + * @brief TIM IRQ handler management + * +@verbatim + ============================================================================== + ##### IRQ handler management ##### + ============================================================================== + [..] + This section provides Timer IRQ handler function. + +@endverbatim + * @{ + */ +/** + * @brief This function handles TIM interrupts requests. + * @param htim TIM handle + * @retval None + */ +void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) +{ + uint32_t itsource = htim->Instance->DIER; + uint32_t itflag = htim->Instance->SR; + + /* Capture compare 1 event */ + if ((itflag & (TIM_FLAG_CC1)) == (TIM_FLAG_CC1)) + { + if ((itsource & (TIM_IT_CC1)) == (TIM_IT_CC1)) + { + { + __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_CC1); + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + + /* Input capture event */ + if ((htim->Instance->CCMR1 & TIM_CCMR1_CC1S) != 0x00U) + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureCallback(htim); +#else + HAL_TIM_IC_CaptureCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + /* Output compare event */ + else + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->OC_DelayElapsedCallback(htim); + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_OC_DelayElapsedCallback(htim); + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; + } + } + } + /* Capture compare 2 event */ + if ((itflag & (TIM_FLAG_CC2)) == (TIM_FLAG_CC2)) + { + if ((itsource & (TIM_IT_CC2)) == (TIM_IT_CC2)) + { + __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_CC2); + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + /* Input capture event */ + if ((htim->Instance->CCMR1 & TIM_CCMR1_CC2S) != 0x00U) + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureCallback(htim); +#else + HAL_TIM_IC_CaptureCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + /* Output compare event */ + else + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->OC_DelayElapsedCallback(htim); + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_OC_DelayElapsedCallback(htim); + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; + } + } + /* Capture compare 3 event */ + if ((itflag & (TIM_FLAG_CC3)) == (TIM_FLAG_CC3)) + { + if ((itsource & (TIM_IT_CC3)) == (TIM_IT_CC3)) + { + __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_CC3); + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + /* Input capture event */ + if ((htim->Instance->CCMR2 & TIM_CCMR2_CC3S) != 0x00U) + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureCallback(htim); +#else + HAL_TIM_IC_CaptureCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + /* Output compare event */ + else + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->OC_DelayElapsedCallback(htim); + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_OC_DelayElapsedCallback(htim); + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; + } + } + /* Capture compare 4 event */ + if ((itflag & (TIM_FLAG_CC4)) == (TIM_FLAG_CC4)) + { + if ((itsource & (TIM_IT_CC4)) == (TIM_IT_CC4)) + { + __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_CC4); + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + /* Input capture event */ + if ((htim->Instance->CCMR2 & TIM_CCMR2_CC4S) != 0x00U) + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureCallback(htim); +#else + HAL_TIM_IC_CaptureCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + /* Output compare event */ + else + { +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->OC_DelayElapsedCallback(htim); + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_OC_DelayElapsedCallback(htim); + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; + } + } + /* TIM Update event */ + if ((itflag & (TIM_FLAG_UPDATE)) == (TIM_FLAG_UPDATE)) + { + if ((itsource & (TIM_IT_UPDATE)) == (TIM_IT_UPDATE)) + { + __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_UPDATE); +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PeriodElapsedCallback(htim); +#else + HAL_TIM_PeriodElapsedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + } + /* TIM Break input event */ + if ((itflag & (TIM_FLAG_BREAK)) == (TIM_FLAG_BREAK)) + { + if ((itsource & (TIM_IT_BREAK)) == (TIM_IT_BREAK)) + { + __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_BREAK); +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->BreakCallback(htim); +#else + HAL_TIMEx_BreakCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + } + /* TIM Trigger detection event */ + if ((itflag & (TIM_FLAG_TRIGGER)) == (TIM_FLAG_TRIGGER)) + { + if ((itsource & (TIM_IT_TRIGGER)) == (TIM_IT_TRIGGER)) + { + __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_TRIGGER); +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->TriggerCallback(htim); +#else + HAL_TIM_TriggerCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + } + /* TIM commutation event */ + if ((itflag & (TIM_FLAG_COM)) == (TIM_FLAG_COM)) + { + if ((itsource & (TIM_IT_COM)) == (TIM_IT_COM)) + { + __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_COM); +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->CommutationCallback(htim); +#else + HAL_TIMEx_CommutCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + } +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions + * @brief TIM Peripheral Control functions + * +@verbatim + ============================================================================== + ##### Peripheral Control functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Configure The Input Output channels for OC, PWM, IC or One Pulse mode. + (+) Configure External Clock source. + (+) Configure Complementary channels, break features and dead time. + (+) Configure Master and the Slave synchronization. + (+) Configure the DMA Burst Mode. + +@endverbatim + * @{ + */ + +/** + * @brief Initializes the TIM Output Compare Channels according to the specified + * parameters in the TIM_OC_InitTypeDef. + * @param htim TIM Output Compare handle + * @param sConfig TIM Output Compare configuration structure + * @param Channel TIM Channels to configure + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, + const TIM_OC_InitTypeDef *sConfig, + uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CHANNELS(Channel)); + assert_param(IS_TIM_OC_MODE(sConfig->OCMode)); + assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity)); + + /* Process Locked */ + __HAL_LOCK(htim); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + /* Configure the TIM Channel 1 in Output Compare */ + TIM_OC1_SetConfig(htim->Instance, sConfig); + break; + } + + case TIM_CHANNEL_2: + { + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + /* Configure the TIM Channel 2 in Output Compare */ + TIM_OC2_SetConfig(htim->Instance, sConfig); + break; + } + + case TIM_CHANNEL_3: + { + /* Check the parameters */ + assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); + + /* Configure the TIM Channel 3 in Output Compare */ + TIM_OC3_SetConfig(htim->Instance, sConfig); + break; + } + + case TIM_CHANNEL_4: + { + /* Check the parameters */ + assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); + + /* Configure the TIM Channel 4 in Output Compare */ + TIM_OC4_SetConfig(htim->Instance, sConfig); + break; + } + + default: + status = HAL_ERROR; + break; + } + + __HAL_UNLOCK(htim); + + return status; +} + +/** + * @brief Initializes the TIM Input Capture Channels according to the specified + * parameters in the TIM_IC_InitTypeDef. + * @param htim TIM IC handle + * @param sConfig TIM Input Capture configuration structure + * @param Channel TIM Channel to configure + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, const TIM_IC_InitTypeDef *sConfig, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + assert_param(IS_TIM_IC_POLARITY(sConfig->ICPolarity)); + assert_param(IS_TIM_IC_SELECTION(sConfig->ICSelection)); + assert_param(IS_TIM_IC_PRESCALER(sConfig->ICPrescaler)); + assert_param(IS_TIM_IC_FILTER(sConfig->ICFilter)); + + /* Process Locked */ + __HAL_LOCK(htim); + + if (Channel == TIM_CHANNEL_1) + { + /* TI1 Configuration */ + TIM_TI1_SetConfig(htim->Instance, + sConfig->ICPolarity, + sConfig->ICSelection, + sConfig->ICFilter); + + /* Reset the IC1PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; + + /* Set the IC1PSC value */ + htim->Instance->CCMR1 |= sConfig->ICPrescaler; + } + else if (Channel == TIM_CHANNEL_2) + { + /* TI2 Configuration */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + TIM_TI2_SetConfig(htim->Instance, + sConfig->ICPolarity, + sConfig->ICSelection, + sConfig->ICFilter); + + /* Reset the IC2PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC; + + /* Set the IC2PSC value */ + htim->Instance->CCMR1 |= (sConfig->ICPrescaler << 8U); + } + else if (Channel == TIM_CHANNEL_3) + { + /* TI3 Configuration */ + assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); + + TIM_TI3_SetConfig(htim->Instance, + sConfig->ICPolarity, + sConfig->ICSelection, + sConfig->ICFilter); + + /* Reset the IC3PSC Bits */ + htim->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC; + + /* Set the IC3PSC value */ + htim->Instance->CCMR2 |= sConfig->ICPrescaler; + } + else if (Channel == TIM_CHANNEL_4) + { + /* TI4 Configuration */ + assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); + + TIM_TI4_SetConfig(htim->Instance, + sConfig->ICPolarity, + sConfig->ICSelection, + sConfig->ICFilter); + + /* Reset the IC4PSC Bits */ + htim->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC; + + /* Set the IC4PSC value */ + htim->Instance->CCMR2 |= (sConfig->ICPrescaler << 8U); + } + else + { + status = HAL_ERROR; + } + + __HAL_UNLOCK(htim); + + return status; +} + +/** + * @brief Initializes the TIM PWM channels according to the specified + * parameters in the TIM_OC_InitTypeDef. + * @param htim TIM PWM handle + * @param sConfig TIM PWM configuration structure + * @param Channel TIM Channels to be configured + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, + const TIM_OC_InitTypeDef *sConfig, + uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CHANNELS(Channel)); + assert_param(IS_TIM_PWM_MODE(sConfig->OCMode)); + assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity)); + assert_param(IS_TIM_FAST_STATE(sConfig->OCFastMode)); + + /* Process Locked */ + __HAL_LOCK(htim); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + /* Configure the Channel 1 in PWM mode */ + TIM_OC1_SetConfig(htim->Instance, sConfig); + + /* Set the Preload enable bit for channel1 */ + htim->Instance->CCMR1 |= TIM_CCMR1_OC1PE; + + /* Configure the Output Fast mode */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE; + htim->Instance->CCMR1 |= sConfig->OCFastMode; + break; + } + + case TIM_CHANNEL_2: + { + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + /* Configure the Channel 2 in PWM mode */ + TIM_OC2_SetConfig(htim->Instance, sConfig); + + /* Set the Preload enable bit for channel2 */ + htim->Instance->CCMR1 |= TIM_CCMR1_OC2PE; + + /* Configure the Output Fast mode */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE; + htim->Instance->CCMR1 |= sConfig->OCFastMode << 8U; + break; + } + + case TIM_CHANNEL_3: + { + /* Check the parameters */ + assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); + + /* Configure the Channel 3 in PWM mode */ + TIM_OC3_SetConfig(htim->Instance, sConfig); + + /* Set the Preload enable bit for channel3 */ + htim->Instance->CCMR2 |= TIM_CCMR2_OC3PE; + + /* Configure the Output Fast mode */ + htim->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE; + htim->Instance->CCMR2 |= sConfig->OCFastMode; + break; + } + + case TIM_CHANNEL_4: + { + /* Check the parameters */ + assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); + + /* Configure the Channel 4 in PWM mode */ + TIM_OC4_SetConfig(htim->Instance, sConfig); + + /* Set the Preload enable bit for channel4 */ + htim->Instance->CCMR2 |= TIM_CCMR2_OC4PE; + + /* Configure the Output Fast mode */ + htim->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE; + htim->Instance->CCMR2 |= sConfig->OCFastMode << 8U; + break; + } + + default: + status = HAL_ERROR; + break; + } + + __HAL_UNLOCK(htim); + + return status; +} + +/** + * @brief Initializes the TIM One Pulse Channels according to the specified + * parameters in the TIM_OnePulse_InitTypeDef. + * @param htim TIM One Pulse handle + * @param sConfig TIM One Pulse configuration structure + * @param OutputChannel TIM output channel to configure + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @param InputChannel TIM input Channel to configure + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @note To output a waveform with a minimum delay user can enable the fast + * mode by calling the @ref __HAL_TIM_ENABLE_OCxFAST macro. Then CCx + * output is forced in response to the edge detection on TIx input, + * without taking in account the comparison. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel) +{ + HAL_StatusTypeDef status = HAL_OK; + TIM_OC_InitTypeDef temp1; + + /* Check the parameters */ + assert_param(IS_TIM_OPM_CHANNELS(OutputChannel)); + assert_param(IS_TIM_OPM_CHANNELS(InputChannel)); + + if (OutputChannel != InputChannel) + { + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Extract the Output compare configuration from sConfig structure */ + temp1.OCMode = sConfig->OCMode; + temp1.Pulse = sConfig->Pulse; + temp1.OCPolarity = sConfig->OCPolarity; + temp1.OCNPolarity = sConfig->OCNPolarity; + temp1.OCIdleState = sConfig->OCIdleState; + temp1.OCNIdleState = sConfig->OCNIdleState; + + switch (OutputChannel) + { + case TIM_CHANNEL_1: + { + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + TIM_OC1_SetConfig(htim->Instance, &temp1); + break; + } + + case TIM_CHANNEL_2: + { + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + TIM_OC2_SetConfig(htim->Instance, &temp1); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + switch (InputChannel) + { + case TIM_CHANNEL_1: + { + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + TIM_TI1_SetConfig(htim->Instance, sConfig->ICPolarity, + sConfig->ICSelection, sConfig->ICFilter); + + /* Reset the IC1PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; + + /* Select the Trigger source */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= TIM_TS_TI1FP1; + + /* Select the Slave Mode */ + htim->Instance->SMCR &= ~TIM_SMCR_SMS; + htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER; + break; + } + + case TIM_CHANNEL_2: + { + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + TIM_TI2_SetConfig(htim->Instance, sConfig->ICPolarity, + sConfig->ICSelection, sConfig->ICFilter); + + /* Reset the IC2PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC; + + /* Select the Trigger source */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= TIM_TS_TI2FP2; + + /* Select the Slave Mode */ + htim->Instance->SMCR &= ~TIM_SMCR_SMS; + htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER; + break; + } + + default: + status = HAL_ERROR; + break; + } + } + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return status; + } + else + { + return HAL_ERROR; + } +} + +/** + * @brief Configure the DMA Burst to transfer Data from the memory to the TIM peripheral + * @param htim TIM handle + * @param BurstBaseAddress TIM Base address from where the DMA will start the Data write + * This parameter can be one of the following values: + * @arg TIM_DMABASE_CR1 + * @arg TIM_DMABASE_CR2 + * @arg TIM_DMABASE_SMCR + * @arg TIM_DMABASE_DIER + * @arg TIM_DMABASE_SR + * @arg TIM_DMABASE_EGR + * @arg TIM_DMABASE_CCMR1 + * @arg TIM_DMABASE_CCMR2 + * @arg TIM_DMABASE_CCER + * @arg TIM_DMABASE_CNT + * @arg TIM_DMABASE_PSC + * @arg TIM_DMABASE_ARR + * @arg TIM_DMABASE_RCR + * @arg TIM_DMABASE_CCR1 + * @arg TIM_DMABASE_CCR2 + * @arg TIM_DMABASE_CCR3 + * @arg TIM_DMABASE_CCR4 + * @arg TIM_DMABASE_BDTR + * @param BurstRequestSrc TIM DMA Request sources + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: TIM update Interrupt source + * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source + * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source + * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source + * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source + * @arg TIM_DMA_COM: TIM Commutation DMA source + * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source + * @param BurstBuffer The Buffer address. + * @param BurstLength DMA Burst length. This parameter can be one value + * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. + * @note This function should be used only when BurstLength is equal to DMA data transfer length. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, const uint32_t *BurstBuffer, + uint32_t BurstLength) +{ + HAL_StatusTypeDef status; + + status = HAL_TIM_DMABurst_MultiWriteStart(htim, BurstBaseAddress, BurstRequestSrc, BurstBuffer, BurstLength, + ((BurstLength) >> 8U) + 1U); + + + + return status; +} + +/** + * @brief Configure the DMA Burst to transfer multiple Data from the memory to the TIM peripheral + * @param htim TIM handle + * @param BurstBaseAddress TIM Base address from where the DMA will start the Data write + * This parameter can be one of the following values: + * @arg TIM_DMABASE_CR1 + * @arg TIM_DMABASE_CR2 + * @arg TIM_DMABASE_SMCR + * @arg TIM_DMABASE_DIER + * @arg TIM_DMABASE_SR + * @arg TIM_DMABASE_EGR + * @arg TIM_DMABASE_CCMR1 + * @arg TIM_DMABASE_CCMR2 + * @arg TIM_DMABASE_CCER + * @arg TIM_DMABASE_CNT + * @arg TIM_DMABASE_PSC + * @arg TIM_DMABASE_ARR + * @arg TIM_DMABASE_RCR + * @arg TIM_DMABASE_CCR1 + * @arg TIM_DMABASE_CCR2 + * @arg TIM_DMABASE_CCR3 + * @arg TIM_DMABASE_CCR4 + * @arg TIM_DMABASE_BDTR + * @param BurstRequestSrc TIM DMA Request sources + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: TIM update Interrupt source + * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source + * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source + * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source + * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source + * @arg TIM_DMA_COM: TIM Commutation DMA source + * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source + * @param BurstBuffer The Buffer address. + * @param BurstLength DMA Burst length. This parameter can be one value + * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. + * @param DataLength Data length. This parameter can be one value + * between 1 and 0xFFFF. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_MultiWriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, const uint32_t *BurstBuffer, + uint32_t BurstLength, uint32_t DataLength) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); + assert_param(IS_TIM_DMA_BASE(BurstBaseAddress)); + assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); + assert_param(IS_TIM_DMA_LENGTH(BurstLength)); + assert_param(IS_TIM_DMA_DATA_LENGTH(DataLength)); + + if (htim->DMABurstState == HAL_DMA_BURST_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->DMABurstState == HAL_DMA_BURST_STATE_READY) + { + if ((BurstBuffer == NULL) && (BurstLength > 0U)) + { + return HAL_ERROR; + } + else + { + htim->DMABurstState = HAL_DMA_BURST_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + + switch (BurstRequestSrc) + { + case TIM_DMA_UPDATE: + { + /* Set the DMA Period elapsed callbacks */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; + htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC4: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_COM: + { + /* Set the DMA commutation callbacks */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_TRIGGER: + { + /* Set the DMA trigger callbacks */ + htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt; + htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Configure the DMA Burst Mode */ + htim->Instance->DCR = (BurstBaseAddress | BurstLength); + /* Enable the TIM DMA Request */ + __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc); + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM DMA Burst mode + * @param htim TIM handle + * @param BurstRequestSrc TIM DMA Request sources to disable + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); + + /* Abort the DMA transfer (at least disable the DMA stream) */ + switch (BurstRequestSrc) + { + case TIM_DMA_UPDATE: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); + break; + } + case TIM_DMA_CC1: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + case TIM_DMA_CC2: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + case TIM_DMA_CC3: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + case TIM_DMA_CC4: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + case TIM_DMA_COM: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]); + break; + } + case TIM_DMA_TRIGGER: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]); + break; + } + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the TIM Update DMA request */ + __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc); + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + } + + /* Return function status */ + return status; +} + +/** + * @brief Configure the DMA Burst to transfer Data from the TIM peripheral to the memory + * @param htim TIM handle + * @param BurstBaseAddress TIM Base address from where the DMA will start the Data read + * This parameter can be one of the following values: + * @arg TIM_DMABASE_CR1 + * @arg TIM_DMABASE_CR2 + * @arg TIM_DMABASE_SMCR + * @arg TIM_DMABASE_DIER + * @arg TIM_DMABASE_SR + * @arg TIM_DMABASE_EGR + * @arg TIM_DMABASE_CCMR1 + * @arg TIM_DMABASE_CCMR2 + * @arg TIM_DMABASE_CCER + * @arg TIM_DMABASE_CNT + * @arg TIM_DMABASE_PSC + * @arg TIM_DMABASE_ARR + * @arg TIM_DMABASE_RCR + * @arg TIM_DMABASE_CCR1 + * @arg TIM_DMABASE_CCR2 + * @arg TIM_DMABASE_CCR3 + * @arg TIM_DMABASE_CCR4 + * @arg TIM_DMABASE_BDTR + * @param BurstRequestSrc TIM DMA Request sources + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: TIM update Interrupt source + * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source + * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source + * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source + * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source + * @arg TIM_DMA_COM: TIM Commutation DMA source + * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source + * @param BurstBuffer The Buffer address. + * @param BurstLength DMA Burst length. This parameter can be one value + * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. + * @note This function should be used only when BurstLength is equal to DMA data transfer length. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength) +{ + HAL_StatusTypeDef status; + + status = HAL_TIM_DMABurst_MultiReadStart(htim, BurstBaseAddress, BurstRequestSrc, BurstBuffer, BurstLength, + ((BurstLength) >> 8U) + 1U); + + + return status; +} + +/** + * @brief Configure the DMA Burst to transfer Data from the TIM peripheral to the memory + * @param htim TIM handle + * @param BurstBaseAddress TIM Base address from where the DMA will start the Data read + * This parameter can be one of the following values: + * @arg TIM_DMABASE_CR1 + * @arg TIM_DMABASE_CR2 + * @arg TIM_DMABASE_SMCR + * @arg TIM_DMABASE_DIER + * @arg TIM_DMABASE_SR + * @arg TIM_DMABASE_EGR + * @arg TIM_DMABASE_CCMR1 + * @arg TIM_DMABASE_CCMR2 + * @arg TIM_DMABASE_CCER + * @arg TIM_DMABASE_CNT + * @arg TIM_DMABASE_PSC + * @arg TIM_DMABASE_ARR + * @arg TIM_DMABASE_RCR + * @arg TIM_DMABASE_CCR1 + * @arg TIM_DMABASE_CCR2 + * @arg TIM_DMABASE_CCR3 + * @arg TIM_DMABASE_CCR4 + * @arg TIM_DMABASE_BDTR + * @param BurstRequestSrc TIM DMA Request sources + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: TIM update Interrupt source + * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source + * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source + * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source + * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source + * @arg TIM_DMA_COM: TIM Commutation DMA source + * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source + * @param BurstBuffer The Buffer address. + * @param BurstLength DMA Burst length. This parameter can be one value + * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. + * @param DataLength Data length. This parameter can be one value + * between 1 and 0xFFFF. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_MultiReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, + uint32_t BurstLength, uint32_t DataLength) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); + assert_param(IS_TIM_DMA_BASE(BurstBaseAddress)); + assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); + assert_param(IS_TIM_DMA_LENGTH(BurstLength)); + assert_param(IS_TIM_DMA_DATA_LENGTH(DataLength)); + + if (htim->DMABurstState == HAL_DMA_BURST_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->DMABurstState == HAL_DMA_BURST_STATE_READY) + { + if ((BurstBuffer == NULL) && (BurstLength > 0U)) + { + return HAL_ERROR; + } + else + { + htim->DMABurstState = HAL_DMA_BURST_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + switch (BurstRequestSrc) + { + case TIM_DMA_UPDATE: + { + /* Set the DMA Period elapsed callbacks */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; + htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, + DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC1: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, + DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC2: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, + DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC3: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, + DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC4: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, + DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_COM: + { + /* Set the DMA commutation callbacks */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, + DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_TRIGGER: + { + /* Set the DMA trigger callbacks */ + htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt; + htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, + DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Configure the DMA Burst Mode */ + htim->Instance->DCR = (BurstBaseAddress | BurstLength); + + /* Enable the TIM DMA Request */ + __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc); + } + + /* Return function status */ + return status; +} + +/** + * @brief Stop the DMA burst reading + * @param htim TIM handle + * @param BurstRequestSrc TIM DMA Request sources to disable. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); + + /* Abort the DMA transfer (at least disable the DMA stream) */ + switch (BurstRequestSrc) + { + case TIM_DMA_UPDATE: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); + break; + } + case TIM_DMA_CC1: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + case TIM_DMA_CC2: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + case TIM_DMA_CC3: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + case TIM_DMA_CC4: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + case TIM_DMA_COM: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]); + break; + } + case TIM_DMA_TRIGGER: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]); + break; + } + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the TIM Update DMA request */ + __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc); + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + } + + /* Return function status */ + return status; +} + +/** + * @brief Generate a software event + * @param htim TIM handle + * @param EventSource specifies the event source. + * This parameter can be one of the following values: + * @arg TIM_EVENTSOURCE_UPDATE: Timer update Event source + * @arg TIM_EVENTSOURCE_CC1: Timer Capture Compare 1 Event source + * @arg TIM_EVENTSOURCE_CC2: Timer Capture Compare 2 Event source + * @arg TIM_EVENTSOURCE_CC3: Timer Capture Compare 3 Event source + * @arg TIM_EVENTSOURCE_CC4: Timer Capture Compare 4 Event source + * @arg TIM_EVENTSOURCE_COM: Timer COM event source + * @arg TIM_EVENTSOURCE_TRIGGER: Timer Trigger Event source + * @arg TIM_EVENTSOURCE_BREAK: Timer Break event source + * @note Basic timers can only generate an update event. + * @note TIM_EVENTSOURCE_COM is relevant only with advanced timer instances. + * @note TIM_EVENTSOURCE_BREAK are relevant only for timer instances + * supporting a break input. + * @retval HAL status + */ + +HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_EVENT_SOURCE(EventSource)); + + /* Process Locked */ + __HAL_LOCK(htim); + + /* Change the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Set the event sources */ + htim->Instance->EGR = EventSource; + + /* Change the TIM state */ + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Configures the OCRef clear feature + * @param htim TIM handle + * @param sClearInputConfig pointer to a TIM_ClearInputConfigTypeDef structure that + * contains the OCREF clear feature and parameters for the TIM peripheral. + * @param Channel specifies the TIM Channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 + * @arg TIM_CHANNEL_2: TIM Channel 2 + * @arg TIM_CHANNEL_3: TIM Channel 3 + * @arg TIM_CHANNEL_4: TIM Channel 4 + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, + const TIM_ClearInputConfigTypeDef *sClearInputConfig, + uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_OCXREF_CLEAR_INSTANCE(htim->Instance)); + assert_param(IS_TIM_CLEARINPUT_SOURCE(sClearInputConfig->ClearInputSource)); + + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + switch (sClearInputConfig->ClearInputSource) + { + case TIM_CLEARINPUTSOURCE_NONE: + { + /* Clear the OCREF clear selection bit and the the ETR Bits */ + CLEAR_BIT(htim->Instance->SMCR, (TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP)); + break; + } + + case TIM_CLEARINPUTSOURCE_ETR: + { + /* Check the parameters */ + assert_param(IS_TIM_CLEARINPUT_POLARITY(sClearInputConfig->ClearInputPolarity)); + assert_param(IS_TIM_CLEARINPUT_PRESCALER(sClearInputConfig->ClearInputPrescaler)); + assert_param(IS_TIM_CLEARINPUT_FILTER(sClearInputConfig->ClearInputFilter)); + + /* When OCRef clear feature is used with ETR source, ETR prescaler must be off */ + if (sClearInputConfig->ClearInputPrescaler != TIM_CLEARINPUTPRESCALER_DIV1) + { + htim->State = HAL_TIM_STATE_READY; + __HAL_UNLOCK(htim); + return HAL_ERROR; + } + + TIM_ETR_SetConfig(htim->Instance, + sClearInputConfig->ClearInputPrescaler, + sClearInputConfig->ClearInputPolarity, + sClearInputConfig->ClearInputFilter); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + switch (Channel) + { + case TIM_CHANNEL_1: + { + if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) + { + /* Enable the OCREF clear feature for Channel 1 */ + SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE); + } + else + { + /* Disable the OCREF clear feature for Channel 1 */ + CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE); + } + break; + } + case TIM_CHANNEL_2: + { + if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) + { + /* Enable the OCREF clear feature for Channel 2 */ + SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE); + } + else + { + /* Disable the OCREF clear feature for Channel 2 */ + CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE); + } + break; + } + case TIM_CHANNEL_3: + { + if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) + { + /* Enable the OCREF clear feature for Channel 3 */ + SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE); + } + else + { + /* Disable the OCREF clear feature for Channel 3 */ + CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE); + } + break; + } + case TIM_CHANNEL_4: + { + if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) + { + /* Enable the OCREF clear feature for Channel 4 */ + SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE); + } + else + { + /* Disable the OCREF clear feature for Channel 4 */ + CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE); + } + break; + } + default: + break; + } + } + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return status; +} + +/** + * @brief Configures the clock source to be used + * @param htim TIM handle + * @param sClockSourceConfig pointer to a TIM_ClockConfigTypeDef structure that + * contains the clock source information for the TIM peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, const TIM_ClockConfigTypeDef *sClockSourceConfig) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Check the parameters */ + assert_param(IS_TIM_CLOCKSOURCE(sClockSourceConfig->ClockSource)); + + /* Reset the SMS, TS, ECE, ETPS and ETRF bits */ + tmpsmcr = htim->Instance->SMCR; + tmpsmcr &= ~(TIM_SMCR_SMS | TIM_SMCR_TS); + tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP); + htim->Instance->SMCR = tmpsmcr; + + switch (sClockSourceConfig->ClockSource) + { + case TIM_CLOCKSOURCE_INTERNAL: + { + assert_param(IS_TIM_INSTANCE(htim->Instance)); + break; + } + + case TIM_CLOCKSOURCE_ETRMODE1: + { + /* Check whether or not the timer instance supports external trigger input mode 1 (ETRF)*/ + assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance)); + + /* Check ETR input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler)); + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + /* Configure the ETR Clock source */ + TIM_ETR_SetConfig(htim->Instance, + sClockSourceConfig->ClockPrescaler, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + + /* Select the External clock mode1 and the ETRF trigger */ + tmpsmcr = htim->Instance->SMCR; + tmpsmcr |= (TIM_SLAVEMODE_EXTERNAL1 | TIM_CLOCKSOURCE_ETRMODE1); + /* Write to TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + break; + } + + case TIM_CLOCKSOURCE_ETRMODE2: + { + /* Check whether or not the timer instance supports external trigger input mode 2 (ETRF)*/ + assert_param(IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(htim->Instance)); + + /* Check ETR input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler)); + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + /* Configure the ETR Clock source */ + TIM_ETR_SetConfig(htim->Instance, + sClockSourceConfig->ClockPrescaler, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + /* Enable the External clock mode2 */ + htim->Instance->SMCR |= TIM_SMCR_ECE; + break; + } + + case TIM_CLOCKSOURCE_TI1: + { + /* Check whether or not the timer instance supports external clock mode 1 */ + assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); + + /* Check TI1 input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + TIM_TI1_ConfigInputStage(htim->Instance, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1); + break; + } + + case TIM_CLOCKSOURCE_TI2: + { + /* Check whether or not the timer instance supports external clock mode 1 (ETRF)*/ + assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); + + /* Check TI2 input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + TIM_TI2_ConfigInputStage(htim->Instance, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI2); + break; + } + + case TIM_CLOCKSOURCE_TI1ED: + { + /* Check whether or not the timer instance supports external clock mode 1 */ + assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); + + /* Check TI1 input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + TIM_TI1_ConfigInputStage(htim->Instance, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1ED); + break; + } + + case TIM_CLOCKSOURCE_ITR0: + case TIM_CLOCKSOURCE_ITR1: + case TIM_CLOCKSOURCE_ITR2: + case TIM_CLOCKSOURCE_ITR3: + { + /* Check whether or not the timer instance supports internal trigger input */ + assert_param(IS_TIM_CLOCKSOURCE_ITRX_INSTANCE(htim->Instance)); + + TIM_ITRx_SetConfig(htim->Instance, sClockSourceConfig->ClockSource); + break; + } + + default: + status = HAL_ERROR; + break; + } + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return status; +} + +/** + * @brief Selects the signal connected to the TI1 input: direct from CH1_input + * or a XOR combination between CH1_input, CH2_input & CH3_input + * @param htim TIM handle. + * @param TI1_Selection Indicate whether or not channel 1 is connected to the + * output of a XOR gate. + * This parameter can be one of the following values: + * @arg TIM_TI1SELECTION_CH1: The TIMx_CH1 pin is connected to TI1 input + * @arg TIM_TI1SELECTION_XORCOMBINATION: The TIMx_CH1, CH2 and CH3 + * pins are connected to the TI1 input (XOR combination) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection) +{ + uint32_t tmpcr2; + + /* Check the parameters */ + assert_param(IS_TIM_XOR_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TI1SELECTION(TI1_Selection)); + + /* Get the TIMx CR2 register value */ + tmpcr2 = htim->Instance->CR2; + + /* Reset the TI1 selection */ + tmpcr2 &= ~TIM_CR2_TI1S; + + /* Set the TI1 selection */ + tmpcr2 |= TI1_Selection; + + /* Write to TIMxCR2 */ + htim->Instance->CR2 = tmpcr2; + + return HAL_OK; +} + +/** + * @brief Configures the TIM in Slave mode + * @param htim TIM handle. + * @param sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that + * contains the selected trigger (internal trigger input, filtered + * timer input or external trigger input) and the Slave mode + * (Disable, Reset, Gated, Trigger, External clock mode 1). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, const TIM_SlaveConfigTypeDef *sSlaveConfig) +{ + /* Check the parameters */ + assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); + assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode)); + assert_param(IS_TIM_TRIGGER_SELECTION(sSlaveConfig->InputTrigger)); + + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + { + htim->State = HAL_TIM_STATE_READY; + __HAL_UNLOCK(htim); + return HAL_ERROR; + } + + /* Disable Trigger Interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_TRIGGER); + + /* Disable Trigger DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER); + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configures the TIM in Slave mode in interrupt mode + * @param htim TIM handle. + * @param sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that + * contains the selected trigger (internal trigger input, filtered + * timer input or external trigger input) and the Slave mode + * (Disable, Reset, Gated, Trigger, External clock mode 1). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, + const TIM_SlaveConfigTypeDef *sSlaveConfig) +{ + /* Check the parameters */ + assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); + assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode)); + assert_param(IS_TIM_TRIGGER_SELECTION(sSlaveConfig->InputTrigger)); + + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + { + htim->State = HAL_TIM_STATE_READY; + __HAL_UNLOCK(htim); + return HAL_ERROR; + } + + /* Enable Trigger Interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_TRIGGER); + + /* Disable Trigger DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER); + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Read the captured value from Capture Compare unit + * @param htim TIM handle. + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval Captured value + */ +uint32_t HAL_TIM_ReadCapturedValue(const TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpreg = 0U; + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + /* Return the capture 1 value */ + tmpreg = htim->Instance->CCR1; + + break; + } + case TIM_CHANNEL_2: + { + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + /* Return the capture 2 value */ + tmpreg = htim->Instance->CCR2; + + break; + } + + case TIM_CHANNEL_3: + { + /* Check the parameters */ + assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); + + /* Return the capture 3 value */ + tmpreg = htim->Instance->CCR3; + + break; + } + + case TIM_CHANNEL_4: + { + /* Check the parameters */ + assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); + + /* Return the capture 4 value */ + tmpreg = htim->Instance->CCR4; + + break; + } + + default: + break; + } + + return tmpreg; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions + * @brief TIM Callbacks functions + * +@verbatim + ============================================================================== + ##### TIM Callbacks functions ##### + ============================================================================== + [..] + This section provides TIM callback functions: + (+) TIM Period elapsed callback + (+) TIM Output Compare callback + (+) TIM Input capture callback + (+) TIM Trigger callback + (+) TIM Error callback + +@endverbatim + * @{ + */ + +/** + * @brief Period elapsed callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PeriodElapsedCallback could be implemented in the user file + */ +} + +/** + * @brief Period elapsed half complete callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PeriodElapsedHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Output Compare callback in non-blocking mode + * @param htim TIM OC handle + * @retval None + */ +__weak void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OC_DelayElapsedCallback could be implemented in the user file + */ +} + +/** + * @brief Input Capture callback in non-blocking mode + * @param htim TIM IC handle + * @retval None + */ +__weak void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_IC_CaptureCallback could be implemented in the user file + */ +} + +/** + * @brief Input Capture half complete callback in non-blocking mode + * @param htim TIM IC handle + * @retval None + */ +__weak void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_IC_CaptureHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief PWM Pulse finished callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PWM_PulseFinishedCallback could be implemented in the user file + */ +} + +/** + * @brief PWM Pulse finished half complete callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PWM_PulseFinishedHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Hall Trigger detection callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_TriggerCallback could be implemented in the user file + */ +} + +/** + * @brief Hall Trigger detection half complete callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_TriggerHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Timer error callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_ErrorCallback could be implemented in the user file + */ +} + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +/** + * @brief Register a User TIM callback to be used instead of the weak predefined callback + * @param htim tim handle + * @param CallbackID ID of the callback to be registered + * This parameter can be one of the following values: + * @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID + * @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID + * @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID + * @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID + * @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID + * @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID + * @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID + * @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID + * @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID + * @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID + * @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID + * @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID + * @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID + * @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID + * @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID + * @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID + * @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID + * @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID + * @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID + * @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID + * @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID + * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID + * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID + * @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID + * @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID + * @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID + * @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID + * @param pCallback pointer to the callback function + * @retval status + */ +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + return HAL_ERROR; + } + + if (htim->State == HAL_TIM_STATE_READY) + { + switch (CallbackID) + { + case HAL_TIM_BASE_MSPINIT_CB_ID : + htim->Base_MspInitCallback = pCallback; + break; + + case HAL_TIM_BASE_MSPDEINIT_CB_ID : + htim->Base_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_IC_MSPINIT_CB_ID : + htim->IC_MspInitCallback = pCallback; + break; + + case HAL_TIM_IC_MSPDEINIT_CB_ID : + htim->IC_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_OC_MSPINIT_CB_ID : + htim->OC_MspInitCallback = pCallback; + break; + + case HAL_TIM_OC_MSPDEINIT_CB_ID : + htim->OC_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_PWM_MSPINIT_CB_ID : + htim->PWM_MspInitCallback = pCallback; + break; + + case HAL_TIM_PWM_MSPDEINIT_CB_ID : + htim->PWM_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : + htim->OnePulse_MspInitCallback = pCallback; + break; + + case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : + htim->OnePulse_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_ENCODER_MSPINIT_CB_ID : + htim->Encoder_MspInitCallback = pCallback; + break; + + case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : + htim->Encoder_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : + htim->HallSensor_MspInitCallback = pCallback; + break; + + case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : + htim->HallSensor_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_PERIOD_ELAPSED_CB_ID : + htim->PeriodElapsedCallback = pCallback; + break; + + case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID : + htim->PeriodElapsedHalfCpltCallback = pCallback; + break; + + case HAL_TIM_TRIGGER_CB_ID : + htim->TriggerCallback = pCallback; + break; + + case HAL_TIM_TRIGGER_HALF_CB_ID : + htim->TriggerHalfCpltCallback = pCallback; + break; + + case HAL_TIM_IC_CAPTURE_CB_ID : + htim->IC_CaptureCallback = pCallback; + break; + + case HAL_TIM_IC_CAPTURE_HALF_CB_ID : + htim->IC_CaptureHalfCpltCallback = pCallback; + break; + + case HAL_TIM_OC_DELAY_ELAPSED_CB_ID : + htim->OC_DelayElapsedCallback = pCallback; + break; + + case HAL_TIM_PWM_PULSE_FINISHED_CB_ID : + htim->PWM_PulseFinishedCallback = pCallback; + break; + + case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID : + htim->PWM_PulseFinishedHalfCpltCallback = pCallback; + break; + + case HAL_TIM_ERROR_CB_ID : + htim->ErrorCallback = pCallback; + break; + + case HAL_TIM_COMMUTATION_CB_ID : + htim->CommutationCallback = pCallback; + break; + + case HAL_TIM_COMMUTATION_HALF_CB_ID : + htim->CommutationHalfCpltCallback = pCallback; + break; + + case HAL_TIM_BREAK_CB_ID : + htim->BreakCallback = pCallback; + break; + + default : + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (htim->State == HAL_TIM_STATE_RESET) + { + switch (CallbackID) + { + case HAL_TIM_BASE_MSPINIT_CB_ID : + htim->Base_MspInitCallback = pCallback; + break; + + case HAL_TIM_BASE_MSPDEINIT_CB_ID : + htim->Base_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_IC_MSPINIT_CB_ID : + htim->IC_MspInitCallback = pCallback; + break; + + case HAL_TIM_IC_MSPDEINIT_CB_ID : + htim->IC_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_OC_MSPINIT_CB_ID : + htim->OC_MspInitCallback = pCallback; + break; + + case HAL_TIM_OC_MSPDEINIT_CB_ID : + htim->OC_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_PWM_MSPINIT_CB_ID : + htim->PWM_MspInitCallback = pCallback; + break; + + case HAL_TIM_PWM_MSPDEINIT_CB_ID : + htim->PWM_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : + htim->OnePulse_MspInitCallback = pCallback; + break; + + case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : + htim->OnePulse_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_ENCODER_MSPINIT_CB_ID : + htim->Encoder_MspInitCallback = pCallback; + break; + + case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : + htim->Encoder_MspDeInitCallback = pCallback; + break; + + case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : + htim->HallSensor_MspInitCallback = pCallback; + break; + + case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : + htim->HallSensor_MspDeInitCallback = pCallback; + break; + + default : + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Return error status */ + status = HAL_ERROR; + } + + return status; +} + +/** + * @brief Unregister a TIM callback + * TIM callback is redirected to the weak predefined callback + * @param htim tim handle + * @param CallbackID ID of the callback to be unregistered + * This parameter can be one of the following values: + * @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID + * @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID + * @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID + * @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID + * @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID + * @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID + * @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID + * @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID + * @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID + * @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID + * @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID + * @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID + * @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID + * @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID + * @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID + * @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID + * @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID + * @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID + * @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID + * @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID + * @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID + * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID + * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID + * @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID + * @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID + * @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID + * @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID + * @retval status + */ +HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (htim->State == HAL_TIM_STATE_READY) + { + switch (CallbackID) + { + case HAL_TIM_BASE_MSPINIT_CB_ID : + /* Legacy weak Base MspInit Callback */ + htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; + break; + + case HAL_TIM_BASE_MSPDEINIT_CB_ID : + /* Legacy weak Base Msp DeInit Callback */ + htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; + break; + + case HAL_TIM_IC_MSPINIT_CB_ID : + /* Legacy weak IC Msp Init Callback */ + htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; + break; + + case HAL_TIM_IC_MSPDEINIT_CB_ID : + /* Legacy weak IC Msp DeInit Callback */ + htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; + break; + + case HAL_TIM_OC_MSPINIT_CB_ID : + /* Legacy weak OC Msp Init Callback */ + htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; + break; + + case HAL_TIM_OC_MSPDEINIT_CB_ID : + /* Legacy weak OC Msp DeInit Callback */ + htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; + break; + + case HAL_TIM_PWM_MSPINIT_CB_ID : + /* Legacy weak PWM Msp Init Callback */ + htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; + break; + + case HAL_TIM_PWM_MSPDEINIT_CB_ID : + /* Legacy weak PWM Msp DeInit Callback */ + htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; + break; + + case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : + /* Legacy weak One Pulse Msp Init Callback */ + htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; + break; + + case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : + /* Legacy weak One Pulse Msp DeInit Callback */ + htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; + break; + + case HAL_TIM_ENCODER_MSPINIT_CB_ID : + /* Legacy weak Encoder Msp Init Callback */ + htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; + break; + + case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : + /* Legacy weak Encoder Msp DeInit Callback */ + htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; + break; + + case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : + /* Legacy weak Hall Sensor Msp Init Callback */ + htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; + break; + + case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : + /* Legacy weak Hall Sensor Msp DeInit Callback */ + htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; + break; + + case HAL_TIM_PERIOD_ELAPSED_CB_ID : + /* Legacy weak Period Elapsed Callback */ + htim->PeriodElapsedCallback = HAL_TIM_PeriodElapsedCallback; + break; + + case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID : + /* Legacy weak Period Elapsed half complete Callback */ + htim->PeriodElapsedHalfCpltCallback = HAL_TIM_PeriodElapsedHalfCpltCallback; + break; + + case HAL_TIM_TRIGGER_CB_ID : + /* Legacy weak Trigger Callback */ + htim->TriggerCallback = HAL_TIM_TriggerCallback; + break; + + case HAL_TIM_TRIGGER_HALF_CB_ID : + /* Legacy weak Trigger half complete Callback */ + htim->TriggerHalfCpltCallback = HAL_TIM_TriggerHalfCpltCallback; + break; + + case HAL_TIM_IC_CAPTURE_CB_ID : + /* Legacy weak IC Capture Callback */ + htim->IC_CaptureCallback = HAL_TIM_IC_CaptureCallback; + break; + + case HAL_TIM_IC_CAPTURE_HALF_CB_ID : + /* Legacy weak IC Capture half complete Callback */ + htim->IC_CaptureHalfCpltCallback = HAL_TIM_IC_CaptureHalfCpltCallback; + break; + + case HAL_TIM_OC_DELAY_ELAPSED_CB_ID : + /* Legacy weak OC Delay Elapsed Callback */ + htim->OC_DelayElapsedCallback = HAL_TIM_OC_DelayElapsedCallback; + break; + + case HAL_TIM_PWM_PULSE_FINISHED_CB_ID : + /* Legacy weak PWM Pulse Finished Callback */ + htim->PWM_PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback; + break; + + case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID : + /* Legacy weak PWM Pulse Finished half complete Callback */ + htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback; + break; + + case HAL_TIM_ERROR_CB_ID : + /* Legacy weak Error Callback */ + htim->ErrorCallback = HAL_TIM_ErrorCallback; + break; + + case HAL_TIM_COMMUTATION_CB_ID : + /* Legacy weak Commutation Callback */ + htim->CommutationCallback = HAL_TIMEx_CommutCallback; + break; + + case HAL_TIM_COMMUTATION_HALF_CB_ID : + /* Legacy weak Commutation half complete Callback */ + htim->CommutationHalfCpltCallback = HAL_TIMEx_CommutHalfCpltCallback; + break; + + case HAL_TIM_BREAK_CB_ID : + /* Legacy weak Break Callback */ + htim->BreakCallback = HAL_TIMEx_BreakCallback; + break; + + default : + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (htim->State == HAL_TIM_STATE_RESET) + { + switch (CallbackID) + { + case HAL_TIM_BASE_MSPINIT_CB_ID : + /* Legacy weak Base MspInit Callback */ + htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; + break; + + case HAL_TIM_BASE_MSPDEINIT_CB_ID : + /* Legacy weak Base Msp DeInit Callback */ + htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; + break; + + case HAL_TIM_IC_MSPINIT_CB_ID : + /* Legacy weak IC Msp Init Callback */ + htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; + break; + + case HAL_TIM_IC_MSPDEINIT_CB_ID : + /* Legacy weak IC Msp DeInit Callback */ + htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; + break; + + case HAL_TIM_OC_MSPINIT_CB_ID : + /* Legacy weak OC Msp Init Callback */ + htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; + break; + + case HAL_TIM_OC_MSPDEINIT_CB_ID : + /* Legacy weak OC Msp DeInit Callback */ + htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; + break; + + case HAL_TIM_PWM_MSPINIT_CB_ID : + /* Legacy weak PWM Msp Init Callback */ + htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; + break; + + case HAL_TIM_PWM_MSPDEINIT_CB_ID : + /* Legacy weak PWM Msp DeInit Callback */ + htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; + break; + + case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : + /* Legacy weak One Pulse Msp Init Callback */ + htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; + break; + + case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : + /* Legacy weak One Pulse Msp DeInit Callback */ + htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; + break; + + case HAL_TIM_ENCODER_MSPINIT_CB_ID : + /* Legacy weak Encoder Msp Init Callback */ + htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; + break; + + case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : + /* Legacy weak Encoder Msp DeInit Callback */ + htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; + break; + + case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : + /* Legacy weak Hall Sensor Msp Init Callback */ + htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; + break; + + case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : + /* Legacy weak Hall Sensor Msp DeInit Callback */ + htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; + break; + + default : + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Return error status */ + status = HAL_ERROR; + } + + return status; +} +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions + * @brief TIM Peripheral State functions + * +@verbatim + ============================================================================== + ##### Peripheral State functions ##### + ============================================================================== + [..] + This subsection permits to get in run-time the status of the peripheral + and the data flow. + +@endverbatim + * @{ + */ + +/** + * @brief Return the TIM Base handle state. + * @param htim TIM Base handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(const TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return the TIM OC handle state. + * @param htim TIM Output Compare handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(const TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return the TIM PWM handle state. + * @param htim TIM handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(const TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return the TIM Input Capture handle state. + * @param htim TIM IC handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(const TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return the TIM One Pulse Mode handle state. + * @param htim TIM OPM handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(const TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return the TIM Encoder Mode handle state. + * @param htim TIM Encoder Interface handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(const TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return the TIM Encoder Mode handle state. + * @param htim TIM handle + * @retval Active channel + */ +HAL_TIM_ActiveChannel HAL_TIM_GetActiveChannel(const TIM_HandleTypeDef *htim) +{ + return htim->Channel; +} + +/** + * @brief Return actual state of the TIM channel. + * @param htim TIM handle + * @param Channel TIM Channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 + * @arg TIM_CHANNEL_2: TIM Channel 2 + * @arg TIM_CHANNEL_3: TIM Channel 3 + * @arg TIM_CHANNEL_4: TIM Channel 4 + * @arg TIM_CHANNEL_5: TIM Channel 5 + * @arg TIM_CHANNEL_6: TIM Channel 6 + * @retval TIM Channel state + */ +HAL_TIM_ChannelStateTypeDef HAL_TIM_GetChannelState(const TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_TIM_ChannelStateTypeDef channel_state; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); + + return channel_state; +} + +/** + * @brief Return actual state of a DMA burst operation. + * @param htim TIM handle + * @retval DMA burst state + */ +HAL_TIM_DMABurstStateTypeDef HAL_TIM_DMABurstState(const TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); + + return htim->DMABurstState; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_Functions TIM Private Functions + * @{ + */ + +/** + * @brief TIM DMA error callback + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIM_DMAError(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); + } + else + { + htim->State = HAL_TIM_STATE_READY; + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->ErrorCallback(htim); +#else + HAL_TIM_ErrorCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Delay Pulse complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); + } + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Delay Pulse half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PWM_PulseFinishedHalfCpltCallback(htim); +#else + HAL_TIM_PWM_PulseFinishedHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Capture complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); + } + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureCallback(htim); +#else + HAL_TIM_IC_CaptureCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Capture half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureHalfCpltCallback(htim); +#else + HAL_TIM_IC_CaptureHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Period Elapse complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (htim->hdma[TIM_DMA_ID_UPDATE]->Init.Mode == DMA_NORMAL) + { + htim->State = HAL_TIM_STATE_READY; + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PeriodElapsedCallback(htim); +#else + HAL_TIM_PeriodElapsedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Period Elapse half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PeriodElapsedHalfCpltCallback(htim); +#else + HAL_TIM_PeriodElapsedHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Trigger callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (htim->hdma[TIM_DMA_ID_TRIGGER]->Init.Mode == DMA_NORMAL) + { + htim->State = HAL_TIM_STATE_READY; + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->TriggerCallback(htim); +#else + HAL_TIM_TriggerCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Trigger half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->TriggerHalfCpltCallback(htim); +#else + HAL_TIM_TriggerHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief Time Base configuration + * @param TIMx TIM peripheral + * @param Structure TIM Base configuration structure + * @retval None + */ +void TIM_Base_SetConfig(TIM_TypeDef *TIMx, const TIM_Base_InitTypeDef *Structure) +{ + uint32_t tmpcr1; + tmpcr1 = TIMx->CR1; + + /* Set TIM Time Base Unit parameters ---------------------------------------*/ + if (IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx)) + { + /* Select the Counter Mode */ + tmpcr1 &= ~(TIM_CR1_DIR | TIM_CR1_CMS); + tmpcr1 |= Structure->CounterMode; + } + + if (IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx)) + { + /* Set the clock division */ + tmpcr1 &= ~TIM_CR1_CKD; + tmpcr1 |= (uint32_t)Structure->ClockDivision; + } + + /* Set the auto-reload preload */ + MODIFY_REG(tmpcr1, TIM_CR1_ARPE, Structure->AutoReloadPreload); + + /* Set the Autoreload value */ + TIMx->ARR = (uint32_t)Structure->Period ; + + /* Set the Prescaler value */ + TIMx->PSC = Structure->Prescaler; + + if (IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx)) + { + /* Set the Repetition Counter value */ + TIMx->RCR = Structure->RepetitionCounter; + } + + /* Disable Update Event (UEV) with Update Generation (UG) + by changing Update Request Source (URS) to avoid Update flag (UIF) */ + SET_BIT(TIMx->CR1, TIM_CR1_URS); + + /* Generate an update event to reload the Prescaler + and the repetition counter (only for advanced timer) value immediately */ + TIMx->EGR = TIM_EGR_UG; + + TIMx->CR1 = tmpcr1; +} + +/** + * @brief Timer Output Compare 1 configuration + * @param TIMx to select the TIM peripheral + * @param OC_Config The output configuration structure + * @retval None + */ +static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config) +{ + uint32_t tmpccmrx; + uint32_t tmpccer; + uint32_t tmpcr2; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + + /* Disable the Channel 1: Reset the CC1E Bit */ + TIMx->CCER &= ~TIM_CCER_CC1E; + + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR1 register value */ + tmpccmrx = TIMx->CCMR1; + + /* Reset the Output Compare Mode Bits */ + tmpccmrx &= ~TIM_CCMR1_OC1M; + tmpccmrx &= ~TIM_CCMR1_CC1S; + /* Select the Output Compare Mode */ + tmpccmrx |= OC_Config->OCMode; + + /* Reset the Output Polarity level */ + tmpccer &= ~TIM_CCER_CC1P; + /* Set the Output Compare Polarity */ + tmpccer |= OC_Config->OCPolarity; + + if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_1)) + { + /* Check parameters */ + assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); + + /* Reset the Output N Polarity level */ + tmpccer &= ~TIM_CCER_CC1NP; + /* Set the Output N Polarity */ + tmpccer |= OC_Config->OCNPolarity; + /* Reset the Output N State */ + tmpccer &= ~TIM_CCER_CC1NE; + } + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + /* Check parameters */ + assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); + assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); + + /* Reset the Output Compare and Output Compare N IDLE State */ + tmpcr2 &= ~TIM_CR2_OIS1; + tmpcr2 &= ~TIM_CR2_OIS1N; + /* Set the Output Idle state */ + tmpcr2 |= OC_Config->OCIdleState; + /* Set the Output N Idle state */ + tmpcr2 |= OC_Config->OCNIdleState; + } + + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR1 = OC_Config->Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Timer Output Compare 2 configuration + * @param TIMx to select the TIM peripheral + * @param OC_Config The output configuration structure + * @retval None + */ +void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config) +{ + uint32_t tmpccmrx; + uint32_t tmpccer; + uint32_t tmpcr2; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + + /* Disable the Channel 2: Reset the CC2E Bit */ + TIMx->CCER &= ~TIM_CCER_CC2E; + + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR1 register value */ + tmpccmrx = TIMx->CCMR1; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmrx &= ~TIM_CCMR1_OC2M; + tmpccmrx &= ~TIM_CCMR1_CC2S; + + /* Select the Output Compare Mode */ + tmpccmrx |= (OC_Config->OCMode << 8U); + + /* Reset the Output Polarity level */ + tmpccer &= ~TIM_CCER_CC2P; + /* Set the Output Compare Polarity */ + tmpccer |= (OC_Config->OCPolarity << 4U); + + if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_2)) + { + assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); + + /* Reset the Output N Polarity level */ + tmpccer &= ~TIM_CCER_CC2NP; + /* Set the Output N Polarity */ + tmpccer |= (OC_Config->OCNPolarity << 4U); + /* Reset the Output N State */ + tmpccer &= ~TIM_CCER_CC2NE; + } + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + /* Check parameters */ + assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); + assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); + + /* Reset the Output Compare and Output Compare N IDLE State */ + tmpcr2 &= ~TIM_CR2_OIS2; + tmpcr2 &= ~TIM_CR2_OIS2N; + /* Set the Output Idle state */ + tmpcr2 |= (OC_Config->OCIdleState << 2U); + /* Set the Output N Idle state */ + tmpcr2 |= (OC_Config->OCNIdleState << 2U); + } + + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR1 */ + TIMx->CCMR1 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR2 = OC_Config->Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Timer Output Compare 3 configuration + * @param TIMx to select the TIM peripheral + * @param OC_Config The output configuration structure + * @retval None + */ +static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config) +{ + uint32_t tmpccmrx; + uint32_t tmpccer; + uint32_t tmpcr2; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + + /* Disable the Channel 3: Reset the CC2E Bit */ + TIMx->CCER &= ~TIM_CCER_CC3E; + + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR2 register value */ + tmpccmrx = TIMx->CCMR2; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmrx &= ~TIM_CCMR2_OC3M; + tmpccmrx &= ~TIM_CCMR2_CC3S; + /* Select the Output Compare Mode */ + tmpccmrx |= OC_Config->OCMode; + + /* Reset the Output Polarity level */ + tmpccer &= ~TIM_CCER_CC3P; + /* Set the Output Compare Polarity */ + tmpccer |= (OC_Config->OCPolarity << 8U); + + if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_3)) + { + assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); + + /* Reset the Output N Polarity level */ + tmpccer &= ~TIM_CCER_CC3NP; + /* Set the Output N Polarity */ + tmpccer |= (OC_Config->OCNPolarity << 8U); + /* Reset the Output N State */ + tmpccer &= ~TIM_CCER_CC3NE; + } + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + /* Check parameters */ + assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); + assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); + + /* Reset the Output Compare and Output Compare N IDLE State */ + tmpcr2 &= ~TIM_CR2_OIS3; + tmpcr2 &= ~TIM_CR2_OIS3N; + /* Set the Output Idle state */ + tmpcr2 |= (OC_Config->OCIdleState << 4U); + /* Set the Output N Idle state */ + tmpcr2 |= (OC_Config->OCNIdleState << 4U); + } + + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR2 */ + TIMx->CCMR2 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR3 = OC_Config->Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Timer Output Compare 4 configuration + * @param TIMx to select the TIM peripheral + * @param OC_Config The output configuration structure + * @retval None + */ +static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config) +{ + uint32_t tmpccmrx; + uint32_t tmpccer; + uint32_t tmpcr2; + + /* Get the TIMx CCER register value */ + tmpccer = TIMx->CCER; + + /* Disable the Channel 4: Reset the CC4E Bit */ + TIMx->CCER &= ~TIM_CCER_CC4E; + + /* Get the TIMx CR2 register value */ + tmpcr2 = TIMx->CR2; + + /* Get the TIMx CCMR2 register value */ + tmpccmrx = TIMx->CCMR2; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmrx &= ~TIM_CCMR2_OC4M; + tmpccmrx &= ~TIM_CCMR2_CC4S; + + /* Select the Output Compare Mode */ + tmpccmrx |= (OC_Config->OCMode << 8U); + + /* Reset the Output Polarity level */ + tmpccer &= ~TIM_CCER_CC4P; + /* Set the Output Compare Polarity */ + tmpccer |= (OC_Config->OCPolarity << 12U); + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + /* Check parameters */ + assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); + + /* Reset the Output Compare IDLE State */ + tmpcr2 &= ~TIM_CR2_OIS4; + + /* Set the Output Idle state */ + tmpcr2 |= (OC_Config->OCIdleState << 6U); + } + + /* Write to TIMx CR2 */ + TIMx->CR2 = tmpcr2; + + /* Write to TIMx CCMR2 */ + TIMx->CCMR2 = tmpccmrx; + + /* Set the Capture Compare Register value */ + TIMx->CCR4 = OC_Config->Pulse; + + /* Write to TIMx CCER */ + TIMx->CCER = tmpccer; +} + +/** + * @brief Slave Timer configuration function + * @param htim TIM handle + * @param sSlaveConfig Slave timer configuration + * @retval None + */ +static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, + const TIM_SlaveConfigTypeDef *sSlaveConfig) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Get the TIMx SMCR register value */ + tmpsmcr = htim->Instance->SMCR; + + /* Reset the Trigger Selection Bits */ + tmpsmcr &= ~TIM_SMCR_TS; + /* Set the Input Trigger source */ + tmpsmcr |= sSlaveConfig->InputTrigger; + + /* Reset the slave mode Bits */ + tmpsmcr &= ~TIM_SMCR_SMS; + /* Set the slave mode */ + tmpsmcr |= sSlaveConfig->SlaveMode; + + /* Write to TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + + /* Configure the trigger prescaler, filter, and polarity */ + switch (sSlaveConfig->InputTrigger) + { + case TIM_TS_ETRF: + { + /* Check the parameters */ + assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRIGGERPRESCALER(sSlaveConfig->TriggerPrescaler)); + assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); + assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); + /* Configure the ETR Trigger source */ + TIM_ETR_SetConfig(htim->Instance, + sSlaveConfig->TriggerPrescaler, + sSlaveConfig->TriggerPolarity, + sSlaveConfig->TriggerFilter); + break; + } + + case TIM_TS_TI1F_ED: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); + + if (sSlaveConfig->SlaveMode == TIM_SLAVEMODE_GATED) + { + return HAL_ERROR; + } + + /* Disable the Channel 1: Reset the CC1E Bit */ + tmpccer = htim->Instance->CCER; + htim->Instance->CCER &= ~TIM_CCER_CC1E; + tmpccmr1 = htim->Instance->CCMR1; + + /* Set the filter */ + tmpccmr1 &= ~TIM_CCMR1_IC1F; + tmpccmr1 |= ((sSlaveConfig->TriggerFilter) << 4U); + + /* Write to TIMx CCMR1 and CCER registers */ + htim->Instance->CCMR1 = tmpccmr1; + htim->Instance->CCER = tmpccer; + break; + } + + case TIM_TS_TI1FP1: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); + assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); + + /* Configure TI1 Filter and Polarity */ + TIM_TI1_ConfigInputStage(htim->Instance, + sSlaveConfig->TriggerPolarity, + sSlaveConfig->TriggerFilter); + break; + } + + case TIM_TS_TI2FP2: + { + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); + assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); + + /* Configure TI2 Filter and Polarity */ + TIM_TI2_ConfigInputStage(htim->Instance, + sSlaveConfig->TriggerPolarity, + sSlaveConfig->TriggerFilter); + break; + } + + case TIM_TS_ITR0: + case TIM_TS_ITR1: + case TIM_TS_ITR2: + case TIM_TS_ITR3: + { + /* Check the parameter */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + break; + } + + default: + status = HAL_ERROR; + break; + } + + return status; +} + +/** + * @brief Configure the TI1 as Input. + * @param TIMx to select the TIM peripheral. + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 1 is selected to be connected to IC1. + * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 1 is selected to be connected to IC2. + * @arg TIM_ICSELECTION_TRC: TIM Input 1 is selected to be connected to TRC. + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI2FP1 + * (on channel2 path) is used as the input signal. Therefore CCMR1 must be + * protected against un-initialized filter and polarity values. + */ +void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Disable the Channel 1: Reset the CC1E Bit */ + tmpccer = TIMx->CCER; + TIMx->CCER &= ~TIM_CCER_CC1E; + tmpccmr1 = TIMx->CCMR1; + + /* Select the Input */ + if (IS_TIM_CC2_INSTANCE(TIMx) != RESET) + { + tmpccmr1 &= ~TIM_CCMR1_CC1S; + tmpccmr1 |= TIM_ICSelection; + } + else + { + tmpccmr1 |= TIM_CCMR1_CC1S_0; + } + + /* Set the filter */ + tmpccmr1 &= ~TIM_CCMR1_IC1F; + tmpccmr1 |= ((TIM_ICFilter << 4U) & TIM_CCMR1_IC1F); + + /* Select the Polarity and set the CC1E Bit */ + tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP); + tmpccer |= (TIM_ICPolarity & (TIM_CCER_CC1P | TIM_CCER_CC1NP)); + + /* Write to TIMx CCMR1 and CCER registers */ + TIMx->CCMR1 = tmpccmr1; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the Polarity and Filter for TI1. + * @param TIMx to select the TIM peripheral. + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Disable the Channel 1: Reset the CC1E Bit */ + tmpccer = TIMx->CCER; + TIMx->CCER &= ~TIM_CCER_CC1E; + tmpccmr1 = TIMx->CCMR1; + + /* Set the filter */ + tmpccmr1 &= ~TIM_CCMR1_IC1F; + tmpccmr1 |= (TIM_ICFilter << 4U); + + /* Select the Polarity and set the CC1E Bit */ + tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP); + tmpccer |= TIM_ICPolarity; + + /* Write to TIMx CCMR1 and CCER registers */ + TIMx->CCMR1 = tmpccmr1; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the TI2 as Input. + * @param TIMx to select the TIM peripheral + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 2 is selected to be connected to IC2. + * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 2 is selected to be connected to IC1. + * @arg TIM_ICSELECTION_TRC: TIM Input 2 is selected to be connected to TRC. + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI1FP2 + * (on channel1 path) is used as the input signal. Therefore CCMR1 must be + * protected against un-initialized filter and polarity values. + */ +static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Disable the Channel 2: Reset the CC2E Bit */ + tmpccer = TIMx->CCER; + TIMx->CCER &= ~TIM_CCER_CC2E; + tmpccmr1 = TIMx->CCMR1; + + /* Select the Input */ + tmpccmr1 &= ~TIM_CCMR1_CC2S; + tmpccmr1 |= (TIM_ICSelection << 8U); + + /* Set the filter */ + tmpccmr1 &= ~TIM_CCMR1_IC2F; + tmpccmr1 |= ((TIM_ICFilter << 12U) & TIM_CCMR1_IC2F); + + /* Select the Polarity and set the CC2E Bit */ + tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP); + tmpccer |= ((TIM_ICPolarity << 4U) & (TIM_CCER_CC2P | TIM_CCER_CC2NP)); + + /* Write to TIMx CCMR1 and CCER registers */ + TIMx->CCMR1 = tmpccmr1 ; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the Polarity and Filter for TI2. + * @param TIMx to select the TIM peripheral. + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Disable the Channel 2: Reset the CC2E Bit */ + tmpccer = TIMx->CCER; + TIMx->CCER &= ~TIM_CCER_CC2E; + tmpccmr1 = TIMx->CCMR1; + + /* Set the filter */ + tmpccmr1 &= ~TIM_CCMR1_IC2F; + tmpccmr1 |= (TIM_ICFilter << 12U); + + /* Select the Polarity and set the CC2E Bit */ + tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP); + tmpccer |= (TIM_ICPolarity << 4U); + + /* Write to TIMx CCMR1 and CCER registers */ + TIMx->CCMR1 = tmpccmr1 ; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the TI3 as Input. + * @param TIMx to select the TIM peripheral + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 3 is selected to be connected to IC3. + * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 3 is selected to be connected to IC4. + * @arg TIM_ICSELECTION_TRC: TIM Input 3 is selected to be connected to TRC. + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI3FP4 + * (on channel1 path) is used as the input signal. Therefore CCMR2 must be + * protected against un-initialized filter and polarity values. + */ +static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr2; + uint32_t tmpccer; + + /* Disable the Channel 3: Reset the CC3E Bit */ + tmpccer = TIMx->CCER; + TIMx->CCER &= ~TIM_CCER_CC3E; + tmpccmr2 = TIMx->CCMR2; + + /* Select the Input */ + tmpccmr2 &= ~TIM_CCMR2_CC3S; + tmpccmr2 |= TIM_ICSelection; + + /* Set the filter */ + tmpccmr2 &= ~TIM_CCMR2_IC3F; + tmpccmr2 |= ((TIM_ICFilter << 4U) & TIM_CCMR2_IC3F); + + /* Select the Polarity and set the CC3E Bit */ + tmpccer &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP); + tmpccer |= ((TIM_ICPolarity << 8U) & (TIM_CCER_CC3P | TIM_CCER_CC3NP)); + + /* Write to TIMx CCMR2 and CCER registers */ + TIMx->CCMR2 = tmpccmr2; + TIMx->CCER = tmpccer; +} + +/** + * @brief Configure the TI4 as Input. + * @param TIMx to select the TIM peripheral + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 4 is selected to be connected to IC4. + * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 4 is selected to be connected to IC3. + * @arg TIM_ICSELECTION_TRC: TIM Input 4 is selected to be connected to TRC. + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI4FP3 + * (on channel1 path) is used as the input signal. Therefore CCMR2 must be + * protected against un-initialized filter and polarity values. + * @retval None + */ +static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr2; + uint32_t tmpccer; + + /* Disable the Channel 4: Reset the CC4E Bit */ + tmpccer = TIMx->CCER; + TIMx->CCER &= ~TIM_CCER_CC4E; + tmpccmr2 = TIMx->CCMR2; + + /* Select the Input */ + tmpccmr2 &= ~TIM_CCMR2_CC4S; + tmpccmr2 |= (TIM_ICSelection << 8U); + + /* Set the filter */ + tmpccmr2 &= ~TIM_CCMR2_IC4F; + tmpccmr2 |= ((TIM_ICFilter << 12U) & TIM_CCMR2_IC4F); + + /* Select the Polarity and set the CC4E Bit */ + tmpccer &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP); + tmpccer |= ((TIM_ICPolarity << 12U) & (TIM_CCER_CC4P | TIM_CCER_CC4NP)); + + /* Write to TIMx CCMR2 and CCER registers */ + TIMx->CCMR2 = tmpccmr2; + TIMx->CCER = tmpccer ; +} + +/** + * @brief Selects the Input Trigger source + * @param TIMx to select the TIM peripheral + * @param InputTriggerSource The Input Trigger source. + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal Trigger 0 + * @arg TIM_TS_ITR1: Internal Trigger 1 + * @arg TIM_TS_ITR2: Internal Trigger 2 + * @arg TIM_TS_ITR3: Internal Trigger 3 + * @arg TIM_TS_TI1F_ED: TI1 Edge Detector + * @arg TIM_TS_TI1FP1: Filtered Timer Input 1 + * @arg TIM_TS_TI2FP2: Filtered Timer Input 2 + * @arg TIM_TS_ETRF: External Trigger input + * @retval None + */ +static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource) +{ + uint32_t tmpsmcr; + + /* Get the TIMx SMCR register value */ + tmpsmcr = TIMx->SMCR; + /* Reset the TS Bits */ + tmpsmcr &= ~TIM_SMCR_TS; + /* Set the Input Trigger source and the slave mode*/ + tmpsmcr |= (InputTriggerSource | TIM_SLAVEMODE_EXTERNAL1); + /* Write to TIMx SMCR */ + TIMx->SMCR = tmpsmcr; +} +/** + * @brief Configures the TIMx External Trigger (ETR). + * @param TIMx to select the TIM peripheral + * @param TIM_ExtTRGPrescaler The external Trigger Prescaler. + * This parameter can be one of the following values: + * @arg TIM_ETRPRESCALER_DIV1: ETRP Prescaler OFF. + * @arg TIM_ETRPRESCALER_DIV2: ETRP frequency divided by 2. + * @arg TIM_ETRPRESCALER_DIV4: ETRP frequency divided by 4. + * @arg TIM_ETRPRESCALER_DIV8: ETRP frequency divided by 8. + * @param TIM_ExtTRGPolarity The external Trigger Polarity. + * This parameter can be one of the following values: + * @arg TIM_ETRPOLARITY_INVERTED: active low or falling edge active. + * @arg TIM_ETRPOLARITY_NONINVERTED: active high or rising edge active. + * @param ExtTRGFilter External Trigger Filter. + * This parameter must be a value between 0x00 and 0x0F + * @retval None + */ +void TIM_ETR_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ExtTRGPrescaler, + uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter) +{ + uint32_t tmpsmcr; + + tmpsmcr = TIMx->SMCR; + + /* Reset the ETR Bits */ + tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP); + + /* Set the Prescaler, the Filter value and the Polarity */ + tmpsmcr |= (uint32_t)(TIM_ExtTRGPrescaler | (TIM_ExtTRGPolarity | (ExtTRGFilter << 8U))); + + /* Write to TIMx SMCR */ + TIMx->SMCR = tmpsmcr; +} + +/** + * @brief Enables or disables the TIM Capture Compare Channel x. + * @param TIMx to select the TIM peripheral + * @param Channel specifies the TIM Channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 + * @arg TIM_CHANNEL_2: TIM Channel 2 + * @arg TIM_CHANNEL_3: TIM Channel 3 + * @arg TIM_CHANNEL_4: TIM Channel 4 + * @param ChannelState specifies the TIM Channel CCxE bit new state. + * This parameter can be: TIM_CCx_ENABLE or TIM_CCx_DISABLE. + * @retval None + */ +void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState) +{ + uint32_t tmp; + + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(TIMx)); + assert_param(IS_TIM_CHANNELS(Channel)); + + tmp = TIM_CCER_CC1E << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */ + + /* Reset the CCxE Bit */ + TIMx->CCER &= ~tmp; + + /* Set or reset the CCxE Bit */ + TIMx->CCER |= (uint32_t)(ChannelState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */ +} + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +/** + * @brief Reset interrupt callbacks to the legacy weak callbacks. + * @param htim pointer to a TIM_HandleTypeDef structure that contains + * the configuration information for TIM module. + * @retval None + */ +void TIM_ResetCallback(TIM_HandleTypeDef *htim) +{ + /* Reset the TIM callback to the legacy weak callbacks */ + htim->PeriodElapsedCallback = HAL_TIM_PeriodElapsedCallback; + htim->PeriodElapsedHalfCpltCallback = HAL_TIM_PeriodElapsedHalfCpltCallback; + htim->TriggerCallback = HAL_TIM_TriggerCallback; + htim->TriggerHalfCpltCallback = HAL_TIM_TriggerHalfCpltCallback; + htim->IC_CaptureCallback = HAL_TIM_IC_CaptureCallback; + htim->IC_CaptureHalfCpltCallback = HAL_TIM_IC_CaptureHalfCpltCallback; + htim->OC_DelayElapsedCallback = HAL_TIM_OC_DelayElapsedCallback; + htim->PWM_PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback; + htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback; + htim->ErrorCallback = HAL_TIM_ErrorCallback; + htim->CommutationCallback = HAL_TIMEx_CommutCallback; + htim->CommutationHalfCpltCallback = HAL_TIMEx_CommutHalfCpltCallback; + htim->BreakCallback = HAL_TIMEx_BreakCallback; +} +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @} + */ + +#endif /* HAL_TIM_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ diff --git a/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c new file mode 100644 index 0000000..889f8fb --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c @@ -0,0 +1,2410 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_tim_ex.c + * @author MCD Application Team + * @brief TIM HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Timer Extended peripheral: + * + Time Hall Sensor Interface Initialization + * + Time Hall Sensor Interface Start + * + Time Complementary signal break and dead time configuration + * + Time Master and Slave synchronization configuration + * + Timer remapping capabilities configuration + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### TIMER Extended features ##### + ============================================================================== + [..] + The Timer Extended features include: + (#) Complementary outputs with programmable dead-time for : + (++) Output Compare + (++) PWM generation (Edge and Center-aligned Mode) + (++) One-pulse mode output + (#) Synchronization circuit to control the timer with external signals and to + interconnect several timers together. + (#) Break input to put the timer output signals in reset state or in a known state. + (#) Supports incremental (quadrature) encoder and hall-sensor circuitry for + positioning purposes + + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Initialize the TIM low level resources by implementing the following functions + depending on the selected feature: + (++) Hall Sensor output : HAL_TIMEx_HallSensor_MspInit() + + (#) Initialize the TIM low level resources : + (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE(); + (##) TIM pins configuration + (+++) Enable the clock for the TIM GPIOs using the following function: + __HAL_RCC_GPIOx_CLK_ENABLE(); + (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init(); + + (#) The external Clock can be configured, if needed (the default clock is the + internal clock from the APBx), using the following function: + HAL_TIM_ConfigClockSource, the clock configuration should be done before + any start function. + + (#) Configure the TIM in the desired functioning mode using one of the + initialization function of this driver: + (++) HAL_TIMEx_HallSensor_Init() and HAL_TIMEx_ConfigCommutEvent(): to use the + Timer Hall Sensor Interface and the commutation event with the corresponding + Interrupt and DMA request if needed (Note that One Timer is used to interface + with the Hall sensor Interface and another Timer should be used to use + the commutation event). + + (#) Activate the TIM peripheral using one of the start functions: + (++) Complementary Output Compare : HAL_TIMEx_OCN_Start(), HAL_TIMEx_OCN_Start_DMA(), + HAL_TIMEx_OCN_Start_IT() + (++) Complementary PWM generation : HAL_TIMEx_PWMN_Start(), HAL_TIMEx_PWMN_Start_DMA(), + HAL_TIMEx_PWMN_Start_IT() + (++) Complementary One-pulse mode output : HAL_TIMEx_OnePulseN_Start(), HAL_TIMEx_OnePulseN_Start_IT() + (++) Hall Sensor output : HAL_TIMEx_HallSensor_Start(), HAL_TIMEx_HallSensor_Start_DMA(), + HAL_TIMEx_HallSensor_Start_IT(). + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup TIMEx TIMEx + * @brief TIM Extended HAL module driver + * @{ + */ + +#ifdef HAL_TIM_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +static void TIM_DMADelayPulseNCplt(DMA_HandleTypeDef *hdma); +static void TIM_DMAErrorCCxN(DMA_HandleTypeDef *hdma); +static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState); + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup TIMEx_Exported_Functions TIM Extended Exported Functions + * @{ + */ + +/** @defgroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions + * @brief Timer Hall Sensor functions + * +@verbatim + ============================================================================== + ##### Timer Hall Sensor functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure TIM HAL Sensor. + (+) De-initialize TIM HAL Sensor. + (+) Start the Hall Sensor Interface. + (+) Stop the Hall Sensor Interface. + (+) Start the Hall Sensor Interface and enable interrupts. + (+) Stop the Hall Sensor Interface and disable interrupts. + (+) Start the Hall Sensor Interface and enable DMA transfers. + (+) Stop the Hall Sensor Interface and disable DMA transfers. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Hall Sensor Interface and initialize the associated handle. + * @note When the timer instance is initialized in Hall Sensor Interface mode, + * timer channels 1 and channel 2 are reserved and cannot be used for + * other purpose. + * @param htim TIM Hall Sensor Interface handle + * @param sConfig TIM Hall Sensor configuration structure + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, const TIM_HallSensor_InitTypeDef *sConfig) +{ + TIM_OC_InitTypeDef OC_Config; + + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + assert_param(IS_TIM_IC_POLARITY(sConfig->IC1Polarity)); + assert_param(IS_TIM_PERIOD(htim, htim->Init.Period)); + assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); + assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy week callbacks */ + TIM_ResetCallback(htim); + + if (htim->HallSensor_MspInitCallback == NULL) + { + htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->HallSensor_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIMEx_HallSensor_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Configure the Time base in the Encoder Mode */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Configure the Channel 1 as Input Channel to interface with the three Outputs of the Hall sensor */ + TIM_TI1_SetConfig(htim->Instance, sConfig->IC1Polarity, TIM_ICSELECTION_TRC, sConfig->IC1Filter); + + /* Reset the IC1PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; + /* Set the IC1PSC value */ + htim->Instance->CCMR1 |= sConfig->IC1Prescaler; + + /* Enable the Hall sensor interface (XOR function of the three inputs) */ + htim->Instance->CR2 |= TIM_CR2_TI1S; + + /* Select the TIM_TS_TI1F_ED signal as Input trigger for the TIM */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= TIM_TS_TI1F_ED; + + /* Use the TIM_TS_TI1F_ED signal to reset the TIM counter each edge detection */ + htim->Instance->SMCR &= ~TIM_SMCR_SMS; + htim->Instance->SMCR |= TIM_SLAVEMODE_RESET; + + /* Program channel 2 in PWM 2 mode with the desired Commutation_Delay*/ + OC_Config.OCFastMode = TIM_OCFAST_DISABLE; + OC_Config.OCIdleState = TIM_OCIDLESTATE_RESET; + OC_Config.OCMode = TIM_OCMODE_PWM2; + OC_Config.OCNIdleState = TIM_OCNIDLESTATE_RESET; + OC_Config.OCNPolarity = TIM_OCNPOLARITY_HIGH; + OC_Config.OCPolarity = TIM_OCPOLARITY_HIGH; + OC_Config.Pulse = sConfig->Commutation_Delay; + + TIM_OC2_SetConfig(htim->Instance, &OC_Config); + + /* Select OC2REF as trigger output on TRGO: write the MMS bits in the TIMx_CR2 + register to 101 */ + htim->Instance->CR2 &= ~TIM_CR2_MMS; + htim->Instance->CR2 |= TIM_TRGO_OC2REF; + + /* Initialize the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + + /* Initialize the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM Hall Sensor interface + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->HallSensor_MspDeInitCallback == NULL) + { + htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; + } + /* DeInit the low level hardware */ + htim->HallSensor_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_TIMEx_HallSensor_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; + + /* Change the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Hall Sensor MSP. + * @param htim TIM Hall Sensor Interface handle + * @retval None + */ +__weak void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_HallSensor_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Hall Sensor MSP. + * @param htim TIM Hall Sensor Interface handle + * @retval None + */ +__weak void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_HallSensor_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM Hall Sensor Interface. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim) +{ + uint32_t tmpsmcr; + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Check the TIM channels state */ + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Hall sensor Interface. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channels 1, 2 and 3 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Hall Sensor Interface in interrupt mode. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim) +{ + uint32_t tmpsmcr; + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Check the TIM channels state */ + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the capture compare Interrupts 1 event */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + + /* Enable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Hall Sensor Interface in interrupt mode. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + /* Disable the capture compare Interrupts event */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Hall Sensor Interface in DMA mode. + * @param htim TIM Hall Sensor Interface handle + * @param pData The destination Buffer address. + * @param Length The length of data to be transferred from TIM peripheral to memory. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length) +{ + uint32_t tmpsmcr; + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Set the TIM channel state */ + if ((channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) + || (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY)) + { + return HAL_BUSY; + } + else if ((channel_1_state == HAL_TIM_CHANNEL_STATE_READY) + && (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_READY)) + { + if ((pData == NULL) || (Length == 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + + /* Enable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + + /* Set the DMA Input Capture 1 Callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream for Capture 1*/ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the capture compare 1 Interrupt */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Hall Sensor Interface in DMA mode. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + + /* Disable the capture compare Interrupts 1 event */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions + * @brief Timer Complementary Output Compare functions + * +@verbatim + ============================================================================== + ##### Timer Complementary Output Compare functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Start the Complementary Output Compare/PWM. + (+) Stop the Complementary Output Compare/PWM. + (+) Start the Complementary Output Compare/PWM and enable interrupts. + (+) Stop the Complementary Output Compare/PWM and disable interrupts. + (+) Start the Complementary Output Compare/PWM and enable DMA transfers. + (+) Stop the Complementary Output Compare/PWM and disable DMA transfers. + +@endverbatim + * @{ + */ + +/** + * @brief Starts the TIM Output Compare signal generation on the complementary + * output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Output Compare signal generation on the complementary + * output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Disable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Output Compare signal generation in interrupt mode + * on the complementary output. + * @param htim TIM OC handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Output Compare interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Output Compare interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Output Compare interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the TIM Break interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK); + + /* Enable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM Output Compare signal generation in interrupt mode + * on the complementary output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpccer; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Output Compare interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Output Compare interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Output Compare interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the TIM Break interrupt (only if no more channel is active) */ + tmpccer = htim->Instance->CCER; + if ((tmpccer & TIM_CCER_CCxNE_MASK) == (uint32_t)RESET) + { + __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK); + } + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @brief Starts the TIM Output Compare signal generation in DMA mode + * on the complementary output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to TIM peripheral + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, + uint16_t Length) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Set the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) + { + return HAL_BUSY; + } + else if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) + { + if ((pData == NULL) || (Length == 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseNCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAErrorCCxN ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Output Compare DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseNCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAErrorCCxN ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Output Compare DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseNCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAErrorCCxN ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Output Compare DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM Output Compare signal generation in DMA mode + * on the complementary output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Output Compare DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Output Compare DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Output Compare DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions + * @brief Timer Complementary PWM functions + * +@verbatim + ============================================================================== + ##### Timer Complementary PWM functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Start the Complementary PWM. + (+) Stop the Complementary PWM. + (+) Start the Complementary PWM and enable interrupts. + (+) Stop the Complementary PWM and disable interrupts. + (+) Start the Complementary PWM and enable DMA transfers. + (+) Stop the Complementary PWM and disable DMA transfers. +@endverbatim + * @{ + */ + +/** + * @brief Starts the PWM signal generation on the complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the PWM signal generation on the complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Disable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the PWM signal generation in interrupt mode on the + * complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the TIM Break interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK); + + /* Enable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the PWM signal generation in interrupt mode on the + * complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpccer; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the TIM Break interrupt (only if no more channel is active) */ + tmpccer = htim->Instance->CCER; + if ((tmpccer & TIM_CCER_CCxNE_MASK) == (uint32_t)RESET) + { + __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK); + } + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @brief Starts the TIM PWM signal generation in DMA mode on the + * complementary output + * @param htim TIM handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to TIM peripheral + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData, + uint16_t Length) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Set the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) + { + return HAL_BUSY; + } + else if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) + { + if ((pData == NULL) || (Length == 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseNCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAErrorCCxN ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseNCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAErrorCCxN ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseNCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAErrorCCxN ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM PWM signal generation in DMA mode on the complementary + * output + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions + * @brief Timer Complementary One Pulse functions + * +@verbatim + ============================================================================== + ##### Timer Complementary One Pulse functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Start the Complementary One Pulse generation. + (+) Stop the Complementary One Pulse. + (+) Start the Complementary One Pulse and enable interrupts. + (+) Stop the Complementary One Pulse and disable interrupts. + +@endverbatim + * @{ + */ + +/** + * @brief Starts the TIM One Pulse signal generation on the complementary + * output. + * @note OutputChannel must match the pulse output channel chosen when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel pulse output channel to enable + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); + + /* Check the TIM channels state */ + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the complementary One Pulse output channel and the Input Capture channel */ + TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE); + TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM One Pulse signal generation on the complementary + * output. + * @note OutputChannel must match the pulse output channel chosen when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel pulse output channel to disable + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); + + /* Disable the complementary One Pulse output channel and the Input Capture channel */ + TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE); + TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM One Pulse signal generation in interrupt mode on the + * complementary channel. + * @note OutputChannel must match the pulse output channel chosen when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel pulse output channel to enable + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); + + /* Check the TIM channels state */ + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + + /* Enable the complementary One Pulse output channel and the Input Capture channel */ + TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE); + TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM One Pulse signal generation in interrupt mode on the + * complementary channel. + * @note OutputChannel must match the pulse output channel chosen when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel pulse output channel to disable + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); + + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + + /* Disable the complementary One Pulse output channel and the Input Capture channel */ + TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE); + TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions + * @brief Peripheral Control functions + * +@verbatim + ============================================================================== + ##### Peripheral Control functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Configure the commutation event in case of use of the Hall sensor interface. + (+) Configure Output channels for OC and PWM mode. + + (+) Configure Complementary channels, break features and dead time. + (+) Configure Master synchronization. + (+) Configure timer remapping capabilities. + +@endverbatim + * @{ + */ + +/** + * @brief Configure the TIM commutation event sequence. + * @note This function is mandatory to use the commutation event in order to + * update the configuration at each commutation detection on the TRGI input of the Timer, + * the typical use of this feature is with the use of another Timer(interface Timer) + * configured in Hall sensor interface, this interface Timer will generate the + * commutation at its TRGO output (connected to Timer used in this function) each time + * the TI1 of the Interface Timer detect a commutation at its input TI1. + * @param htim TIM handle + * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal trigger 0 selected + * @arg TIM_TS_ITR1: Internal trigger 1 selected + * @arg TIM_TS_ITR2: Internal trigger 2 selected + * @arg TIM_TS_ITR3: Internal trigger 3 selected + * @arg TIM_TS_NONE: No trigger is needed + * @param CommutationSource the Commutation Event source + * This parameter can be one of the following values: + * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer + * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); + assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); + + __HAL_LOCK(htim); + + if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || + (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) + { + /* Select the Input trigger */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= InputTrigger; + } + + /* Select the Capture Compare preload feature */ + htim->Instance->CR2 |= TIM_CR2_CCPC; + /* Select the Commutation event source */ + htim->Instance->CR2 &= ~TIM_CR2_CCUS; + htim->Instance->CR2 |= CommutationSource; + + /* Disable Commutation Interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); + + /* Disable Commutation DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configure the TIM commutation event sequence with interrupt. + * @note This function is mandatory to use the commutation event in order to + * update the configuration at each commutation detection on the TRGI input of the Timer, + * the typical use of this feature is with the use of another Timer(interface Timer) + * configured in Hall sensor interface, this interface Timer will generate the + * commutation at its TRGO output (connected to Timer used in this function) each time + * the TI1 of the Interface Timer detect a commutation at its input TI1. + * @param htim TIM handle + * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal trigger 0 selected + * @arg TIM_TS_ITR1: Internal trigger 1 selected + * @arg TIM_TS_ITR2: Internal trigger 2 selected + * @arg TIM_TS_ITR3: Internal trigger 3 selected + * @arg TIM_TS_NONE: No trigger is needed + * @param CommutationSource the Commutation Event source + * This parameter can be one of the following values: + * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer + * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); + assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); + + __HAL_LOCK(htim); + + if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || + (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) + { + /* Select the Input trigger */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= InputTrigger; + } + + /* Select the Capture Compare preload feature */ + htim->Instance->CR2 |= TIM_CR2_CCPC; + /* Select the Commutation event source */ + htim->Instance->CR2 &= ~TIM_CR2_CCUS; + htim->Instance->CR2 |= CommutationSource; + + /* Disable Commutation DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); + + /* Enable the Commutation Interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_COM); + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configure the TIM commutation event sequence with DMA. + * @note This function is mandatory to use the commutation event in order to + * update the configuration at each commutation detection on the TRGI input of the Timer, + * the typical use of this feature is with the use of another Timer(interface Timer) + * configured in Hall sensor interface, this interface Timer will generate the + * commutation at its TRGO output (connected to Timer used in this function) each time + * the TI1 of the Interface Timer detect a commutation at its input TI1. + * @note The user should configure the DMA in his own software, in This function only the COMDE bit is set + * @param htim TIM handle + * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal trigger 0 selected + * @arg TIM_TS_ITR1: Internal trigger 1 selected + * @arg TIM_TS_ITR2: Internal trigger 2 selected + * @arg TIM_TS_ITR3: Internal trigger 3 selected + * @arg TIM_TS_NONE: No trigger is needed + * @param CommutationSource the Commutation Event source + * This parameter can be one of the following values: + * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer + * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); + assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); + + __HAL_LOCK(htim); + + if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || + (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) + { + /* Select the Input trigger */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= InputTrigger; + } + + /* Select the Capture Compare preload feature */ + htim->Instance->CR2 |= TIM_CR2_CCPC; + /* Select the Commutation event source */ + htim->Instance->CR2 &= ~TIM_CR2_CCUS; + htim->Instance->CR2 |= CommutationSource; + + /* Enable the Commutation DMA Request */ + /* Set the DMA Commutation Callback */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError; + + /* Disable Commutation Interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); + + /* Enable the Commutation DMA Request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_COM); + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configures the TIM in master mode. + * @param htim TIM handle. + * @param sMasterConfig pointer to a TIM_MasterConfigTypeDef structure that + * contains the selected trigger output (TRGO) and the Master/Slave + * mode. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, + const TIM_MasterConfigTypeDef *sMasterConfig) +{ + uint32_t tmpcr2; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_MASTER_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRGO_SOURCE(sMasterConfig->MasterOutputTrigger)); + assert_param(IS_TIM_MSM_STATE(sMasterConfig->MasterSlaveMode)); + + /* Check input state */ + __HAL_LOCK(htim); + + /* Change the handler state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Get the TIMx CR2 register value */ + tmpcr2 = htim->Instance->CR2; + + /* Get the TIMx SMCR register value */ + tmpsmcr = htim->Instance->SMCR; + + /* Reset the MMS Bits */ + tmpcr2 &= ~TIM_CR2_MMS; + /* Select the TRGO source */ + tmpcr2 |= sMasterConfig->MasterOutputTrigger; + + /* Update TIMx CR2 */ + htim->Instance->CR2 = tmpcr2; + + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + /* Reset the MSM Bit */ + tmpsmcr &= ~TIM_SMCR_MSM; + /* Set master mode */ + tmpsmcr |= sMasterConfig->MasterSlaveMode; + + /* Update TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + } + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configures the Break feature, dead time, Lock level, OSSI/OSSR State + * and the AOE(automatic output enable). + * @param htim TIM handle + * @param sBreakDeadTimeConfig pointer to a TIM_ConfigBreakDeadConfigTypeDef structure that + * contains the BDTR Register configuration information for the TIM peripheral. + * @note Interrupts can be generated when an active level is detected on the + * break input, the break 2 input or the system break input. Break + * interrupt can be enabled by calling the @ref __HAL_TIM_ENABLE_IT macro. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, + const TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig) +{ + /* Keep this variable initialized to 0 as it is used to configure BDTR register */ + uint32_t tmpbdtr = 0U; + + /* Check the parameters */ + assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance)); + assert_param(IS_TIM_OSSR_STATE(sBreakDeadTimeConfig->OffStateRunMode)); + assert_param(IS_TIM_OSSI_STATE(sBreakDeadTimeConfig->OffStateIDLEMode)); + assert_param(IS_TIM_LOCK_LEVEL(sBreakDeadTimeConfig->LockLevel)); + assert_param(IS_TIM_DEADTIME(sBreakDeadTimeConfig->DeadTime)); + assert_param(IS_TIM_BREAK_STATE(sBreakDeadTimeConfig->BreakState)); + assert_param(IS_TIM_BREAK_POLARITY(sBreakDeadTimeConfig->BreakPolarity)); + assert_param(IS_TIM_AUTOMATIC_OUTPUT_STATE(sBreakDeadTimeConfig->AutomaticOutput)); + + /* Check input state */ + __HAL_LOCK(htim); + + /* Set the Lock level, the Break enable Bit and the Polarity, the OSSR State, + the OSSI State, the dead time value and the Automatic Output Enable Bit */ + + /* Set the BDTR bits */ + MODIFY_REG(tmpbdtr, TIM_BDTR_DTG, sBreakDeadTimeConfig->DeadTime); + MODIFY_REG(tmpbdtr, TIM_BDTR_LOCK, sBreakDeadTimeConfig->LockLevel); + MODIFY_REG(tmpbdtr, TIM_BDTR_OSSI, sBreakDeadTimeConfig->OffStateIDLEMode); + MODIFY_REG(tmpbdtr, TIM_BDTR_OSSR, sBreakDeadTimeConfig->OffStateRunMode); + MODIFY_REG(tmpbdtr, TIM_BDTR_BKE, sBreakDeadTimeConfig->BreakState); + MODIFY_REG(tmpbdtr, TIM_BDTR_BKP, sBreakDeadTimeConfig->BreakPolarity); + MODIFY_REG(tmpbdtr, TIM_BDTR_AOE, sBreakDeadTimeConfig->AutomaticOutput); + + + /* Set TIMx_BDTR */ + htim->Instance->BDTR = tmpbdtr; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configures the TIMx Remapping input capabilities. + * @param htim TIM handle. + * @param Remap specifies the TIM remapping source. + * For TIM1, the parameter can have the following values: (**) + * @arg TIM_TIM1_TIM3_TRGO: TIM1 ITR2 is connected to TIM3 TRGO + * @arg TIM_TIM1_LPTIM: TIM1 ITR2 is connected to LPTIM1 output + * + * For TIM2, the parameter can have the following values: (**) + * @arg TIM_TIM2_TIM8_TRGO: TIM2 ITR1 is connected to TIM8 TRGO (*) + * @arg TIM_TIM2_ETH_PTP: TIM2 ITR1 is connected to PTP trigger output (*) + * @arg TIM_TIM2_USBFS_SOF: TIM2 ITR1 is connected to OTG FS SOF + * @arg TIM_TIM2_USBHS_SOF: TIM2 ITR1 is connected to OTG FS SOF + * + * For TIM5, the parameter can have the following values: + * @arg TIM_TIM5_GPIO: TIM5 TI4 is connected to GPIO + * @arg TIM_TIM5_LSI: TIM5 TI4 is connected to LSI + * @arg TIM_TIM5_LSE: TIM5 TI4 is connected to LSE + * @arg TIM_TIM5_RTC: TIM5 TI4 is connected to the RTC wakeup interrupt + * @arg TIM_TIM5_TIM3_TRGO: TIM5 ITR1 is connected to TIM3 TRGO (*) + * @arg TIM_TIM5_LPTIM: TIM5 ITR1 is connected to LPTIM1 output (*) + * + * For TIM9, the parameter can have the following values: (**) + * @arg TIM_TIM9_TIM3_TRGO: TIM9 ITR1 is connected to TIM3 TRGO + * @arg TIM_TIM9_LPTIM: TIM9 ITR1 is connected to LPTIM1 output + * + * For TIM11, the parameter can have the following values: + * @arg TIM_TIM11_GPIO: TIM11 TI1 is connected to GPIO + * @arg TIM_TIM11_HSE: TIM11 TI1 is connected to HSE_RTC clock + * @arg TIM_TIM11_SPDIFRX: TIM11 TI1 is connected to SPDIFRX_FRAME_SYNC (*) + * + * (*) Value not defined in all devices. \n + * (**) Register not available in all devices. + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap) +{ + /* Check parameters */ + assert_param(IS_TIM_REMAP(htim->Instance, Remap)); + + __HAL_LOCK(htim); + +#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM9_ITR1_RMP) + if ((Remap & LPTIM_REMAP_MASK) == LPTIM_REMAP_MASK) + { + /* Connect TIMx internal trigger to LPTIM1 output */ + __HAL_RCC_LPTIM1_CLK_ENABLE(); + MODIFY_REG(LPTIM1->OR, + (LPTIM_OR_TIM1_ITR2_RMP | LPTIM_OR_TIM5_ITR1_RMP | LPTIM_OR_TIM9_ITR1_RMP), + Remap & ~(LPTIM_REMAP_MASK)); + } + else + { + /* Set the Timer remapping configuration */ + WRITE_REG(htim->Instance->OR, Remap); + } +#else + /* Set the Timer remapping configuration */ + WRITE_REG(htim->Instance->OR, Remap); +#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM9_ITR1_RMP */ + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group6 Extended Callbacks functions + * @brief Extended Callbacks functions + * +@verbatim + ============================================================================== + ##### Extended Callbacks functions ##### + ============================================================================== + [..] + This section provides Extended TIM callback functions: + (+) Timer Commutation callback + (+) Timer Break callback + +@endverbatim + * @{ + */ + +/** + * @brief Commutation callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIMEx_CommutCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_CommutCallback could be implemented in the user file + */ +} +/** + * @brief Commutation half complete callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIMEx_CommutHalfCpltCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_CommutHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Break detection callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_BreakCallback could be implemented in the user file + */ +} +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group7 Extended Peripheral State functions + * @brief Extended Peripheral State functions + * +@verbatim + ============================================================================== + ##### Extended Peripheral State functions ##### + ============================================================================== + [..] + This subsection permits to get in run-time the status of the peripheral + and the data flow. + +@endverbatim + * @{ + */ + +/** + * @brief Return the TIM Hall Sensor interface handle state. + * @param htim TIM Hall Sensor handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(const TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return actual state of the TIM complementary channel. + * @param htim TIM handle + * @param ChannelN TIM Complementary channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 + * @arg TIM_CHANNEL_2: TIM Channel 2 + * @arg TIM_CHANNEL_3: TIM Channel 3 + * @retval TIM Complementary channel state + */ +HAL_TIM_ChannelStateTypeDef HAL_TIMEx_GetChannelNState(const TIM_HandleTypeDef *htim, uint32_t ChannelN) +{ + HAL_TIM_ChannelStateTypeDef channel_state; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, ChannelN)); + + channel_state = TIM_CHANNEL_N_STATE_GET(htim, ChannelN); + + return channel_state; +} +/** + * @} + */ + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup TIMEx_Private_Functions TIM Extended Private Functions + * @{ + */ + +/** + * @brief TIM DMA Commutation callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->CommutationCallback(htim); +#else + HAL_TIMEx_CommutCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Commutation half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->CommutationHalfCpltCallback(htim); +#else + HAL_TIMEx_CommutHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + + +/** + * @brief TIM DMA Delay Pulse complete callback (complementary channel). + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMADelayPulseNCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); + } + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA error callback (complementary channel) + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMAErrorCCxN(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->ErrorCallback(htim); +#else + HAL_TIM_ErrorCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief Enables or disables the TIM Capture Compare Channel xN. + * @param TIMx to select the TIM peripheral + * @param Channel specifies the TIM Channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 + * @arg TIM_CHANNEL_2: TIM Channel 2 + * @arg TIM_CHANNEL_3: TIM Channel 3 + * @param ChannelNState specifies the TIM Channel CCxNE bit new state. + * This parameter can be: TIM_CCxN_ENABLE or TIM_CCxN_Disable. + * @retval None + */ +static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState) +{ + uint32_t tmp; + + tmp = TIM_CCER_CC1NE << (Channel & 0xFU); /* 0xFU = 15 bits max shift */ + + /* Reset the CCxNE Bit */ + TIMx->CCER &= ~tmp; + + /* Set or reset the CCxNE Bit */ + TIMx->CCER |= (uint32_t)(ChannelNState << (Channel & 0xFU)); /* 0xFU = 15 bits max shift */ +} +/** + * @} + */ + +#endif /* HAL_TIM_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ diff --git a/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c new file mode 100644 index 0000000..cf6d201 --- /dev/null +++ b/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c @@ -0,0 +1,3807 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_uart.c + * @author MCD Application Team + * @brief UART HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Universal Asynchronous Receiver Transmitter Peripheral (UART). + * + Initialization and de-initialization functions + * + IO operation functions + * + Peripheral Control functions + * + Peripheral State and Errors functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The UART HAL driver can be used as follows: + + (#) Declare a UART_HandleTypeDef handle structure (eg. UART_HandleTypeDef huart). + (#) Initialize the UART low level resources by implementing the HAL_UART_MspInit() API: + (##) Enable the USARTx interface clock. + (##) UART pins configuration: + (+++) Enable the clock for the UART GPIOs. + (+++) Configure the UART TX/RX pins as alternate function pull-up. + (##) NVIC configuration if you need to use interrupt process (HAL_UART_Transmit_IT() + and HAL_UART_Receive_IT() APIs): + (+++) Configure the USARTx interrupt priority. + (+++) Enable the NVIC USART IRQ handle. + (##) DMA Configuration if you need to use DMA process (HAL_UART_Transmit_DMA() + and HAL_UART_Receive_DMA() APIs): + (+++) Declare a DMA handle structure for the Tx/Rx stream. + (+++) Enable the DMAx interface clock. + (+++) Configure the declared DMA handle structure with the required + Tx/Rx parameters. + (+++) Configure the DMA Tx/Rx stream. + (+++) Associate the initialized DMA handle to the UART DMA Tx/Rx handle. + (+++) Configure the priority and enable the NVIC for the transfer complete + interrupt on the DMA Tx/Rx stream. + (+++) Configure the USARTx interrupt priority and enable the NVIC USART IRQ handle + (used for last byte sending completion detection in DMA non circular mode) + + (#) Program the Baud Rate, Word Length, Stop Bit, Parity, Hardware + flow control and Mode(Receiver/Transmitter) in the huart Init structure. + + (#) For the UART asynchronous mode, initialize the UART registers by calling + the HAL_UART_Init() API. + + (#) For the UART Half duplex mode, initialize the UART registers by calling + the HAL_HalfDuplex_Init() API. + + (#) For the LIN mode, initialize the UART registers by calling the HAL_LIN_Init() API. + + (#) For the Multi-Processor mode, initialize the UART registers by calling + the HAL_MultiProcessor_Init() API. + + [..] + (@) The specific UART interrupts (Transmission complete interrupt, + RXNE interrupt and Error Interrupts) will be managed using the macros + __HAL_UART_ENABLE_IT() and __HAL_UART_DISABLE_IT() inside the transmit + and receive process. + + [..] + (@) These APIs (HAL_UART_Init() and HAL_HalfDuplex_Init()) configure also the + low level Hardware GPIO, CLOCK, CORTEX...etc) by calling the customized + HAL_UART_MspInit() API. + + ##### Callback registration ##### + ================================== + + [..] + The compilation define USE_HAL_UART_REGISTER_CALLBACKS when set to 1 + allows the user to configure dynamically the driver callbacks. + + [..] + Use Function HAL_UART_RegisterCallback() to register a user callback. + Function HAL_UART_RegisterCallback() allows to register following callbacks: + (+) TxHalfCpltCallback : Tx Half Complete Callback. + (+) TxCpltCallback : Tx Complete Callback. + (+) RxHalfCpltCallback : Rx Half Complete Callback. + (+) RxCpltCallback : Rx Complete Callback. + (+) ErrorCallback : Error Callback. + (+) AbortCpltCallback : Abort Complete Callback. + (+) AbortTransmitCpltCallback : Abort Transmit Complete Callback. + (+) AbortReceiveCpltCallback : Abort Receive Complete Callback. + (+) MspInitCallback : UART MspInit. + (+) MspDeInitCallback : UART MspDeInit. + This function takes as parameters the HAL peripheral handle, the Callback ID + and a pointer to the user callback function. + + [..] + Use function HAL_UART_UnRegisterCallback() to reset a callback to the default + weak (surcharged) function. + HAL_UART_UnRegisterCallback() takes as parameters the HAL peripheral handle, + and the Callback ID. + This function allows to reset following callbacks: + (+) TxHalfCpltCallback : Tx Half Complete Callback. + (+) TxCpltCallback : Tx Complete Callback. + (+) RxHalfCpltCallback : Rx Half Complete Callback. + (+) RxCpltCallback : Rx Complete Callback. + (+) ErrorCallback : Error Callback. + (+) AbortCpltCallback : Abort Complete Callback. + (+) AbortTransmitCpltCallback : Abort Transmit Complete Callback. + (+) AbortReceiveCpltCallback : Abort Receive Complete Callback. + (+) MspInitCallback : UART MspInit. + (+) MspDeInitCallback : UART MspDeInit. + + [..] + For specific callback RxEventCallback, use dedicated registration/reset functions: + respectively HAL_UART_RegisterRxEventCallback() , HAL_UART_UnRegisterRxEventCallback(). + + [..] + By default, after the HAL_UART_Init() and when the state is HAL_UART_STATE_RESET + all callbacks are set to the corresponding weak (surcharged) functions: + examples HAL_UART_TxCpltCallback(), HAL_UART_RxHalfCpltCallback(). + Exception done for MspInit and MspDeInit functions that are respectively + reset to the legacy weak (surcharged) functions in the HAL_UART_Init() + and HAL_UART_DeInit() only when these callbacks are null (not registered beforehand). + If not, MspInit or MspDeInit are not null, the HAL_UART_Init() and HAL_UART_DeInit() + keep and use the user MspInit/MspDeInit callbacks (registered beforehand). + + [..] + Callbacks can be registered/unregistered in HAL_UART_STATE_READY state only. + Exception done MspInit/MspDeInit that can be registered/unregistered + in HAL_UART_STATE_READY or HAL_UART_STATE_RESET state, thus registered (user) + MspInit/DeInit callbacks can be used during the Init/DeInit. + In that case first register the MspInit/MspDeInit user callbacks + using HAL_UART_RegisterCallback() before calling HAL_UART_DeInit() + or HAL_UART_Init() function. + + [..] + When The compilation define USE_HAL_UART_REGISTER_CALLBACKS is set to 0 or + not defined, the callback registration feature is not available + and weak (surcharged) callbacks are used. + + [..] + Three operation modes are available within this driver : + + *** Polling mode IO operation *** + ================================= + [..] + (+) Send an amount of data in blocking mode using HAL_UART_Transmit() + (+) Receive an amount of data in blocking mode using HAL_UART_Receive() + + *** Interrupt mode IO operation *** + =================================== + [..] + (+) Send an amount of data in non blocking mode using HAL_UART_Transmit_IT() + (+) At transmission end of transfer HAL_UART_TxCpltCallback is executed and user can + add his own code by customization of function pointer HAL_UART_TxCpltCallback + (+) Receive an amount of data in non blocking mode using HAL_UART_Receive_IT() + (+) At reception end of transfer HAL_UART_RxCpltCallback is executed and user can + add his own code by customization of function pointer HAL_UART_RxCpltCallback + (+) In case of transfer Error, HAL_UART_ErrorCallback() function is executed and user can + add his own code by customization of function pointer HAL_UART_ErrorCallback + + *** DMA mode IO operation *** + ============================== + [..] + (+) Send an amount of data in non blocking mode (DMA) using HAL_UART_Transmit_DMA() + (+) At transmission end of half transfer HAL_UART_TxHalfCpltCallback is executed and user can + add his own code by customization of function pointer HAL_UART_TxHalfCpltCallback + (+) At transmission end of transfer HAL_UART_TxCpltCallback is executed and user can + add his own code by customization of function pointer HAL_UART_TxCpltCallback + (+) Receive an amount of data in non blocking mode (DMA) using HAL_UART_Receive_DMA() + (+) At reception end of half transfer HAL_UART_RxHalfCpltCallback is executed and user can + add his own code by customization of function pointer HAL_UART_RxHalfCpltCallback + (+) At reception end of transfer HAL_UART_RxCpltCallback is executed and user can + add his own code by customization of function pointer HAL_UART_RxCpltCallback + (+) In case of transfer Error, HAL_UART_ErrorCallback() function is executed and user can + add his own code by customization of function pointer HAL_UART_ErrorCallback + (+) Pause the DMA Transfer using HAL_UART_DMAPause() + (+) Resume the DMA Transfer using HAL_UART_DMAResume() + (+) Stop the DMA Transfer using HAL_UART_DMAStop() + + + [..] This subsection also provides a set of additional functions providing enhanced reception + services to user. (For example, these functions allow application to handle use cases + where number of data to be received is unknown). + + (#) Compared to standard reception services which only consider number of received + data elements as reception completion criteria, these functions also consider additional events + as triggers for updating reception status to caller : + (+) Detection of inactivity period (RX line has not been active for a given period). + (++) RX inactivity detected by IDLE event, i.e. RX line has been in idle state (normally high state) + for 1 frame time, after last received byte. + + (#) There are two mode of transfer: + (+) Blocking mode: The reception is performed in polling mode, until either expected number of data is received, + or till IDLE event occurs. Reception is handled only during function execution. + When function exits, no data reception could occur. HAL status and number of actually received data elements, + are returned by function after finishing transfer. + (+) Non-Blocking mode: The reception is performed using Interrupts or DMA. + These API's return the HAL status. + The end of the data processing will be indicated through the + dedicated UART IRQ when using Interrupt mode or the DMA IRQ when using DMA mode. + The HAL_UARTEx_RxEventCallback() user callback will be executed during Receive process + The HAL_UART_ErrorCallback()user callback will be executed when a reception error is detected. + + (#) Blocking mode API: + (+) HAL_UARTEx_ReceiveToIdle() + + (#) Non-Blocking mode API with Interrupt: + (+) HAL_UARTEx_ReceiveToIdle_IT() + + (#) Non-Blocking mode API with DMA: + (+) HAL_UARTEx_ReceiveToIdle_DMA() + + + *** UART HAL driver macros list *** + ============================================= + [..] + Below the list of most used macros in UART HAL driver. + + (+) __HAL_UART_ENABLE: Enable the UART peripheral + (+) __HAL_UART_DISABLE: Disable the UART peripheral + (+) __HAL_UART_GET_FLAG : Check whether the specified UART flag is set or not + (+) __HAL_UART_CLEAR_FLAG : Clear the specified UART pending flag + (+) __HAL_UART_ENABLE_IT: Enable the specified UART interrupt + (+) __HAL_UART_DISABLE_IT: Disable the specified UART interrupt + (+) __HAL_UART_GET_IT_SOURCE: Check whether the specified UART interrupt has occurred or not + + [..] + (@) You can refer to the UART HAL driver header file for more useful macros + + @endverbatim + [..] + (@) Additional remark: If the parity is enabled, then the MSB bit of the data written + in the data register is transmitted but is changed by the parity bit. + Depending on the frame length defined by the M bit (8-bits or 9-bits), + the possible UART frame formats are as listed in the following table: + +-------------------------------------------------------------+ + | M bit | PCE bit | UART frame | + |---------------------|---------------------------------------| + | 0 | 0 | | SB | 8 bit data | STB | | + |---------|-----------|---------------------------------------| + | 0 | 1 | | SB | 7 bit data | PB | STB | | + |---------|-----------|---------------------------------------| + | 1 | 0 | | SB | 9 bit data | STB | | + |---------|-----------|---------------------------------------| + | 1 | 1 | | SB | 8 bit data | PB | STB | | + +-------------------------------------------------------------+ + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup UART UART + * @brief HAL UART module driver + * @{ + */ +#ifdef HAL_UART_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup UART_Private_Constants + * @{ + */ +/** + * @} + */ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** @addtogroup UART_Private_Functions UART Private Functions + * @{ + */ + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) +void UART_InitCallbacksToDefault(UART_HandleTypeDef *huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +static void UART_EndTxTransfer(UART_HandleTypeDef *huart); +static void UART_EndRxTransfer(UART_HandleTypeDef *huart); +static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma); +static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma); +static void UART_DMATxHalfCplt(DMA_HandleTypeDef *hdma); +static void UART_DMARxHalfCplt(DMA_HandleTypeDef *hdma); +static void UART_DMAError(DMA_HandleTypeDef *hdma); +static void UART_DMAAbortOnError(DMA_HandleTypeDef *hdma); +static void UART_DMATxAbortCallback(DMA_HandleTypeDef *hdma); +static void UART_DMARxAbortCallback(DMA_HandleTypeDef *hdma); +static void UART_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma); +static void UART_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma); +static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart); +static HAL_StatusTypeDef UART_EndTransmit_IT(UART_HandleTypeDef *huart); +static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart); +static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, + uint32_t Tickstart, uint32_t Timeout); +static void UART_SetConfig(UART_HandleTypeDef *huart); + +/** + * @} + */ + +/* Exported functions ---------------------------------------------------------*/ +/** @defgroup UART_Exported_Functions UART Exported Functions + * @{ + */ + +/** @defgroup UART_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and Configuration functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to initialize the USARTx or the UARTy + in asynchronous mode. + (+) For the asynchronous mode only these parameters can be configured: + (++) Baud Rate + (++) Word Length + (++) Stop Bit + (++) Parity: If the parity is enabled, then the MSB bit of the data written + in the data register is transmitted but is changed by the parity bit. + Depending on the frame length defined by the M bit (8-bits or 9-bits), + please refer to Reference manual for possible UART frame formats. + (++) Hardware flow control + (++) Receiver/transmitter modes + (++) Over Sampling Method + [..] + The HAL_UART_Init(), HAL_HalfDuplex_Init(), HAL_LIN_Init() and HAL_MultiProcessor_Init() APIs + follow respectively the UART asynchronous, UART Half duplex, LIN and Multi-Processor configuration + procedures (details for the procedures are available in reference manual + (RM0430 for STM32F4X3xx MCUs and RM0402 for STM32F412xx MCUs + RM0383 for STM32F411xC/E MCUs and RM0401 for STM32F410xx MCUs + RM0090 for STM32F4X5xx/STM32F4X7xx/STM32F429xx/STM32F439xx MCUs + RM0390 for STM32F446xx MCUs and RM0386 for STM32F469xx/STM32F479xx MCUs)). + +@endverbatim + * @{ + */ + +/** + * @brief Initializes the UART mode according to the specified parameters in + * the UART_InitTypeDef and create the associated handle. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart) +{ + /* Check the UART handle allocation */ + if (huart == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + if (huart->Init.HwFlowCtl != UART_HWCONTROL_NONE) + { + /* The hardware flow control is available only for USART1, USART2, USART3 and USART6. + Except for STM32F446xx devices, that is available for USART1, USART2, USART3, USART6, UART4 and UART5. + */ + assert_param(IS_UART_HWFLOW_INSTANCE(huart->Instance)); + assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl)); + } + else + { + assert_param(IS_UART_INSTANCE(huart->Instance)); + } + assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength)); + assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling)); + + if (huart->gState == HAL_UART_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + huart->Lock = HAL_UNLOCKED; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + UART_InitCallbacksToDefault(huart); + + if (huart->MspInitCallback == NULL) + { + huart->MspInitCallback = HAL_UART_MspInit; + } + + /* Init the low level hardware */ + huart->MspInitCallback(huart); +#else + /* Init the low level hardware : GPIO, CLOCK */ + HAL_UART_MspInit(huart); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + } + + huart->gState = HAL_UART_STATE_BUSY; + + /* Disable the peripheral */ + __HAL_UART_DISABLE(huart); + + /* Set the UART Communication parameters */ + UART_SetConfig(huart); + + /* In asynchronous mode, the following bits must be kept cleared: + - LINEN and CLKEN bits in the USART_CR2 register, + - SCEN, HDSEL and IREN bits in the USART_CR3 register.*/ + CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); + CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); + + /* Enable the peripheral */ + __HAL_UART_ENABLE(huart); + + /* Initialize the UART state */ + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + huart->RxEventType = HAL_UART_RXEVENT_TC; + + return HAL_OK; +} + +/** + * @brief Initializes the half-duplex mode according to the specified + * parameters in the UART_InitTypeDef and create the associated handle. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart) +{ + /* Check the UART handle allocation */ + if (huart == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_UART_HALFDUPLEX_INSTANCE(huart->Instance)); + assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength)); + assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling)); + + if (huart->gState == HAL_UART_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + huart->Lock = HAL_UNLOCKED; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + UART_InitCallbacksToDefault(huart); + + if (huart->MspInitCallback == NULL) + { + huart->MspInitCallback = HAL_UART_MspInit; + } + + /* Init the low level hardware */ + huart->MspInitCallback(huart); +#else + /* Init the low level hardware : GPIO, CLOCK */ + HAL_UART_MspInit(huart); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + } + + huart->gState = HAL_UART_STATE_BUSY; + + /* Disable the peripheral */ + __HAL_UART_DISABLE(huart); + + /* Set the UART Communication parameters */ + UART_SetConfig(huart); + + /* In half-duplex mode, the following bits must be kept cleared: + - LINEN and CLKEN bits in the USART_CR2 register, + - SCEN and IREN bits in the USART_CR3 register.*/ + CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); + CLEAR_BIT(huart->Instance->CR3, (USART_CR3_IREN | USART_CR3_SCEN)); + + /* Enable the Half-Duplex mode by setting the HDSEL bit in the CR3 register */ + SET_BIT(huart->Instance->CR3, USART_CR3_HDSEL); + + /* Enable the peripheral */ + __HAL_UART_ENABLE(huart); + + /* Initialize the UART state*/ + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + huart->RxEventType = HAL_UART_RXEVENT_TC; + + return HAL_OK; +} + +/** + * @brief Initializes the LIN mode according to the specified + * parameters in the UART_InitTypeDef and create the associated handle. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param BreakDetectLength Specifies the LIN break detection length. + * This parameter can be one of the following values: + * @arg UART_LINBREAKDETECTLENGTH_10B: 10-bit break detection + * @arg UART_LINBREAKDETECTLENGTH_11B: 11-bit break detection + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength) +{ + /* Check the UART handle allocation */ + if (huart == NULL) + { + return HAL_ERROR; + } + + /* Check the LIN UART instance */ + assert_param(IS_UART_LIN_INSTANCE(huart->Instance)); + + /* Check the Break detection length parameter */ + assert_param(IS_UART_LIN_BREAK_DETECT_LENGTH(BreakDetectLength)); + assert_param(IS_UART_LIN_WORD_LENGTH(huart->Init.WordLength)); + assert_param(IS_UART_LIN_OVERSAMPLING(huart->Init.OverSampling)); + + if (huart->gState == HAL_UART_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + huart->Lock = HAL_UNLOCKED; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + UART_InitCallbacksToDefault(huart); + + if (huart->MspInitCallback == NULL) + { + huart->MspInitCallback = HAL_UART_MspInit; + } + + /* Init the low level hardware */ + huart->MspInitCallback(huart); +#else + /* Init the low level hardware : GPIO, CLOCK */ + HAL_UART_MspInit(huart); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + } + + huart->gState = HAL_UART_STATE_BUSY; + + /* Disable the peripheral */ + __HAL_UART_DISABLE(huart); + + /* Set the UART Communication parameters */ + UART_SetConfig(huart); + + /* In LIN mode, the following bits must be kept cleared: + - CLKEN bits in the USART_CR2 register, + - SCEN, HDSEL and IREN bits in the USART_CR3 register.*/ + CLEAR_BIT(huart->Instance->CR2, (USART_CR2_CLKEN)); + CLEAR_BIT(huart->Instance->CR3, (USART_CR3_HDSEL | USART_CR3_IREN | USART_CR3_SCEN)); + + /* Enable the LIN mode by setting the LINEN bit in the CR2 register */ + SET_BIT(huart->Instance->CR2, USART_CR2_LINEN); + + /* Set the USART LIN Break detection length. */ + CLEAR_BIT(huart->Instance->CR2, USART_CR2_LBDL); + SET_BIT(huart->Instance->CR2, BreakDetectLength); + + /* Enable the peripheral */ + __HAL_UART_ENABLE(huart); + + /* Initialize the UART state*/ + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + huart->RxEventType = HAL_UART_RXEVENT_TC; + + return HAL_OK; +} + +/** + * @brief Initializes the Multi-Processor mode according to the specified + * parameters in the UART_InitTypeDef and create the associated handle. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param Address USART address + * @param WakeUpMethod specifies the USART wake-up method. + * This parameter can be one of the following values: + * @arg UART_WAKEUPMETHOD_IDLELINE: Wake-up by an idle line detection + * @arg UART_WAKEUPMETHOD_ADDRESSMARK: Wake-up by an address mark + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod) +{ + /* Check the UART handle allocation */ + if (huart == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_UART_INSTANCE(huart->Instance)); + + /* Check the Address & wake up method parameters */ + assert_param(IS_UART_WAKEUPMETHOD(WakeUpMethod)); + assert_param(IS_UART_ADDRESS(Address)); + assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength)); + assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling)); + + if (huart->gState == HAL_UART_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + huart->Lock = HAL_UNLOCKED; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + UART_InitCallbacksToDefault(huart); + + if (huart->MspInitCallback == NULL) + { + huart->MspInitCallback = HAL_UART_MspInit; + } + + /* Init the low level hardware */ + huart->MspInitCallback(huart); +#else + /* Init the low level hardware : GPIO, CLOCK */ + HAL_UART_MspInit(huart); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + } + + huart->gState = HAL_UART_STATE_BUSY; + + /* Disable the peripheral */ + __HAL_UART_DISABLE(huart); + + /* Set the UART Communication parameters */ + UART_SetConfig(huart); + + /* In Multi-Processor mode, the following bits must be kept cleared: + - LINEN and CLKEN bits in the USART_CR2 register, + - SCEN, HDSEL and IREN bits in the USART_CR3 register */ + CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); + CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); + + /* Set the USART address node */ + CLEAR_BIT(huart->Instance->CR2, USART_CR2_ADD); + SET_BIT(huart->Instance->CR2, Address); + + /* Set the wake up method by setting the WAKE bit in the CR1 register */ + CLEAR_BIT(huart->Instance->CR1, USART_CR1_WAKE); + SET_BIT(huart->Instance->CR1, WakeUpMethod); + + /* Enable the peripheral */ + __HAL_UART_ENABLE(huart); + + /* Initialize the UART state */ + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + huart->RxEventType = HAL_UART_RXEVENT_TC; + + return HAL_OK; +} + +/** + * @brief DeInitializes the UART peripheral. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart) +{ + /* Check the UART handle allocation */ + if (huart == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_UART_INSTANCE(huart->Instance)); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Disable the Peripheral */ + __HAL_UART_DISABLE(huart); + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + if (huart->MspDeInitCallback == NULL) + { + huart->MspDeInitCallback = HAL_UART_MspDeInit; + } + /* DeInit the low level hardware */ + huart->MspDeInitCallback(huart); +#else + /* DeInit the low level hardware */ + HAL_UART_MspDeInit(huart); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->gState = HAL_UART_STATE_RESET; + huart->RxState = HAL_UART_STATE_RESET; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + huart->RxEventType = HAL_UART_RXEVENT_TC; + + /* Process Unlock */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief UART MSP Init. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval None + */ +__weak void HAL_UART_MspInit(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + /* NOTE: This function should not be modified, when the callback is needed, + the HAL_UART_MspInit could be implemented in the user file + */ +} + +/** + * @brief UART MSP DeInit. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval None + */ +__weak void HAL_UART_MspDeInit(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + /* NOTE: This function should not be modified, when the callback is needed, + the HAL_UART_MspDeInit could be implemented in the user file + */ +} + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) +/** + * @brief Register a User UART Callback + * To be used instead of the weak predefined callback + * @note The HAL_UART_RegisterCallback() may be called before HAL_UART_Init(), HAL_HalfDuplex_Init(), HAL_LIN_Init(), + * HAL_MultiProcessor_Init() to register callbacks for HAL_UART_MSPINIT_CB_ID and HAL_UART_MSPDEINIT_CB_ID + * @param huart uart handle + * @param CallbackID ID of the callback to be registered + * This parameter can be one of the following values: + * @arg @ref HAL_UART_TX_HALFCOMPLETE_CB_ID Tx Half Complete Callback ID + * @arg @ref HAL_UART_TX_COMPLETE_CB_ID Tx Complete Callback ID + * @arg @ref HAL_UART_RX_HALFCOMPLETE_CB_ID Rx Half Complete Callback ID + * @arg @ref HAL_UART_RX_COMPLETE_CB_ID Rx Complete Callback ID + * @arg @ref HAL_UART_ERROR_CB_ID Error Callback ID + * @arg @ref HAL_UART_ABORT_COMPLETE_CB_ID Abort Complete Callback ID + * @arg @ref HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID Abort Transmit Complete Callback ID + * @arg @ref HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID Abort Receive Complete Callback ID + * @arg @ref HAL_UART_MSPINIT_CB_ID MspInit Callback ID + * @arg @ref HAL_UART_MSPDEINIT_CB_ID MspDeInit Callback ID + * @param pCallback pointer to the Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, + pUART_CallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + if (huart->gState == HAL_UART_STATE_READY) + { + switch (CallbackID) + { + case HAL_UART_TX_HALFCOMPLETE_CB_ID : + huart->TxHalfCpltCallback = pCallback; + break; + + case HAL_UART_TX_COMPLETE_CB_ID : + huart->TxCpltCallback = pCallback; + break; + + case HAL_UART_RX_HALFCOMPLETE_CB_ID : + huart->RxHalfCpltCallback = pCallback; + break; + + case HAL_UART_RX_COMPLETE_CB_ID : + huart->RxCpltCallback = pCallback; + break; + + case HAL_UART_ERROR_CB_ID : + huart->ErrorCallback = pCallback; + break; + + case HAL_UART_ABORT_COMPLETE_CB_ID : + huart->AbortCpltCallback = pCallback; + break; + + case HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID : + huart->AbortTransmitCpltCallback = pCallback; + break; + + case HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID : + huart->AbortReceiveCpltCallback = pCallback; + break; + + case HAL_UART_MSPINIT_CB_ID : + huart->MspInitCallback = pCallback; + break; + + case HAL_UART_MSPDEINIT_CB_ID : + huart->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (huart->gState == HAL_UART_STATE_RESET) + { + switch (CallbackID) + { + case HAL_UART_MSPINIT_CB_ID : + huart->MspInitCallback = pCallback; + break; + + case HAL_UART_MSPDEINIT_CB_ID : + huart->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + return status; +} + +/** + * @brief Unregister an UART Callback + * UART callaback is redirected to the weak predefined callback + * @note The HAL_UART_UnRegisterCallback() may be called before HAL_UART_Init(), HAL_HalfDuplex_Init(), + * HAL_LIN_Init(), HAL_MultiProcessor_Init() to un-register callbacks for HAL_UART_MSPINIT_CB_ID + * and HAL_UART_MSPDEINIT_CB_ID + * @param huart uart handle + * @param CallbackID ID of the callback to be unregistered + * This parameter can be one of the following values: + * @arg @ref HAL_UART_TX_HALFCOMPLETE_CB_ID Tx Half Complete Callback ID + * @arg @ref HAL_UART_TX_COMPLETE_CB_ID Tx Complete Callback ID + * @arg @ref HAL_UART_RX_HALFCOMPLETE_CB_ID Rx Half Complete Callback ID + * @arg @ref HAL_UART_RX_COMPLETE_CB_ID Rx Complete Callback ID + * @arg @ref HAL_UART_ERROR_CB_ID Error Callback ID + * @arg @ref HAL_UART_ABORT_COMPLETE_CB_ID Abort Complete Callback ID + * @arg @ref HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID Abort Transmit Complete Callback ID + * @arg @ref HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID Abort Receive Complete Callback ID + * @arg @ref HAL_UART_MSPINIT_CB_ID MspInit Callback ID + * @arg @ref HAL_UART_MSPDEINIT_CB_ID MspDeInit Callback ID + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (HAL_UART_STATE_READY == huart->gState) + { + switch (CallbackID) + { + case HAL_UART_TX_HALFCOMPLETE_CB_ID : + huart->TxHalfCpltCallback = HAL_UART_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */ + break; + + case HAL_UART_TX_COMPLETE_CB_ID : + huart->TxCpltCallback = HAL_UART_TxCpltCallback; /* Legacy weak TxCpltCallback */ + break; + + case HAL_UART_RX_HALFCOMPLETE_CB_ID : + huart->RxHalfCpltCallback = HAL_UART_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */ + break; + + case HAL_UART_RX_COMPLETE_CB_ID : + huart->RxCpltCallback = HAL_UART_RxCpltCallback; /* Legacy weak RxCpltCallback */ + break; + + case HAL_UART_ERROR_CB_ID : + huart->ErrorCallback = HAL_UART_ErrorCallback; /* Legacy weak ErrorCallback */ + break; + + case HAL_UART_ABORT_COMPLETE_CB_ID : + huart->AbortCpltCallback = HAL_UART_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ + break; + + case HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID : + huart->AbortTransmitCpltCallback = HAL_UART_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */ + break; + + case HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID : + huart->AbortReceiveCpltCallback = HAL_UART_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */ + break; + + case HAL_UART_MSPINIT_CB_ID : + huart->MspInitCallback = HAL_UART_MspInit; /* Legacy weak MspInitCallback */ + break; + + case HAL_UART_MSPDEINIT_CB_ID : + huart->MspDeInitCallback = HAL_UART_MspDeInit; /* Legacy weak MspDeInitCallback */ + break; + + default : + /* Update the error code */ + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (HAL_UART_STATE_RESET == huart->gState) + { + switch (CallbackID) + { + case HAL_UART_MSPINIT_CB_ID : + huart->MspInitCallback = HAL_UART_MspInit; + break; + + case HAL_UART_MSPDEINIT_CB_ID : + huart->MspDeInitCallback = HAL_UART_MspDeInit; + break; + + default : + /* Update the error code */ + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + return status; +} + +/** + * @brief Register a User UART Rx Event Callback + * To be used instead of the weak predefined callback + * @param huart Uart handle + * @param pCallback Pointer to the Rx Event Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_RegisterRxEventCallback(UART_HandleTypeDef *huart, pUART_RxEventCallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(huart); + + if (huart->gState == HAL_UART_STATE_READY) + { + huart->RxEventCallback = pCallback; + } + else + { + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(huart); + + return status; +} + +/** + * @brief UnRegister the UART Rx Event Callback + * UART Rx Event Callback is redirected to the weak HAL_UARTEx_RxEventCallback() predefined callback + * @param huart Uart handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_UnRegisterRxEventCallback(UART_HandleTypeDef *huart) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(huart); + + if (huart->gState == HAL_UART_STATE_READY) + { + huart->RxEventCallback = HAL_UARTEx_RxEventCallback; /* Legacy weak UART Rx Event Callback */ + } + else + { + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(huart); + return status; +} +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @defgroup UART_Exported_Functions_Group2 IO operation functions + * @brief UART Transmit and Receive functions + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + This subsection provides a set of functions allowing to manage the UART asynchronous + and Half duplex data transfers. + + (#) There are two modes of transfer: + (+) Blocking mode: The communication is performed in polling mode. + The HAL status of all data processing is returned by the same function + after finishing transfer. + (+) Non-Blocking mode: The communication is performed using Interrupts + or DMA, these API's return the HAL status. + The end of the data processing will be indicated through the + dedicated UART IRQ when using Interrupt mode or the DMA IRQ when + using DMA mode. + The HAL_UART_TxCpltCallback(), HAL_UART_RxCpltCallback() user callbacks + will be executed respectively at the end of the transmit or receive process + The HAL_UART_ErrorCallback()user callback will be executed when a communication error is detected. + + (#) Blocking mode API's are : + (+) HAL_UART_Transmit() + (+) HAL_UART_Receive() + + (#) Non-Blocking mode API's with Interrupt are : + (+) HAL_UART_Transmit_IT() + (+) HAL_UART_Receive_IT() + (+) HAL_UART_IRQHandler() + + (#) Non-Blocking mode API's with DMA are : + (+) HAL_UART_Transmit_DMA() + (+) HAL_UART_Receive_DMA() + (+) HAL_UART_DMAPause() + (+) HAL_UART_DMAResume() + (+) HAL_UART_DMAStop() + + (#) A set of Transfer Complete Callbacks are provided in Non_Blocking mode: + (+) HAL_UART_TxHalfCpltCallback() + (+) HAL_UART_TxCpltCallback() + (+) HAL_UART_RxHalfCpltCallback() + (+) HAL_UART_RxCpltCallback() + (+) HAL_UART_ErrorCallback() + + (#) Non-Blocking mode transfers could be aborted using Abort API's : + (+) HAL_UART_Abort() + (+) HAL_UART_AbortTransmit() + (+) HAL_UART_AbortReceive() + (+) HAL_UART_Abort_IT() + (+) HAL_UART_AbortTransmit_IT() + (+) HAL_UART_AbortReceive_IT() + + (#) For Abort services based on interrupts (HAL_UART_Abortxxx_IT), a set of Abort Complete Callbacks are provided: + (+) HAL_UART_AbortCpltCallback() + (+) HAL_UART_AbortTransmitCpltCallback() + (+) HAL_UART_AbortReceiveCpltCallback() + + (#) A Rx Event Reception Callback (Rx event notification) is available for Non_Blocking modes of enhanced reception services: + (+) HAL_UARTEx_RxEventCallback() + + (#) In Non-Blocking mode transfers, possible errors are split into 2 categories. + Errors are handled as follows : + (+) Error is considered as Recoverable and non blocking : Transfer could go till end, but error severity is + to be evaluated by user : this concerns Frame Error, Parity Error or Noise Error in Interrupt mode reception . + Received character is then retrieved and stored in Rx buffer, Error code is set to allow user to identify error type, + and HAL_UART_ErrorCallback() user callback is executed. Transfer is kept ongoing on UART side. + If user wants to abort it, Abort services should be called by user. + (+) Error is considered as Blocking : Transfer could not be completed properly and is aborted. + This concerns Overrun Error In Interrupt mode reception and all errors in DMA mode. + Error code is set to allow user to identify error type, and HAL_UART_ErrorCallback() user callback is executed. + + -@- In the Half duplex communication, it is forbidden to run the transmit + and receive process in parallel, the UART state HAL_UART_STATE_BUSY_TX_RX can't be useful. + +@endverbatim + * @{ + */ + +/** + * @brief Sends an amount of data in blocking mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pData. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be sent + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ + const uint8_t *pdata8bits; + const uint16_t *pdata16bits; + uint32_t tickstart = 0U; + + /* Check that a Tx process is not already ongoing */ + if (huart->gState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->gState = HAL_UART_STATE_BUSY_TX; + + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + + huart->TxXferSize = Size; + huart->TxXferCount = Size; + + /* In case of 9bits/No Parity transfer, pData needs to be handled as a uint16_t pointer */ + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + pdata8bits = NULL; + pdata16bits = (const uint16_t *) pData; + } + else + { + pdata8bits = pData; + pdata16bits = NULL; + } + + while (huart->TxXferCount > 0U) + { + if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) + { + huart->gState = HAL_UART_STATE_READY; + + return HAL_TIMEOUT; + } + if (pdata8bits == NULL) + { + huart->Instance->DR = (uint16_t)(*pdata16bits & 0x01FFU); + pdata16bits++; + } + else + { + huart->Instance->DR = (uint8_t)(*pdata8bits & 0xFFU); + pdata8bits++; + } + huart->TxXferCount--; + } + + if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK) + { + huart->gState = HAL_UART_STATE_READY; + + return HAL_TIMEOUT; + } + + /* At end of Tx process, restore huart->gState to Ready */ + huart->gState = HAL_UART_STATE_READY; + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receives an amount of data in blocking mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pData. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ + uint8_t *pdata8bits; + uint16_t *pdata16bits; + uint32_t tickstart = 0U; + + /* Check that a Rx process is not already ongoing */ + if (huart->RxState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->RxState = HAL_UART_STATE_BUSY_RX; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + + huart->RxXferSize = Size; + huart->RxXferCount = Size; + + /* In case of 9bits/No Parity transfer, pRxData needs to be handled as a uint16_t pointer */ + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + pdata8bits = NULL; + pdata16bits = (uint16_t *) pData; + } + else + { + pdata8bits = pData; + pdata16bits = NULL; + } + + /* Check the remain data to be received */ + while (huart->RxXferCount > 0U) + { + if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK) + { + huart->RxState = HAL_UART_STATE_READY; + + return HAL_TIMEOUT; + } + if (pdata8bits == NULL) + { + *pdata16bits = (uint16_t)(huart->Instance->DR & 0x01FF); + pdata16bits++; + } + else + { + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) || ((huart->Init.WordLength == UART_WORDLENGTH_8B) && (huart->Init.Parity == UART_PARITY_NONE))) + { + *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF); + } + else + { + *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F); + } + pdata8bits++; + } + huart->RxXferCount--; + } + + /* At end of Rx process, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Sends an amount of data in non blocking mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pData. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size) +{ + /* Check that a Tx process is not already ongoing */ + if (huart->gState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + huart->pTxBuffPtr = pData; + huart->TxXferSize = Size; + huart->TxXferCount = Size; + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->gState = HAL_UART_STATE_BUSY_TX; + + /* Enable the UART Transmit data register empty Interrupt */ + __HAL_UART_ENABLE_IT(huart, UART_IT_TXE); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receives an amount of data in non blocking mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pData. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) +{ + /* Check that a Rx process is not already ongoing */ + if (huart->RxState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Set Reception type to Standard reception */ + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + return (UART_Start_Receive_IT(huart, pData, Size)); + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Sends an amount of data in DMA mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pData. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size) +{ + const uint32_t *tmp; + + /* Check that a Tx process is not already ongoing */ + if (huart->gState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + huart->pTxBuffPtr = pData; + huart->TxXferSize = Size; + huart->TxXferCount = Size; + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->gState = HAL_UART_STATE_BUSY_TX; + + /* Set the UART DMA transfer complete callback */ + huart->hdmatx->XferCpltCallback = UART_DMATransmitCplt; + + /* Set the UART DMA Half transfer complete callback */ + huart->hdmatx->XferHalfCpltCallback = UART_DMATxHalfCplt; + + /* Set the DMA error callback */ + huart->hdmatx->XferErrorCallback = UART_DMAError; + + /* Set the DMA abort callback */ + huart->hdmatx->XferAbortCallback = NULL; + + /* Enable the UART transmit DMA stream */ + tmp = (const uint32_t *)&pData; + if (HAL_DMA_Start_IT(huart->hdmatx, *(const uint32_t *)tmp, (uint32_t)&huart->Instance->DR, Size) != HAL_OK) + { + /* Set error code to DMA */ + huart->ErrorCode = HAL_UART_ERROR_DMA; + + /* Restore huart->gState to ready */ + huart->gState = HAL_UART_STATE_READY; + + return HAL_ERROR; + } + /* Clear the TC flag in the SR register by writing 0 to it */ + __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_TC); + + /* Enable the DMA transfer for transmit request by setting the DMAT bit + in the UART CR3 register */ + ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_DMAT); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receives an amount of data in DMA mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pData. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. + * @note When the UART parity is enabled (PCE = 1) the received data contains the parity bit. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) +{ + /* Check that a Rx process is not already ongoing */ + if (huart->RxState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Set Reception type to Standard reception */ + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + return (UART_Start_Receive_DMA(huart, pData, Size)); + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Pauses the DMA Transfer. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart) +{ + uint32_t dmarequest = 0x00U; + + dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT); + if ((huart->gState == HAL_UART_STATE_BUSY_TX) && dmarequest) + { + /* Disable the UART DMA Tx request */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); + } + + dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR); + if ((huart->RxState == HAL_UART_STATE_BUSY_RX) && dmarequest) + { + /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* Disable the UART DMA Rx request */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + } + + return HAL_OK; +} + +/** + * @brief Resumes the DMA Transfer. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart) +{ + + if (huart->gState == HAL_UART_STATE_BUSY_TX) + { + /* Enable the UART DMA Tx request */ + ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_DMAT); + } + + if (huart->RxState == HAL_UART_STATE_BUSY_RX) + { + /* Clear the Overrun flag before resuming the Rx transfer*/ + __HAL_UART_CLEAR_OREFLAG(huart); + + /* Re-enable PE and ERR (Frame error, noise error, overrun error) interrupts */ + if (huart->Init.Parity != UART_PARITY_NONE) + { + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_PEIE); + } + ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* Enable the UART DMA Rx request */ + ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_DMAR); + } + + return HAL_OK; +} + +/** + * @brief Stops the DMA Transfer. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart) +{ + uint32_t dmarequest = 0x00U; + /* The Lock is not implemented on this API to allow the user application + to call the HAL UART API under callbacks HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback(): + when calling HAL_DMA_Abort() API the DMA TX/RX Transfer complete interrupt is generated + and the correspond call back is executed HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback() + */ + + /* Stop UART DMA Tx request if ongoing */ + dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT); + if ((huart->gState == HAL_UART_STATE_BUSY_TX) && dmarequest) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); + + /* Abort the UART DMA Tx stream */ + if (huart->hdmatx != NULL) + { + HAL_DMA_Abort(huart->hdmatx); + } + UART_EndTxTransfer(huart); + } + + /* Stop UART DMA Rx request if ongoing */ + dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR); + if ((huart->RxState == HAL_UART_STATE_BUSY_RX) && dmarequest) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* Abort the UART DMA Rx stream */ + if (huart->hdmarx != NULL) + { + HAL_DMA_Abort(huart->hdmarx); + } + UART_EndRxTransfer(huart); + } + + return HAL_OK; +} + +/** + * @brief Receive an amount of data in blocking mode till either the expected number of data is received or an IDLE event occurs. + * @note HAL_OK is returned if reception is completed (expected number of data has been received) + * or if reception is stopped after IDLE event (less than the expected number of data has been received) + * In this case, RxLen output parameter indicates number of data available in reception buffer. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M = 01), + * the received data is handled as a set of uint16_t. In this case, Size must indicate the number + * of uint16_t available through pData. + * @param huart UART handle. + * @param pData Pointer to data buffer (uint8_t or uint16_t data elements). + * @param Size Amount of data elements (uint8_t or uint16_t) to be received. + * @param RxLen Number of data elements finally received (could be lower than Size, in case reception ends on IDLE event) + * @param Timeout Timeout duration expressed in ms (covers the whole reception sequence). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint16_t *RxLen, + uint32_t Timeout) +{ + uint8_t *pdata8bits; + uint16_t *pdata16bits; + uint32_t tickstart; + + /* Check that a Rx process is not already ongoing */ + if (huart->RxState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->RxState = HAL_UART_STATE_BUSY_RX; + huart->ReceptionType = HAL_UART_RECEPTION_TOIDLE; + huart->RxEventType = HAL_UART_RXEVENT_TC; + + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + + huart->RxXferSize = Size; + huart->RxXferCount = Size; + + /* In case of 9bits/No Parity transfer, pRxData needs to be handled as a uint16_t pointer */ + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + pdata8bits = NULL; + pdata16bits = (uint16_t *) pData; + } + else + { + pdata8bits = pData; + pdata16bits = NULL; + } + + /* Initialize output number of received elements */ + *RxLen = 0U; + + /* as long as data have to be received */ + while (huart->RxXferCount > 0U) + { + /* Check if IDLE flag is set */ + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE)) + { + /* Clear IDLE flag in ISR */ + __HAL_UART_CLEAR_IDLEFLAG(huart); + + /* If Set, but no data ever received, clear flag without exiting loop */ + /* If Set, and data has already been received, this means Idle Event is valid : End reception */ + if (*RxLen > 0U) + { + huart->RxEventType = HAL_UART_RXEVENT_IDLE; + huart->RxState = HAL_UART_STATE_READY; + + return HAL_OK; + } + } + + /* Check if RXNE flag is set */ + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE)) + { + if (pdata8bits == NULL) + { + *pdata16bits = (uint16_t)(huart->Instance->DR & (uint16_t)0x01FF); + pdata16bits++; + } + else + { + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) || ((huart->Init.WordLength == UART_WORDLENGTH_8B) && (huart->Init.Parity == UART_PARITY_NONE))) + { + *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF); + } + else + { + *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F); + } + + pdata8bits++; + } + /* Increment number of received elements */ + *RxLen += 1U; + huart->RxXferCount--; + } + + /* Check for the Timeout */ + if (Timeout != HAL_MAX_DELAY) + { + if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) + { + huart->RxState = HAL_UART_STATE_READY; + + return HAL_TIMEOUT; + } + } + } + + /* Set number of received elements in output parameter : RxLen */ + *RxLen = huart->RxXferSize - huart->RxXferCount; + /* At end of Rx process, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receive an amount of data in interrupt mode till either the expected number of data is received or an IDLE event occurs. + * @note Reception is initiated by this function call. Further progress of reception is achieved thanks + * to UART interrupts raised by RXNE and IDLE events. Callback is called at end of reception indicating + * number of received data elements. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M = 01), + * the received data is handled as a set of uint16_t. In this case, Size must indicate the number + * of uint16_t available through pData. + * @param huart UART handle. + * @param pData Pointer to data buffer (uint8_t or uint16_t data elements). + * @param Size Amount of data elements (uint8_t or uint16_t) to be received. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) +{ + HAL_StatusTypeDef status; + + /* Check that a Rx process is not already ongoing */ + if (huart->RxState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Set Reception type to reception till IDLE Event*/ + huart->ReceptionType = HAL_UART_RECEPTION_TOIDLE; + huart->RxEventType = HAL_UART_RXEVENT_TC; + + status = UART_Start_Receive_IT(huart, pData, Size); + + /* Check Rx process has been successfully started */ + if (status == HAL_OK) + { + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + __HAL_UART_CLEAR_IDLEFLAG(huart); + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + } + else + { + /* In case of errors already pending when reception is started, + Interrupts may have already been raised and lead to reception abortion. + (Overrun error for instance). + In such case Reception Type has been reset to HAL_UART_RECEPTION_STANDARD. */ + status = HAL_ERROR; + } + } + + return status; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receive an amount of data in DMA mode till either the expected number of data is received or an IDLE event occurs. + * @note Reception is initiated by this function call. Further progress of reception is achieved thanks + * to DMA services, transferring automatically received data elements in user reception buffer and + * calling registered callbacks at half/end of reception. UART IDLE events are also used to consider + * reception phase as ended. In all cases, callback execution will indicate number of received data elements. + * @note When the UART parity is enabled (PCE = 1), the received data contain + * the parity bit (MSB position). + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M = 01), + * the received data is handled as a set of uint16_t. In this case, Size must indicate the number + * of uint16_t available through pData. + * @param huart UART handle. + * @param pData Pointer to data buffer (uint8_t or uint16_t data elements). + * @param Size Amount of data elements (uint8_t or uint16_t) to be received. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) +{ + HAL_StatusTypeDef status; + + /* Check that a Rx process is not already ongoing */ + if (huart->RxState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Set Reception type to reception till IDLE Event*/ + huart->ReceptionType = HAL_UART_RECEPTION_TOIDLE; + huart->RxEventType = HAL_UART_RXEVENT_TC; + + status = UART_Start_Receive_DMA(huart, pData, Size); + + /* Check Rx process has been successfully started */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + __HAL_UART_CLEAR_IDLEFLAG(huart); + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + } + else + { + /* In case of errors already pending when reception is started, + Interrupts may have already been raised and lead to reception abortion. + (Overrun error for instance). + In such case Reception Type has been reset to HAL_UART_RECEPTION_STANDARD. */ + status = HAL_ERROR; + } + + return status; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Provide Rx Event type that has lead to RxEvent callback execution. + * @note When HAL_UARTEx_ReceiveToIdle_IT() or HAL_UARTEx_ReceiveToIdle_DMA() API are called, progress + * of reception process is provided to application through calls of Rx Event callback (either default one + * HAL_UARTEx_RxEventCallback() or user registered one). As several types of events could occur (IDLE event, + * Half Transfer, or Transfer Complete), this function allows to retrieve the Rx Event type that has lead + * to Rx Event callback execution. + * @note This function is expected to be called within the user implementation of Rx Event Callback, + * in order to provide the accurate value : + * In Interrupt Mode : + * - HAL_UART_RXEVENT_TC : when Reception has been completed (expected nb of data has been received) + * - HAL_UART_RXEVENT_IDLE : when Idle event occurred prior reception has been completed (nb of + * received data is lower than expected one) + * In DMA Mode : + * - HAL_UART_RXEVENT_TC : when Reception has been completed (expected nb of data has been received) + * - HAL_UART_RXEVENT_HT : when half of expected nb of data has been received + * - HAL_UART_RXEVENT_IDLE : when Idle event occurred prior reception has been completed (nb of + * received data is lower than expected one). + * In DMA mode, RxEvent callback could be called several times; + * When DMA is configured in Normal Mode, HT event does not stop Reception process; + * When DMA is configured in Circular Mode, HT, TC or IDLE events don't stop Reception process; + * @param huart UART handle. + * @retval Rx Event Type (returned value will be a value of @ref UART_RxEvent_Type_Values) + */ +HAL_UART_RxEventTypeTypeDef HAL_UARTEx_GetRxEventType(UART_HandleTypeDef *huart) +{ + /* Return Rx Event type value, as stored in UART handle */ + return(huart->RxEventType); +} + +/** + * @brief Abort ongoing transfers (blocking mode). + * @param huart UART handle. + * @note This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable UART Interrupts (Tx and Rx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) + * - Set handle State to READY + * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart) +{ + /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE)); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* If Reception till IDLE event was ongoing, disable IDLEIE interrupt */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_IDLEIE)); + } + + /* Disable the UART DMA Tx request if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); + + /* Abort the UART DMA Tx stream: use blocking DMA Abort API (no callback) */ + if (huart->hdmatx != NULL) + { + /* Set the UART DMA Abort callback to Null. + No call back execution at end of DMA abort procedure */ + huart->hdmatx->XferAbortCallback = NULL; + + if (HAL_DMA_Abort(huart->hdmatx) != HAL_OK) + { + if (HAL_DMA_GetError(huart->hdmatx) == HAL_DMA_ERROR_TIMEOUT) + { + /* Set error code to DMA */ + huart->ErrorCode = HAL_UART_ERROR_DMA; + + return HAL_TIMEOUT; + } + } + } + } + + /* Disable the UART DMA Rx request if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* Abort the UART DMA Rx stream: use blocking DMA Abort API (no callback) */ + if (huart->hdmarx != NULL) + { + /* Set the UART DMA Abort callback to Null. + No call back execution at end of DMA abort procedure */ + huart->hdmarx->XferAbortCallback = NULL; + + if (HAL_DMA_Abort(huart->hdmarx) != HAL_OK) + { + if (HAL_DMA_GetError(huart->hdmarx) == HAL_DMA_ERROR_TIMEOUT) + { + /* Set error code to DMA */ + huart->ErrorCode = HAL_UART_ERROR_DMA; + + return HAL_TIMEOUT; + } + } + } + } + + /* Reset Tx and Rx transfer counters */ + huart->TxXferCount = 0x00U; + huart->RxXferCount = 0x00U; + + /* Reset ErrorCode */ + huart->ErrorCode = HAL_UART_ERROR_NONE; + + /* Restore huart->RxState and huart->gState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->gState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + return HAL_OK; +} + +/** + * @brief Abort ongoing Transmit transfer (blocking mode). + * @param huart UART handle. + * @note This procedure could be used for aborting any ongoing Tx transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable UART Interrupts (Tx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) + * - Set handle State to READY + * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart) +{ + /* Disable TXEIE and TCIE interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE)); + + /* Disable the UART DMA Tx request if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); + + /* Abort the UART DMA Tx stream : use blocking DMA Abort API (no callback) */ + if (huart->hdmatx != NULL) + { + /* Set the UART DMA Abort callback to Null. + No call back execution at end of DMA abort procedure */ + huart->hdmatx->XferAbortCallback = NULL; + + if (HAL_DMA_Abort(huart->hdmatx) != HAL_OK) + { + if (HAL_DMA_GetError(huart->hdmatx) == HAL_DMA_ERROR_TIMEOUT) + { + /* Set error code to DMA */ + huart->ErrorCode = HAL_UART_ERROR_DMA; + + return HAL_TIMEOUT; + } + } + } + } + + /* Reset Tx transfer counter */ + huart->TxXferCount = 0x00U; + + /* Restore huart->gState to Ready */ + huart->gState = HAL_UART_STATE_READY; + + return HAL_OK; +} + +/** + * @brief Abort ongoing Receive transfer (blocking mode). + * @param huart UART handle. + * @note This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable UART Interrupts (Rx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) + * - Set handle State to READY + * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart) +{ + /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE)); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* If Reception till IDLE event was ongoing, disable IDLEIE interrupt */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_IDLEIE)); + } + + /* Disable the UART DMA Rx request if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* Abort the UART DMA Rx stream : use blocking DMA Abort API (no callback) */ + if (huart->hdmarx != NULL) + { + /* Set the UART DMA Abort callback to Null. + No call back execution at end of DMA abort procedure */ + huart->hdmarx->XferAbortCallback = NULL; + + if (HAL_DMA_Abort(huart->hdmarx) != HAL_OK) + { + if (HAL_DMA_GetError(huart->hdmarx) == HAL_DMA_ERROR_TIMEOUT) + { + /* Set error code to DMA */ + huart->ErrorCode = HAL_UART_ERROR_DMA; + + return HAL_TIMEOUT; + } + } + } + } + + /* Reset Rx transfer counter */ + huart->RxXferCount = 0x00U; + + /* Restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + return HAL_OK; +} + +/** + * @brief Abort ongoing transfers (Interrupt mode). + * @param huart UART handle. + * @note This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable UART Interrupts (Tx and Rx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) + * - Set handle State to READY + * - At abort completion, call user abort complete callback + * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be + * considered as completed only when user abort complete callback is executed (not when exiting function). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart) +{ + uint32_t AbortCplt = 0x01U; + + /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE)); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* If Reception till IDLE event was ongoing, disable IDLEIE interrupt */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_IDLEIE)); + } + + /* If DMA Tx and/or DMA Rx Handles are associated to UART Handle, DMA Abort complete callbacks should be initialised + before any call to DMA Abort functions */ + /* DMA Tx Handle is valid */ + if (huart->hdmatx != NULL) + { + /* Set DMA Abort Complete callback if UART DMA Tx request if enabled. + Otherwise, set it to NULL */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) + { + huart->hdmatx->XferAbortCallback = UART_DMATxAbortCallback; + } + else + { + huart->hdmatx->XferAbortCallback = NULL; + } + } + /* DMA Rx Handle is valid */ + if (huart->hdmarx != NULL) + { + /* Set DMA Abort Complete callback if UART DMA Rx request if enabled. + Otherwise, set it to NULL */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) + { + huart->hdmarx->XferAbortCallback = UART_DMARxAbortCallback; + } + else + { + huart->hdmarx->XferAbortCallback = NULL; + } + } + + /* Disable the UART DMA Tx request if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) + { + /* Disable DMA Tx at UART level */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); + + /* Abort the UART DMA Tx stream : use non blocking DMA Abort API (callback) */ + if (huart->hdmatx != NULL) + { + /* UART Tx DMA Abort callback has already been initialised : + will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */ + + /* Abort DMA TX */ + if (HAL_DMA_Abort_IT(huart->hdmatx) != HAL_OK) + { + huart->hdmatx->XferAbortCallback = NULL; + } + else + { + AbortCplt = 0x00U; + } + } + } + + /* Disable the UART DMA Rx request if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* Abort the UART DMA Rx stream : use non blocking DMA Abort API (callback) */ + if (huart->hdmarx != NULL) + { + /* UART Rx DMA Abort callback has already been initialised : + will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */ + + /* Abort DMA RX */ + if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK) + { + huart->hdmarx->XferAbortCallback = NULL; + AbortCplt = 0x01U; + } + else + { + AbortCplt = 0x00U; + } + } + } + + /* if no DMA abort complete callback execution is required => call user Abort Complete callback */ + if (AbortCplt == 0x01U) + { + /* Reset Tx and Rx transfer counters */ + huart->TxXferCount = 0x00U; + huart->RxXferCount = 0x00U; + + /* Reset ErrorCode */ + huart->ErrorCode = HAL_UART_ERROR_NONE; + + /* Restore huart->gState and huart->RxState to Ready */ + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort complete callback */ + huart->AbortCpltCallback(huart); +#else + /* Call legacy weak Abort complete callback */ + HAL_UART_AbortCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + + return HAL_OK; +} + +/** + * @brief Abort ongoing Transmit transfer (Interrupt mode). + * @param huart UART handle. + * @note This procedure could be used for aborting any ongoing Tx transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable UART Interrupts (Tx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) + * - Set handle State to READY + * - At abort completion, call user abort complete callback + * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be + * considered as completed only when user abort complete callback is executed (not when exiting function). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart) +{ + /* Disable TXEIE and TCIE interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE)); + + /* Disable the UART DMA Tx request if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); + + /* Abort the UART DMA Tx stream : use blocking DMA Abort API (no callback) */ + if (huart->hdmatx != NULL) + { + /* Set the UART DMA Abort callback : + will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */ + huart->hdmatx->XferAbortCallback = UART_DMATxOnlyAbortCallback; + + /* Abort DMA TX */ + if (HAL_DMA_Abort_IT(huart->hdmatx) != HAL_OK) + { + /* Call Directly huart->hdmatx->XferAbortCallback function in case of error */ + huart->hdmatx->XferAbortCallback(huart->hdmatx); + } + } + else + { + /* Reset Tx transfer counter */ + huart->TxXferCount = 0x00U; + + /* Restore huart->gState to Ready */ + huart->gState = HAL_UART_STATE_READY; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort Transmit Complete Callback */ + huart->AbortTransmitCpltCallback(huart); +#else + /* Call legacy weak Abort Transmit Complete Callback */ + HAL_UART_AbortTransmitCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + } + else + { + /* Reset Tx transfer counter */ + huart->TxXferCount = 0x00U; + + /* Restore huart->gState to Ready */ + huart->gState = HAL_UART_STATE_READY; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort Transmit Complete Callback */ + huart->AbortTransmitCpltCallback(huart); +#else + /* Call legacy weak Abort Transmit Complete Callback */ + HAL_UART_AbortTransmitCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + + return HAL_OK; +} + +/** + * @brief Abort ongoing Receive transfer (Interrupt mode). + * @param huart UART handle. + * @note This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable UART Interrupts (Rx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) + * - Set handle State to READY + * - At abort completion, call user abort complete callback + * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be + * considered as completed only when user abort complete callback is executed (not when exiting function). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart) +{ + /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE)); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* If Reception till IDLE event was ongoing, disable IDLEIE interrupt */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_IDLEIE)); + } + + /* Disable the UART DMA Rx request if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* Abort the UART DMA Rx stream : use blocking DMA Abort API (no callback) */ + if (huart->hdmarx != NULL) + { + /* Set the UART DMA Abort callback : + will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */ + huart->hdmarx->XferAbortCallback = UART_DMARxOnlyAbortCallback; + + /* Abort DMA RX */ + if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK) + { + /* Call Directly huart->hdmarx->XferAbortCallback function in case of error */ + huart->hdmarx->XferAbortCallback(huart->hdmarx); + } + } + else + { + /* Reset Rx transfer counter */ + huart->RxXferCount = 0x00U; + + /* Restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort Receive Complete Callback */ + huart->AbortReceiveCpltCallback(huart); +#else + /* Call legacy weak Abort Receive Complete Callback */ + HAL_UART_AbortReceiveCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + } + else + { + /* Reset Rx transfer counter */ + huart->RxXferCount = 0x00U; + + /* Restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort Receive Complete Callback */ + huart->AbortReceiveCpltCallback(huart); +#else + /* Call legacy weak Abort Receive Complete Callback */ + HAL_UART_AbortReceiveCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + + return HAL_OK; +} + +/** + * @brief This function handles UART interrupt request. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval None + */ +void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) +{ + uint32_t isrflags = READ_REG(huart->Instance->SR); + uint32_t cr1its = READ_REG(huart->Instance->CR1); + uint32_t cr3its = READ_REG(huart->Instance->CR3); + uint32_t errorflags = 0x00U; + uint32_t dmarequest = 0x00U; + + /* If no error occurs */ + errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE)); + if (errorflags == RESET) + { + /* UART in mode Receiver -------------------------------------------------*/ + if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET)) + { + UART_Receive_IT(huart); + return; + } + } + + /* If some errors occur */ + if ((errorflags != RESET) && (((cr3its & USART_CR3_EIE) != RESET) + || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET))) + { + /* UART parity error interrupt occurred ----------------------------------*/ + if (((isrflags & USART_SR_PE) != RESET) && ((cr1its & USART_CR1_PEIE) != RESET)) + { + huart->ErrorCode |= HAL_UART_ERROR_PE; + } + + /* UART noise error interrupt occurred -----------------------------------*/ + if (((isrflags & USART_SR_NE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET)) + { + huart->ErrorCode |= HAL_UART_ERROR_NE; + } + + /* UART frame error interrupt occurred -----------------------------------*/ + if (((isrflags & USART_SR_FE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET)) + { + huart->ErrorCode |= HAL_UART_ERROR_FE; + } + + /* UART Over-Run interrupt occurred --------------------------------------*/ + if (((isrflags & USART_SR_ORE) != RESET) && (((cr1its & USART_CR1_RXNEIE) != RESET) + || ((cr3its & USART_CR3_EIE) != RESET))) + { + huart->ErrorCode |= HAL_UART_ERROR_ORE; + } + + /* Call UART Error Call back function if need be --------------------------*/ + if (huart->ErrorCode != HAL_UART_ERROR_NONE) + { + /* UART in mode Receiver -----------------------------------------------*/ + if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET)) + { + UART_Receive_IT(huart); + } + + /* If Overrun error occurs, or if any error occurs in DMA mode reception, + consider error as blocking */ + dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR); + if (((huart->ErrorCode & HAL_UART_ERROR_ORE) != RESET) || dmarequest) + { + /* Blocking error : transfer is aborted + Set the UART state ready to be able to start again the process, + Disable Rx Interrupts, and disable Rx DMA request, if ongoing */ + UART_EndRxTransfer(huart); + + /* Disable the UART DMA Rx request if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* Abort the UART DMA Rx stream */ + if (huart->hdmarx != NULL) + { + /* Set the UART DMA Abort callback : + will lead to call HAL_UART_ErrorCallback() at end of DMA abort procedure */ + huart->hdmarx->XferAbortCallback = UART_DMAAbortOnError; + if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK) + { + /* Call Directly XferAbortCallback function in case of error */ + huart->hdmarx->XferAbortCallback(huart->hdmarx); + } + } + else + { + /* Call user error callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered error callback*/ + huart->ErrorCallback(huart); +#else + /*Call legacy weak error callback*/ + HAL_UART_ErrorCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + } + else + { + /* Call user error callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered error callback*/ + huart->ErrorCallback(huart); +#else + /*Call legacy weak error callback*/ + HAL_UART_ErrorCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + } + else + { + /* Non Blocking error : transfer could go on. + Error is notified to user through user error callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered error callback*/ + huart->ErrorCallback(huart); +#else + /*Call legacy weak error callback*/ + HAL_UART_ErrorCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + + huart->ErrorCode = HAL_UART_ERROR_NONE; + } + } + return; + } /* End if some error occurs */ + + /* Check current reception Mode : + If Reception till IDLE event has been selected : */ + if ((huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + && ((isrflags & USART_SR_IDLE) != 0U) + && ((cr1its & USART_CR1_IDLEIE) != 0U)) + { + __HAL_UART_CLEAR_IDLEFLAG(huart); + + /* Check if DMA mode is enabled in UART */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) + { + /* DMA mode enabled */ + /* Check received length : If all expected data are received, do nothing, + (DMA cplt callback will be called). + Otherwise, if at least one data has already been received, IDLE event is to be notified to user */ + uint16_t nb_remaining_rx_data = (uint16_t) __HAL_DMA_GET_COUNTER(huart->hdmarx); + if ((nb_remaining_rx_data > 0U) + && (nb_remaining_rx_data < huart->RxXferSize)) + { + /* Reception is not complete */ + huart->RxXferCount = nb_remaining_rx_data; + + /* In Normal mode, end DMA xfer and HAL UART Rx process*/ + if (huart->hdmarx->Init.Mode != DMA_CIRCULAR) + { + /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* Disable the DMA transfer for the receiver request by resetting the DMAR bit + in the UART CR3 register */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* At end of Rx process, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + + /* Last bytes received, so no need as the abort is immediate */ + (void)HAL_DMA_Abort(huart->hdmarx); + } + + /* Initialize type of RxEvent that correspond to RxEvent callback execution; + In this case, Rx Event type is Idle Event */ + huart->RxEventType = HAL_UART_RXEVENT_IDLE; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx Event callback*/ + huart->RxEventCallback(huart, (huart->RxXferSize - huart->RxXferCount)); +#else + /*Call legacy weak Rx Event callback*/ + HAL_UARTEx_RxEventCallback(huart, (huart->RxXferSize - huart->RxXferCount)); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + else + { + /* If DMA is in Circular mode, Idle event is to be reported to user + even if occurring after a Transfer Complete event from DMA */ + if (nb_remaining_rx_data == huart->RxXferSize) + { + if (huart->hdmarx->Init.Mode == DMA_CIRCULAR) + { + /* Initialize type of RxEvent that correspond to RxEvent callback execution; + In this case, Rx Event type is Idle Event */ + huart->RxEventType = HAL_UART_RXEVENT_IDLE; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx Event callback*/ + huart->RxEventCallback(huart, huart->RxXferSize); +#else + /*Call legacy weak Rx Event callback*/ + HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + } + } + } + return; + } + else + { + /* DMA mode not enabled */ + /* Check received length : If all expected data are received, do nothing. + Otherwise, if at least one data has already been received, IDLE event is to be notified to user */ + uint16_t nb_rx_data = huart->RxXferSize - huart->RxXferCount; + if ((huart->RxXferCount > 0U) + && (nb_rx_data > 0U)) + { + /* Disable the UART Parity Error Interrupt and RXNE interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE)); + + /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* Rx process is completed, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + + /* Initialize type of RxEvent that correspond to RxEvent callback execution; + In this case, Rx Event type is Idle Event */ + huart->RxEventType = HAL_UART_RXEVENT_IDLE; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx complete callback*/ + huart->RxEventCallback(huart, nb_rx_data); +#else + /*Call legacy weak Rx Event callback*/ + HAL_UARTEx_RxEventCallback(huart, nb_rx_data); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + return; + } + } + + /* UART in mode Transmitter ------------------------------------------------*/ + if (((isrflags & USART_SR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET)) + { + UART_Transmit_IT(huart); + return; + } + + /* UART in mode Transmitter end --------------------------------------------*/ + if (((isrflags & USART_SR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET)) + { + UART_EndTransmit_IT(huart); + return; + } +} + +/** + * @brief Tx Transfer completed callbacks. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval None + */ +__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + /* NOTE: This function should not be modified, when the callback is needed, + the HAL_UART_TxCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Tx Half Transfer completed callbacks. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval None + */ +__weak void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + /* NOTE: This function should not be modified, when the callback is needed, + the HAL_UART_TxHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Rx Transfer completed callbacks. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval None + */ +__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + /* NOTE: This function should not be modified, when the callback is needed, + the HAL_UART_RxCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Rx Half Transfer completed callbacks. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval None + */ +__weak void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + /* NOTE: This function should not be modified, when the callback is needed, + the HAL_UART_RxHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief UART error callbacks. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval None + */ +__weak void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + /* NOTE: This function should not be modified, when the callback is needed, + the HAL_UART_ErrorCallback could be implemented in the user file + */ +} + +/** + * @brief UART Abort Complete callback. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UART_AbortCpltCallback can be implemented in the user file. + */ +} + +/** + * @brief UART Abort Complete callback. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UART_AbortTransmitCpltCallback can be implemented in the user file. + */ +} + +/** + * @brief UART Abort Receive Complete callback. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UART_AbortReceiveCpltCallback can be implemented in the user file. + */ +} + +/** + * @brief Reception Event Callback (Rx event notification called after use of advanced reception service). + * @param huart UART handle + * @param Size Number of data available in application reception buffer (indicates a position in + * reception buffer until which, data are available) + * @retval None + */ +__weak void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + UNUSED(Size); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UARTEx_RxEventCallback can be implemented in the user file. + */ +} + +/** + * @} + */ + +/** @defgroup UART_Exported_Functions_Group3 Peripheral Control functions + * @brief UART control functions + * +@verbatim + ============================================================================== + ##### Peripheral Control functions ##### + ============================================================================== + [..] + This subsection provides a set of functions allowing to control the UART: + (+) HAL_LIN_SendBreak() API can be helpful to transmit the break character. + (+) HAL_MultiProcessor_EnterMuteMode() API can be helpful to enter the UART in mute mode. + (+) HAL_MultiProcessor_ExitMuteMode() API can be helpful to exit the UART mute mode by software. + (+) HAL_HalfDuplex_EnableTransmitter() API to enable the UART transmitter and disables the UART receiver in Half Duplex mode + (+) HAL_HalfDuplex_EnableReceiver() API to enable the UART receiver and disables the UART transmitter in Half Duplex mode + +@endverbatim + * @{ + */ + +/** + * @brief Transmits break characters. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart) +{ + /* Check the parameters */ + assert_param(IS_UART_INSTANCE(huart->Instance)); + + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Send break characters */ + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_SBK); + + huart->gState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief Enters the UART in mute mode. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart) +{ + /* Check the parameters */ + assert_param(IS_UART_INSTANCE(huart->Instance)); + + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Enable the USART mute mode by setting the RWU bit in the CR1 register */ + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_RWU); + + huart->gState = HAL_UART_STATE_READY; + huart->RxEventType = HAL_UART_RXEVENT_TC; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief Exits the UART mute mode: wake up software. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MultiProcessor_ExitMuteMode(UART_HandleTypeDef *huart) +{ + /* Check the parameters */ + assert_param(IS_UART_INSTANCE(huart->Instance)); + + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Disable the USART mute mode by clearing the RWU bit in the CR1 register */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_RWU); + + huart->gState = HAL_UART_STATE_READY; + huart->RxEventType = HAL_UART_RXEVENT_TC; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief Enables the UART transmitter and disables the UART receiver. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart) +{ + uint32_t tmpreg = 0x00U; + + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /*-------------------------- USART CR1 Configuration -----------------------*/ + tmpreg = huart->Instance->CR1; + + /* Clear TE and RE bits */ + tmpreg &= (uint32_t)~((uint32_t)(USART_CR1_TE | USART_CR1_RE)); + + /* Enable the USART's transmit interface by setting the TE bit in the USART CR1 register */ + tmpreg |= (uint32_t)USART_CR1_TE; + + /* Write to USART CR1 */ + WRITE_REG(huart->Instance->CR1, (uint32_t)tmpreg); + + huart->gState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief Enables the UART receiver and disables the UART transmitter. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart) +{ + uint32_t tmpreg = 0x00U; + + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /*-------------------------- USART CR1 Configuration -----------------------*/ + tmpreg = huart->Instance->CR1; + + /* Clear TE and RE bits */ + tmpreg &= (uint32_t)~((uint32_t)(USART_CR1_TE | USART_CR1_RE)); + + /* Enable the USART's receive interface by setting the RE bit in the USART CR1 register */ + tmpreg |= (uint32_t)USART_CR1_RE; + + /* Write to USART CR1 */ + WRITE_REG(huart->Instance->CR1, (uint32_t)tmpreg); + + huart->gState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup UART_Exported_Functions_Group4 Peripheral State and Errors functions + * @brief UART State and Errors functions + * +@verbatim + ============================================================================== + ##### Peripheral State and Errors functions ##### + ============================================================================== + [..] + This subsection provides a set of functions allowing to return the State of + UART communication process, return Peripheral Errors occurred during communication + process + (+) HAL_UART_GetState() API can be helpful to check in run-time the state of the UART peripheral. + (+) HAL_UART_GetError() check in run-time errors that could be occurred during communication. + +@endverbatim + * @{ + */ + +/** + * @brief Returns the UART state. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL state + */ +HAL_UART_StateTypeDef HAL_UART_GetState(const UART_HandleTypeDef *huart) +{ + uint32_t temp1 = 0x00U, temp2 = 0x00U; + temp1 = huart->gState; + temp2 = huart->RxState; + + return (HAL_UART_StateTypeDef)(temp1 | temp2); +} + +/** + * @brief Return the UART error code + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART. + * @retval UART Error Code + */ +uint32_t HAL_UART_GetError(const UART_HandleTypeDef *huart) +{ + return huart->ErrorCode; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup UART_Private_Functions UART Private Functions + * @{ + */ + +/** + * @brief Initialize the callbacks to their default values. + * @param huart UART handle. + * @retval none + */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) +void UART_InitCallbacksToDefault(UART_HandleTypeDef *huart) +{ + /* Init the UART Callback settings */ + huart->TxHalfCpltCallback = HAL_UART_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */ + huart->TxCpltCallback = HAL_UART_TxCpltCallback; /* Legacy weak TxCpltCallback */ + huart->RxHalfCpltCallback = HAL_UART_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */ + huart->RxCpltCallback = HAL_UART_RxCpltCallback; /* Legacy weak RxCpltCallback */ + huart->ErrorCallback = HAL_UART_ErrorCallback; /* Legacy weak ErrorCallback */ + huart->AbortCpltCallback = HAL_UART_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ + huart->AbortTransmitCpltCallback = HAL_UART_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */ + huart->AbortReceiveCpltCallback = HAL_UART_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */ + huart->RxEventCallback = HAL_UARTEx_RxEventCallback; /* Legacy weak RxEventCallback */ + +} +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + +/** + * @brief DMA UART transmit process complete callback. + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + /* DMA Normal mode*/ + if ((hdma->Instance->CR & DMA_SxCR_CIRC) == 0U) + { + huart->TxXferCount = 0x00U; + + /* Disable the DMA transfer for transmit request by setting the DMAT bit + in the UART CR3 register */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); + + /* Enable the UART Transmit Complete Interrupt */ + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_TCIE); + + } + /* DMA Circular mode */ + else + { +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Tx complete callback*/ + huart->TxCpltCallback(huart); +#else + /*Call legacy weak Tx complete callback*/ + HAL_UART_TxCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } +} + +/** + * @brief DMA UART transmit process half complete callback + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void UART_DMATxHalfCplt(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Tx complete callback*/ + huart->TxHalfCpltCallback(huart); +#else + /*Call legacy weak Tx complete callback*/ + HAL_UART_TxHalfCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA UART receive process complete callback. + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + /* DMA Normal mode*/ + if ((hdma->Instance->CR & DMA_SxCR_CIRC) == 0U) + { + huart->RxXferCount = 0U; + + /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* Disable the DMA transfer for the receiver request by setting the DMAR bit + in the UART CR3 register */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* At end of Rx process, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + + /* If Reception till IDLE event has been selected, Disable IDLE Interrupt */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + } + } + + /* Initialize type of RxEvent that correspond to RxEvent callback execution; + In this case, Rx Event type is Transfer Complete */ + huart->RxEventType = HAL_UART_RXEVENT_TC; + + /* Check current reception Mode : + If Reception till IDLE event has been selected : use Rx Event callback */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx Event callback*/ + huart->RxEventCallback(huart, huart->RxXferSize); +#else + /*Call legacy weak Rx Event callback*/ + HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + else + { + /* In other cases : use Rx Complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx complete callback*/ + huart->RxCpltCallback(huart); +#else + /*Call legacy weak Rx complete callback*/ + HAL_UART_RxCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } +} + +/** + * @brief DMA UART receive process half complete callback + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void UART_DMARxHalfCplt(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + /* Initialize type of RxEvent that correspond to RxEvent callback execution; + In this case, Rx Event type is Half Transfer */ + huart->RxEventType = HAL_UART_RXEVENT_HT; + + /* Check current reception Mode : + If Reception till IDLE event has been selected : use Rx Event callback */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx Event callback*/ + huart->RxEventCallback(huart, huart->RxXferSize / 2U); +#else + /*Call legacy weak Rx Event callback*/ + HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize / 2U); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + else + { + /* In other cases : use Rx Half Complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx Half complete callback*/ + huart->RxHalfCpltCallback(huart); +#else + /*Call legacy weak Rx Half complete callback*/ + HAL_UART_RxHalfCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } +} + +/** + * @brief DMA UART communication error callback. + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void UART_DMAError(DMA_HandleTypeDef *hdma) +{ + uint32_t dmarequest = 0x00U; + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + /* Stop UART DMA Tx request if ongoing */ + dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT); + if ((huart->gState == HAL_UART_STATE_BUSY_TX) && dmarequest) + { + huart->TxXferCount = 0x00U; + UART_EndTxTransfer(huart); + } + + /* Stop UART DMA Rx request if ongoing */ + dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR); + if ((huart->RxState == HAL_UART_STATE_BUSY_RX) && dmarequest) + { + huart->RxXferCount = 0x00U; + UART_EndRxTransfer(huart); + } + + huart->ErrorCode |= HAL_UART_ERROR_DMA; +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered error callback*/ + huart->ErrorCallback(huart); +#else + /*Call legacy weak error callback*/ + HAL_UART_ErrorCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +} + +/** + * @brief This function handles UART Communication Timeout. It waits + * until a flag is no longer in the specified status. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param Flag specifies the UART flag to check. + * @param Status The actual Flag status (SET or RESET). + * @param Tickstart Tick start value + * @param Timeout Timeout duration + * @retval HAL status + */ +static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, + uint32_t Tickstart, uint32_t Timeout) +{ + /* Wait until flag is set */ + while ((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status) + { + /* Check for the Timeout */ + if (Timeout != HAL_MAX_DELAY) + { + if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) + { + + return HAL_TIMEOUT; + } + + if ((READ_BIT(huart->Instance->CR1, USART_CR1_RE) != 0U) && (Flag != UART_FLAG_TXE) && (Flag != UART_FLAG_TC)) + { + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) == SET) + { + /* Clear Overrun Error flag*/ + __HAL_UART_CLEAR_OREFLAG(huart); + + /* Blocking error : transfer is aborted + Set the UART state ready to be able to start again the process, + Disable Rx Interrupts if ongoing */ + UART_EndRxTransfer(huart); + + huart->ErrorCode = HAL_UART_ERROR_ORE; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_ERROR; + } + } + } + } + return HAL_OK; +} + +/** + * @brief Start Receive operation in interrupt mode. + * @note This function could be called by all HAL UART API providing reception in Interrupt mode. + * @note When calling this function, parameters validity is considered as already checked, + * i.e. Rx State, buffer address, ... + * UART Handle is assumed as Locked. + * @param huart UART handle. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. + * @retval HAL status + */ +HAL_StatusTypeDef UART_Start_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) +{ + huart->pRxBuffPtr = pData; + huart->RxXferSize = Size; + huart->RxXferCount = Size; + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->RxState = HAL_UART_STATE_BUSY_RX; + + if (huart->Init.Parity != UART_PARITY_NONE) + { + /* Enable the UART Parity Error Interrupt */ + __HAL_UART_ENABLE_IT(huart, UART_IT_PE); + } + + /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */ + __HAL_UART_ENABLE_IT(huart, UART_IT_ERR); + + /* Enable the UART Data Register not empty Interrupt */ + __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE); + + return HAL_OK; +} + +/** + * @brief Start Receive operation in DMA mode. + * @note This function could be called by all HAL UART API providing reception in DMA mode. + * @note When calling this function, parameters validity is considered as already checked, + * i.e. Rx State, buffer address, ... + * UART Handle is assumed as Locked. + * @param huart UART handle. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. + * @retval HAL status + */ +HAL_StatusTypeDef UART_Start_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) +{ + uint32_t *tmp; + + huart->pRxBuffPtr = pData; + huart->RxXferSize = Size; + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->RxState = HAL_UART_STATE_BUSY_RX; + + /* Set the UART DMA transfer complete callback */ + huart->hdmarx->XferCpltCallback = UART_DMAReceiveCplt; + + /* Set the UART DMA Half transfer complete callback */ + huart->hdmarx->XferHalfCpltCallback = UART_DMARxHalfCplt; + + /* Set the DMA error callback */ + huart->hdmarx->XferErrorCallback = UART_DMAError; + + /* Set the DMA abort callback */ + huart->hdmarx->XferAbortCallback = NULL; + + /* Enable the DMA stream */ + tmp = (uint32_t *)&pData; + if (HAL_DMA_Start_IT(huart->hdmarx, (uint32_t)&huart->Instance->DR, *(uint32_t *)tmp, Size) != HAL_OK) + { + /* Set error code to DMA */ + huart->ErrorCode = HAL_UART_ERROR_DMA; + + /* Restore huart->RxState to ready */ + huart->RxState = HAL_UART_STATE_READY; + + return HAL_ERROR; + } + /* Clear the Overrun flag just before enabling the DMA Rx request: can be mandatory for the second transfer */ + __HAL_UART_CLEAR_OREFLAG(huart); + + if (huart->Init.Parity != UART_PARITY_NONE) + { + /* Enable the UART Parity Error Interrupt */ + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_PEIE); + } + + /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */ + ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* Enable the DMA transfer for the receiver request by setting the DMAR bit + in the UART CR3 register */ + ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + return HAL_OK; +} + +/** + * @brief End ongoing Tx transfer on UART peripheral (following error detection or Transmit completion). + * @param huart UART handle. + * @retval None + */ +static void UART_EndTxTransfer(UART_HandleTypeDef *huart) +{ + /* Disable TXEIE and TCIE interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE)); + + /* At end of Tx process, restore huart->gState to Ready */ + huart->gState = HAL_UART_STATE_READY; +} + +/** + * @brief End ongoing Rx transfer on UART peripheral (following error detection or Reception completion). + * @param huart UART handle. + * @retval None + */ +static void UART_EndRxTransfer(UART_HandleTypeDef *huart) +{ + /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE)); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* In case of reception waiting for IDLE event, disable also the IDLE IE interrupt source */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + } + + /* At end of Rx process, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; +} + +/** + * @brief DMA UART communication abort callback, when initiated by HAL services on Error + * (To be called at end of DMA Abort procedure following error occurrence). + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void UART_DMAAbortOnError(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + huart->RxXferCount = 0x00U; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered error callback*/ + huart->ErrorCallback(huart); +#else + /*Call legacy weak error callback*/ + HAL_UART_ErrorCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA UART Tx communication abort callback, when initiated by user + * (To be called at end of DMA Tx Abort procedure following user abort request). + * @note When this callback is executed, User Abort complete call back is called only if no + * Abort still ongoing for Rx DMA Handle. + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void UART_DMATxAbortCallback(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + huart->hdmatx->XferAbortCallback = NULL; + + /* Check if an Abort process is still ongoing */ + if (huart->hdmarx != NULL) + { + if (huart->hdmarx->XferAbortCallback != NULL) + { + return; + } + } + + /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */ + huart->TxXferCount = 0x00U; + huart->RxXferCount = 0x00U; + + /* Reset ErrorCode */ + huart->ErrorCode = HAL_UART_ERROR_NONE; + + /* Restore huart->gState and huart->RxState to Ready */ + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* Call user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort complete callback */ + huart->AbortCpltCallback(huart); +#else + /* Call legacy weak Abort complete callback */ + HAL_UART_AbortCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA UART Rx communication abort callback, when initiated by user + * (To be called at end of DMA Rx Abort procedure following user abort request). + * @note When this callback is executed, User Abort complete call back is called only if no + * Abort still ongoing for Tx DMA Handle. + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void UART_DMARxAbortCallback(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + huart->hdmarx->XferAbortCallback = NULL; + + /* Check if an Abort process is still ongoing */ + if (huart->hdmatx != NULL) + { + if (huart->hdmatx->XferAbortCallback != NULL) + { + return; + } + } + + /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */ + huart->TxXferCount = 0x00U; + huart->RxXferCount = 0x00U; + + /* Reset ErrorCode */ + huart->ErrorCode = HAL_UART_ERROR_NONE; + + /* Restore huart->gState and huart->RxState to Ready */ + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* Call user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort complete callback */ + huart->AbortCpltCallback(huart); +#else + /* Call legacy weak Abort complete callback */ + HAL_UART_AbortCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA UART Tx communication abort callback, when initiated by user by a call to + * HAL_UART_AbortTransmit_IT API (Abort only Tx transfer) + * (This callback is executed at end of DMA Tx Abort procedure following user abort request, + * and leads to user Tx Abort Complete callback execution). + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void UART_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + huart->TxXferCount = 0x00U; + + /* Restore huart->gState to Ready */ + huart->gState = HAL_UART_STATE_READY; + + /* Call user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort Transmit Complete Callback */ + huart->AbortTransmitCpltCallback(huart); +#else + /* Call legacy weak Abort Transmit Complete Callback */ + HAL_UART_AbortTransmitCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA UART Rx communication abort callback, when initiated by user by a call to + * HAL_UART_AbortReceive_IT API (Abort only Rx transfer) + * (This callback is executed at end of DMA Rx Abort procedure following user abort request, + * and leads to user Rx Abort Complete callback execution). + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void UART_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + huart->RxXferCount = 0x00U; + + /* Restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* Call user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort Receive Complete Callback */ + huart->AbortReceiveCpltCallback(huart); +#else + /* Call legacy weak Abort Receive Complete Callback */ + HAL_UART_AbortReceiveCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +} + +/** + * @brief Sends an amount of data in non blocking mode. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart) +{ + const uint16_t *tmp; + + /* Check that a Tx process is ongoing */ + if (huart->gState == HAL_UART_STATE_BUSY_TX) + { + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + tmp = (const uint16_t *) huart->pTxBuffPtr; + huart->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FF); + huart->pTxBuffPtr += 2U; + } + else + { + huart->Instance->DR = (uint8_t)(*huart->pTxBuffPtr++ & (uint8_t)0x00FF); + } + + if (--huart->TxXferCount == 0U) + { + /* Disable the UART Transmit Data Register Empty Interrupt */ + __HAL_UART_DISABLE_IT(huart, UART_IT_TXE); + + /* Enable the UART Transmit Complete Interrupt */ + __HAL_UART_ENABLE_IT(huart, UART_IT_TC); + } + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Wraps up transmission in non blocking mode. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +static HAL_StatusTypeDef UART_EndTransmit_IT(UART_HandleTypeDef *huart) +{ + /* Disable the UART Transmit Complete Interrupt */ + __HAL_UART_DISABLE_IT(huart, UART_IT_TC); + + /* Tx process is ended, restore huart->gState to Ready */ + huart->gState = HAL_UART_STATE_READY; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Tx complete callback*/ + huart->TxCpltCallback(huart); +#else + /*Call legacy weak Tx complete callback*/ + HAL_UART_TxCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + + return HAL_OK; +} + +/** + * @brief Receives an amount of data in non blocking mode + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart) +{ + uint8_t *pdata8bits = NULL; + uint16_t *pdata16bits = NULL; + + /* Check that a Rx process is ongoing */ + if (huart->RxState == HAL_UART_STATE_BUSY_RX) + { + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + /* Unused pdata8bits */ + UNUSED(pdata8bits); + pdata16bits = (uint16_t *) huart->pRxBuffPtr; + *pdata16bits = (uint16_t)(huart->Instance->DR & (uint16_t)0x01FF); + huart->pRxBuffPtr += 2U; + } + else + { + pdata8bits = (uint8_t *) huart->pRxBuffPtr; + /* Unused pdata16bits */ + UNUSED(pdata16bits); + + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) || ((huart->Init.WordLength == UART_WORDLENGTH_8B) && (huart->Init.Parity == UART_PARITY_NONE))) + { + *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF); + } + else + { + *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F); + } + huart->pRxBuffPtr += 1U; + } + + if (--huart->RxXferCount == 0U) + { + /* Disable the UART Data Register not empty Interrupt */ + __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE); + + /* Disable the UART Parity Error Interrupt */ + __HAL_UART_DISABLE_IT(huart, UART_IT_PE); + + /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */ + __HAL_UART_DISABLE_IT(huart, UART_IT_ERR); + + /* Rx process is completed, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + + /* Initialize type of RxEvent to Transfer Complete */ + huart->RxEventType = HAL_UART_RXEVENT_TC; + + /* Check current reception Mode : + If Reception till IDLE event has been selected : */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + /* Set reception type to Standard */ + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* Disable IDLE interrupt */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + + /* Check if IDLE flag is set */ + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE)) + { + /* Clear IDLE flag in ISR */ + __HAL_UART_CLEAR_IDLEFLAG(huart); + } + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx Event callback*/ + huart->RxEventCallback(huart, huart->RxXferSize); +#else + /*Call legacy weak Rx Event callback*/ + HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + else + { + /* Standard reception API called */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx complete callback*/ + huart->RxCpltCallback(huart); +#else + /*Call legacy weak Rx complete callback*/ + HAL_UART_RxCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + + return HAL_OK; + } + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Configures the UART peripheral. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval None + */ +static void UART_SetConfig(UART_HandleTypeDef *huart) +{ + uint32_t tmpreg; + uint32_t pclk; + + /* Check the parameters */ + assert_param(IS_UART_BAUDRATE(huart->Init.BaudRate)); + assert_param(IS_UART_STOPBITS(huart->Init.StopBits)); + assert_param(IS_UART_PARITY(huart->Init.Parity)); + assert_param(IS_UART_MODE(huart->Init.Mode)); + + /*-------------------------- USART CR2 Configuration -----------------------*/ + /* Configure the UART Stop Bits: Set STOP[13:12] bits + according to huart->Init.StopBits value */ + MODIFY_REG(huart->Instance->CR2, USART_CR2_STOP, huart->Init.StopBits); + + /*-------------------------- USART CR1 Configuration -----------------------*/ + /* Configure the UART Word Length, Parity and mode: + Set the M bits according to huart->Init.WordLength value + Set PCE and PS bits according to huart->Init.Parity value + Set TE and RE bits according to huart->Init.Mode value + Set OVER8 bit according to huart->Init.OverSampling value */ + + tmpreg = (uint32_t)huart->Init.WordLength | huart->Init.Parity | huart->Init.Mode | huart->Init.OverSampling; + MODIFY_REG(huart->Instance->CR1, + (uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8), + tmpreg); + + /*-------------------------- USART CR3 Configuration -----------------------*/ + /* Configure the UART HFC: Set CTSE and RTSE bits according to huart->Init.HwFlowCtl value */ + MODIFY_REG(huart->Instance->CR3, (USART_CR3_RTSE | USART_CR3_CTSE), huart->Init.HwFlowCtl); + + +#if defined(USART6) && defined(UART9) && defined(UART10) + if ((huart->Instance == USART1) || (huart->Instance == USART6) || (huart->Instance == UART9) || (huart->Instance == UART10)) + { + pclk = HAL_RCC_GetPCLK2Freq(); + } +#elif defined(USART6) + if ((huart->Instance == USART1) || (huart->Instance == USART6)) + { + pclk = HAL_RCC_GetPCLK2Freq(); + } +#else + if (huart->Instance == USART1) + { + pclk = HAL_RCC_GetPCLK2Freq(); + } +#endif /* USART6 */ + else + { + pclk = HAL_RCC_GetPCLK1Freq(); + } + /*-------------------------- USART BRR Configuration ---------------------*/ + if (huart->Init.OverSampling == UART_OVERSAMPLING_8) + { + huart->Instance->BRR = UART_BRR_SAMPLING8(pclk, huart->Init.BaudRate); + } + else + { + huart->Instance->BRR = UART_BRR_SAMPLING16(pclk, huart->Init.BaudRate); + } +} + +/** + * @} + */ + +#endif /* HAL_UART_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + diff --git a/DveC.ioc b/DveC.ioc new file mode 100644 index 0000000..9ba745e --- /dev/null +++ b/DveC.ioc @@ -0,0 +1,392 @@ +#MicroXplorer Configuration settings - do not modify +CAD.formats= +CAD.pinconfig= +CAD.provider= +Dma.I2C3_RX.0.Direction=DMA_PERIPH_TO_MEMORY +Dma.I2C3_RX.0.FIFOMode=DMA_FIFOMODE_DISABLE +Dma.I2C3_RX.0.Instance=DMA1_Stream2 +Dma.I2C3_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE +Dma.I2C3_RX.0.MemInc=DMA_MINC_ENABLE +Dma.I2C3_RX.0.Mode=DMA_NORMAL +Dma.I2C3_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE +Dma.I2C3_RX.0.PeriphInc=DMA_PINC_DISABLE +Dma.I2C3_RX.0.Priority=DMA_PRIORITY_LOW +Dma.I2C3_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode +Dma.Request0=I2C3_RX +Dma.Request1=SPI1_RX +Dma.Request2=SPI1_TX +Dma.Request3=USART6_RX +Dma.RequestsNb=4 +Dma.SPI1_RX.1.Direction=DMA_PERIPH_TO_MEMORY +Dma.SPI1_RX.1.FIFOMode=DMA_FIFOMODE_DISABLE +Dma.SPI1_RX.1.Instance=DMA2_Stream2 +Dma.SPI1_RX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE +Dma.SPI1_RX.1.MemInc=DMA_MINC_ENABLE +Dma.SPI1_RX.1.Mode=DMA_NORMAL +Dma.SPI1_RX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE +Dma.SPI1_RX.1.PeriphInc=DMA_PINC_DISABLE +Dma.SPI1_RX.1.Priority=DMA_PRIORITY_LOW +Dma.SPI1_RX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode +Dma.SPI1_TX.2.Direction=DMA_MEMORY_TO_PERIPH +Dma.SPI1_TX.2.FIFOMode=DMA_FIFOMODE_DISABLE +Dma.SPI1_TX.2.Instance=DMA2_Stream3 +Dma.SPI1_TX.2.MemDataAlignment=DMA_MDATAALIGN_BYTE +Dma.SPI1_TX.2.MemInc=DMA_MINC_ENABLE +Dma.SPI1_TX.2.Mode=DMA_NORMAL +Dma.SPI1_TX.2.PeriphDataAlignment=DMA_PDATAALIGN_BYTE +Dma.SPI1_TX.2.PeriphInc=DMA_PINC_DISABLE +Dma.SPI1_TX.2.Priority=DMA_PRIORITY_LOW +Dma.SPI1_TX.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode +Dma.USART6_RX.3.Direction=DMA_PERIPH_TO_MEMORY +Dma.USART6_RX.3.FIFOMode=DMA_FIFOMODE_DISABLE +Dma.USART6_RX.3.Instance=DMA2_Stream1 +Dma.USART6_RX.3.MemDataAlignment=DMA_MDATAALIGN_BYTE +Dma.USART6_RX.3.MemInc=DMA_MINC_ENABLE +Dma.USART6_RX.3.Mode=DMA_NORMAL +Dma.USART6_RX.3.PeriphDataAlignment=DMA_PDATAALIGN_BYTE +Dma.USART6_RX.3.PeriphInc=DMA_PINC_DISABLE +Dma.USART6_RX.3.Priority=DMA_PRIORITY_LOW +Dma.USART6_RX.3.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode +FREERTOS.IPParameters=Tasks01 +FREERTOS.Tasks01=defaultTask,24,128,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL +File.Version=6 +GPIO.groupedBy=Group By Peripherals +I2C3.I2C_Mode=I2C_Fast +I2C3.IPParameters=I2C_Mode +KeepUserPlacement=false +Mcu.CPN=STM32F407IGH6 +Mcu.Family=STM32F4 +Mcu.IP0=DMA +Mcu.IP1=FREERTOS +Mcu.IP10=TIM5 +Mcu.IP11=TIM10 +Mcu.IP12=USART6 +Mcu.IP2=I2C2 +Mcu.IP3=I2C3 +Mcu.IP4=NVIC +Mcu.IP5=RCC +Mcu.IP6=SPI1 +Mcu.IP7=SYS +Mcu.IP8=TIM1 +Mcu.IP9=TIM4 +Mcu.IPNb=13 +Mcu.Name=STM32F407I(E-G)Hx +Mcu.Package=UFBGA176 +Mcu.Pin0=PG14 +Mcu.Pin1=PB4 +Mcu.Pin10=PH1-OSC_OUT +Mcu.Pin11=PF1 +Mcu.Pin12=PG6 +Mcu.Pin13=PF6 +Mcu.Pin14=PH12 +Mcu.Pin15=PG3 +Mcu.Pin16=PH11 +Mcu.Pin17=PH10 +Mcu.Pin18=PD14 +Mcu.Pin19=PA4 +Mcu.Pin2=PB3 +Mcu.Pin20=PC4 +Mcu.Pin21=PE13 +Mcu.Pin22=PC5 +Mcu.Pin23=PE9 +Mcu.Pin24=PE11 +Mcu.Pin25=PE14 +Mcu.Pin26=PB12 +Mcu.Pin27=PB13 +Mcu.Pin28=PA7 +Mcu.Pin29=PB0 +Mcu.Pin3=PA14 +Mcu.Pin30=PB14 +Mcu.Pin31=PB15 +Mcu.Pin32=VP_FREERTOS_VS_CMSIS_V2 +Mcu.Pin33=VP_SYS_VS_Systick +Mcu.Pin34=VP_TIM10_VS_ClockSourceINT +Mcu.Pin4=PA13 +Mcu.Pin5=PG9 +Mcu.Pin6=PF0 +Mcu.Pin7=PC9 +Mcu.Pin8=PA8 +Mcu.Pin9=PH0-OSC_IN +Mcu.PinsNb=35 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32F407IGHx +MxCube.Version=6.15.0 +MxDb.Version=DB.6.0.150 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false +NVIC.DMA1_Stream2_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true +NVIC.DMA2_Stream1_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true +NVIC.DMA2_Stream2_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true\:true +NVIC.DMA2_Stream3_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false +NVIC.EXTI3_IRQn=true\:5\:0\:true\:false\:true\:false\:true\:true\:true +NVIC.EXTI4_IRQn=true\:5\:0\:true\:false\:true\:false\:true\:true\:true +NVIC.EXTI9_5_IRQn=true\:5\:0\:true\:false\:true\:false\:true\:true\:true +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\: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\:false\:false\:true\:true\:false\:true\:false +NVIC.USART6_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false +PA13.Mode=Serial_Wire +PA13.Signal=SYS_JTMS-SWDIO +PA14.Mode=Serial_Wire +PA14.Signal=SYS_JTCK-SWCLK +PA4.GPIOParameters=GPIO_Speed,PinState,GPIO_PuPd,GPIO_Label +PA4.GPIO_Label=ACCL_CS +PA4.GPIO_PuPd=GPIO_PULLUP +PA4.GPIO_Speed=GPIO_SPEED_FREQ_MEDIUM +PA4.Locked=true +PA4.PinState=GPIO_PIN_SET +PA4.Signal=GPIO_Output +PA7.GPIOParameters=GPIO_PuPd +PA7.GPIO_PuPd=GPIO_PULLUP +PA7.Locked=true +PA7.Mode=Full_Duplex_Master +PA7.Signal=SPI1_MOSI +PA8.Mode=I2C +PA8.Signal=I2C3_SCL +PB0.GPIOParameters=GPIO_Speed,PinState,GPIO_PuPd,GPIO_Label +PB0.GPIO_Label=GYRO_CS +PB0.GPIO_PuPd=GPIO_PULLUP +PB0.GPIO_Speed=GPIO_SPEED_FREQ_MEDIUM +PB0.Locked=true +PB0.PinState=GPIO_PIN_SET +PB0.Signal=GPIO_Output +PB12.GPIOParameters=GPIO_Speed,PinState,GPIO_Label +PB12.GPIO_Label=PS2_CS +PB12.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PB12.Locked=true +PB12.PinState=GPIO_PIN_SET +PB12.Signal=GPIO_Output +PB13.GPIOParameters=GPIO_Speed,PinState,GPIO_Label +PB13.GPIO_Label=PS2_CLK +PB13.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PB13.Locked=true +PB13.PinState=GPIO_PIN_SET +PB13.Signal=GPIO_Output +PB14.GPIOParameters=GPIO_PuPd,GPIO_Label +PB14.GPIO_Label=PS2_DI +PB14.GPIO_PuPd=GPIO_PULLUP +PB14.Locked=true +PB14.Signal=GPIO_Input +PB15.GPIOParameters=GPIO_Speed,PinState,GPIO_Label +PB15.GPIO_Label=PS2_DO +PB15.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PB15.Locked=true +PB15.PinState=GPIO_PIN_SET +PB15.Signal=GPIO_Output +PB3.GPIOParameters=GPIO_PuPd +PB3.GPIO_PuPd=GPIO_PULLUP +PB3.Mode=Full_Duplex_Master +PB3.Signal=SPI1_SCK +PB4.GPIOParameters=GPIO_PuPd +PB4.GPIO_PuPd=GPIO_PULLUP +PB4.Mode=Full_Duplex_Master +PB4.Signal=SPI1_MISO +PC4.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI +PC4.GPIO_Label=ACCL_INT +PC4.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_FALLING +PC4.GPIO_PuPd=GPIO_PULLUP +PC4.Locked=true +PC4.Signal=GPXTI4 +PC5.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI +PC5.GPIO_Label=GYRO_INT +PC5.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_FALLING +PC5.GPIO_PuPd=GPIO_PULLUP +PC5.Locked=true +PC5.Signal=GPXTI5 +PC9.Mode=I2C +PC9.Signal=I2C3_SDA +PD14.Locked=true +PD14.Signal=S_TIM4_CH3 +PE11.GPIOParameters=GPIO_Speed,GPIO_Label +PE11.GPIO_Label=MOTOR_OUT2 +PE11.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PE11.Locked=true +PE11.Signal=S_TIM1_CH2 +PE13.GPIOParameters=GPIO_Speed,GPIO_Label +PE13.GPIO_Label=MOTOR_OUT3 +PE13.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PE13.Locked=true +PE13.Signal=S_TIM1_CH3 +PE14.GPIOParameters=GPIO_Speed,GPIO_Label +PE14.GPIO_Label=MOTOR_OUT4 +PE14.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PE14.Locked=true +PE14.Signal=S_TIM1_CH4 +PE9.GPIOParameters=GPIO_Speed,GPIO_Label +PE9.GPIO_Label=MOTOR_OUT1 +PE9.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PE9.Locked=true +PE9.Signal=S_TIM1_CH1 +PF0.Mode=I2C +PF0.Signal=I2C2_SDA +PF1.Mode=I2C +PF1.Signal=I2C2_SCL +PF6.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label +PF6.GPIO_Label=IMU_HEAT_PWM +PF6.GPIO_PuPd=GPIO_PULLDOWN +PF6.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PF6.Locked=true +PF6.Signal=S_TIM10_CH1 +PG14.Mode=Asynchronous +PG14.Signal=USART6_TX +PG3.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI +PG3.GPIO_Label=CMPS_INT +PG3.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_FALLING +PG3.GPIO_PuPd=GPIO_PULLUP +PG3.Locked=true +PG3.Signal=GPXTI3 +PG6.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label +PG6.GPIO_Label=CMPS_RST +PG6.GPIO_PuPd=GPIO_PULLUP +PG6.GPIO_Speed=GPIO_SPEED_FREQ_MEDIUM +PG6.Locked=true +PG6.Signal=GPIO_Output +PG9.Mode=Asynchronous +PG9.Signal=USART6_RX +PH0-OSC_IN.Mode=HSE-External-Oscillator +PH0-OSC_IN.Signal=RCC_OSC_IN +PH1-OSC_OUT.Mode=HSE-External-Oscillator +PH1-OSC_OUT.Signal=RCC_OSC_OUT +PH10.GPIOParameters=GPIO_Label +PH10.GPIO_Label=LED_B +PH10.Signal=S_TIM5_CH1 +PH11.GPIOParameters=GPIO_Label +PH11.GPIO_Label=LED_G +PH11.Signal=S_TIM5_CH2 +PH12.GPIOParameters=GPIO_Label +PH12.GPIO_Label=LED_R +PH12.Signal=S_TIM5_CH3 +PinOutPanel.CurrentBGAView=Top +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerLinker=GCC +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=true +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32F407IGHx +ProjectManager.FirmwarePackage=STM32Cube FW_F4 V1.28.3 +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=DveC.ioc +ProjectManager.ProjectName=DveC +ProjectManager.ProjectStructure= +ProjectManager.RegisterCallBack= +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=MDK-ARM V5.32 +ProjectManager.ToolChainLocation= +ProjectManager.UAScriptAfterPath= +ProjectManager.UAScriptBeforePath= +ProjectManager.UnderRoot=false +ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_I2C2_Init-I2C2-false-HAL-true,5-MX_I2C3_Init-I2C3-false-HAL-true,6-MX_TIM1_Init-TIM1-false-HAL-true,7-MX_TIM4_Init-TIM4-false-HAL-true,8-MX_TIM5_Init-TIM5-false-HAL-true,9-MX_TIM10_Init-TIM10-false-HAL-true,10-MX_SPI1_Init-SPI1-false-HAL-true,11-MX_USART6_UART_Init-USART6-false-HAL-true +RCC.48MHZClocksFreq_Value=84000000 +RCC.AHBFreq_Value=168000000 +RCC.APB1CLKDivider=RCC_HCLK_DIV4 +RCC.APB1Freq_Value=42000000 +RCC.APB1TimFreq_Value=84000000 +RCC.APB2CLKDivider=RCC_HCLK_DIV2 +RCC.APB2Freq_Value=84000000 +RCC.APB2TimFreq_Value=168000000 +RCC.CortexFreq_Value=168000000 +RCC.EthernetFreq_Value=168000000 +RCC.FCLKCortexFreq_Value=168000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=168000000 +RCC.HSE_VALUE=12000000 +RCC.HSI_VALUE=16000000 +RCC.I2SClocksFreq_Value=192000000 +RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSE_VALUE,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQCLKFreq_Value,PLLSourceVirtual,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S +RCC.LSE_VALUE=32768 +RCC.LSI_VALUE=32000 +RCC.MCO2PinFreq_Value=168000000 +RCC.PLLCLKFreq_Value=168000000 +RCC.PLLM=6 +RCC.PLLN=168 +RCC.PLLQCLKFreq_Value=84000000 +RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE +RCC.RTCFreq_Value=32000 +RCC.RTCHSEDivFreq_Value=6000000 +RCC.SYSCLKFreq_VALUE=168000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.VCOI2SOutputFreq_Value=384000000 +RCC.VCOInputFreq_Value=2000000 +RCC.VCOOutputFreq_Value=336000000 +RCC.VcooutputI2S=192000000 +SH.GPXTI3.0=GPIO_EXTI3 +SH.GPXTI3.ConfNb=1 +SH.GPXTI4.0=GPIO_EXTI4 +SH.GPXTI4.ConfNb=1 +SH.GPXTI5.0=GPIO_EXTI5 +SH.GPXTI5.ConfNb=1 +SH.S_TIM10_CH1.0=TIM10_CH1,PWM Generation1 CH1 +SH.S_TIM10_CH1.ConfNb=1 +SH.S_TIM1_CH1.0=TIM1_CH1,PWM Generation1 CH1 +SH.S_TIM1_CH1.ConfNb=1 +SH.S_TIM1_CH2.0=TIM1_CH2,PWM Generation2 CH2 +SH.S_TIM1_CH2.ConfNb=1 +SH.S_TIM1_CH3.0=TIM1_CH3,PWM Generation3 CH3 +SH.S_TIM1_CH3.ConfNb=1 +SH.S_TIM1_CH4.0=TIM1_CH4,PWM Generation4 CH4 +SH.S_TIM1_CH4.ConfNb=1 +SH.S_TIM4_CH3.0=TIM4_CH3,PWM Generation3 CH3 +SH.S_TIM4_CH3.ConfNb=1 +SH.S_TIM5_CH1.0=TIM5_CH1,PWM Generation1 CH1 +SH.S_TIM5_CH1.ConfNb=1 +SH.S_TIM5_CH2.0=TIM5_CH2,PWM Generation2 CH2 +SH.S_TIM5_CH2.ConfNb=1 +SH.S_TIM5_CH3.0=TIM5_CH3,PWM Generation3 CH3 +SH.S_TIM5_CH3.ConfNb=1 +SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_16 +SPI1.CLKPhase=SPI_PHASE_2EDGE +SPI1.CLKPolarity=SPI_POLARITY_HIGH +SPI1.CalculateBaudRate=5.25 MBits/s +SPI1.Direction=SPI_DIRECTION_2LINES +SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler,CLKPolarity,CLKPhase +SPI1.Mode=SPI_MODE_MASTER +SPI1.VirtualType=VM_MASTER +TIM1.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 +TIM1.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 +TIM1.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 +TIM1.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 +TIM1.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4,Prescaler +TIM1.Prescaler=167 +TIM10.Channel=TIM_CHANNEL_1 +TIM10.IPParameters=Channel +TIM4.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 +TIM4.IPParameters=Channel-PWM Generation3 CH3,Prescaler +TIM4.Prescaler=167 +TIM5.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 +TIM5.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 +TIM5.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 +TIM5.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation3 CH3,Prescaler +TIM5.Prescaler=167 +USART6.IPParameters=VirtualMode +USART6.VirtualMode=VM_ASYNC +VP_FREERTOS_VS_CMSIS_V2.Mode=CMSIS_V2 +VP_FREERTOS_VS_CMSIS_V2.Signal=FREERTOS_VS_CMSIS_V2 +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +VP_TIM10_VS_ClockSourceINT.Mode=Enable_Timer +VP_TIM10_VS_ClockSourceINT.Signal=TIM10_VS_ClockSourceINT +board=custom diff --git a/MDK-ARM/DebugConfig/DveC_STM32F407IGHx.dbgconf b/MDK-ARM/DebugConfig/DveC_STM32F407IGHx.dbgconf new file mode 100644 index 0000000..1df0a1b --- /dev/null +++ b/MDK-ARM/DebugConfig/DveC_STM32F407IGHx.dbgconf @@ -0,0 +1,48 @@ +// File: STM32F405_415_407_417_427_437_429_439.dbgconf +// Version: 1.0.0 +// Note: refer to STM32F405/415 STM32F407/417 STM32F427/437 STM32F429/439 reference manual (RM0090) +// refer to STM32F40x STM32F41x datasheets +// refer to STM32F42x STM32F43x datasheets + +// <<< Use Configuration Wizard in Context Menu >>> + +// Debug MCU configuration register (DBGMCU_CR) +// DBG_STANDBY Debug Standby Mode +// DBG_STOP Debug Stop Mode +// DBG_SLEEP Debug Sleep Mode +// +DbgMCU_CR = 0x00000007; + +// Debug MCU APB1 freeze register (DBGMCU_APB1_FZ) +// Reserved bits must be kept at reset value +// DBG_CAN2_STOP CAN2 stopped when core is halted +// DBG_CAN1_STOP CAN2 stopped when core is halted +// DBG_I2C3_SMBUS_TIMEOUT I2C3 SMBUS timeout mode stopped when core is halted +// DBG_I2C2_SMBUS_TIMEOUT I2C2 SMBUS timeout mode stopped when core is halted +// DBG_I2C1_SMBUS_TIMEOUT I2C1 SMBUS timeout mode stopped when core is halted +// DBG_IWDG_STOP Independent watchdog stopped when core is halted +// DBG_WWDG_STOP Window watchdog stopped when core is halted +// DBG_RTC_STOP RTC stopped when core is halted +// DBG_TIM14_STOP TIM14 counter stopped when core is halted +// DBG_TIM13_STOP TIM13 counter stopped when core is halted +// DBG_TIM12_STOP TIM12 counter stopped when core is halted +// DBG_TIM7_STOP TIM7 counter stopped when core is halted +// DBG_TIM6_STOP TIM6 counter stopped when core is halted +// DBG_TIM5_STOP TIM5 counter stopped when core is halted +// DBG_TIM4_STOP TIM4 counter stopped when core is halted +// DBG_TIM3_STOP TIM3 counter stopped when core is halted +// DBG_TIM2_STOP TIM2 counter stopped when core is halted +// +DbgMCU_APB1_Fz = 0x00000000; + +// Debug MCU APB2 freeze register (DBGMCU_APB2_FZ) +// Reserved bits must be kept at reset value +// DBG_TIM11_STOP TIM11 counter stopped when core is halted +// DBG_TIM10_STOP TIM10 counter stopped when core is halted +// DBG_TIM9_STOP TIM9 counter stopped when core is halted +// DBG_TIM8_STOP TIM8 counter stopped when core is halted +// DBG_TIM1_STOP TIM1 counter stopped when core is halted +// +DbgMCU_APB2_Fz = 0x00000000; + +// <<< end of configuration section >>> \ No newline at end of file diff --git a/MDK-ARM/DveC.uvguix.yxm23 b/MDK-ARM/DveC.uvguix.yxm23 new file mode 100644 index 0000000..2746c90 --- /dev/null +++ b/MDK-ARM/DveC.uvguix.yxm23 @@ -0,0 +1,3628 @@ + + + + -6.1 + +
### uVision Project, (C) Keil Software
+ + + + + + + + + + 38003 + Registers + 124 79 + + + 346 + Code Coverage + 877 160 + + + 204 + Performance Analyzer + 1037 + + + + + + 35141 + Event Statistics + + 200 50 700 + + + 1506 + Symbols + + 71 71 71 + + + 1936 + Watch 1 + + 200 133 133 + + + 1937 + Watch 2 + + 200 133 133 + + + 1935 + Call Stack + Locals + + 200 133 133 + + + 2506 + Trace Data + + 75 135 130 95 70 230 200 150 + + + 466 + Source Browser + 500 + 300 + + + + + + + + 1 + 1 + 0 + 0 + -1 + + + + + + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 92 + 157 + 1202 + 892 + + + + 0 + + 311 + 0100000004000000010000000100000001000000010000000000000002000000000000000100000001000000000000002800000028000000010000000200000001000000010000002E443A5C435542454D585C51756164636F707465725C447665435C557365725C6465766963655C626D693038382E680000000008626D693038382E6800000000C5D4F200FFFFFFFF2A443A5C435542454D585C51756164636F707465725C447665435C557365725C6273705C666C6173682E630000000007666C6173682E6300000000FFDC7800FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD5000100000000000000020000007E010000CA000000AA040000CB020000 + + + + 0 + Build + + -1 + -1 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D90000004F000000F0040000E1000000 + + + 16 + 3C00000053000000B4020000E5000000 + + + + 1005 + 1005 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000D200000037020000 + + + 16 + 3C000000530000001101000023010000 + + + + 109 + 109 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000D200000037020000 + + + 16 + 3C00000053000000380100009D020000 + + + + 1465 + 1465 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0000000037020000F0040000C9020000 + + + 16 + 3C00000053000000B4020000E5000000 + + + + 1466 + 1466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003A020000ED0400009C020000 + + + 16 + 3C00000053000000B4020000E5000000 + + + + 1467 + 1467 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003A020000ED0400009C020000 + + + 16 + 3C00000053000000B4020000E5000000 + + + + 1468 + 1468 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003A020000ED0400009C020000 + + + 16 + 3C00000053000000B4020000E5000000 + + + + 1506 + 1506 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 1E04000066000000ED04000006010000 + + + 16 + 3C000000530000001101000023010000 + + + + 1913 + 1913 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + DC00000066000000ED040000C8000000 + + + 16 + 3C00000053000000B4020000E5000000 + + + + 1935 + 1935 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 030000003A020000ED040000B0020000 + + + 16 + 3C000000530000001101000023010000 + + + + 1936 + 1936 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003A020000ED0400009C020000 + + + 16 + 3C000000530000001101000023010000 + + + + 1937 + 1937 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003A020000ED0400009C020000 + + + 16 + 3C000000530000001101000023010000 + + + + 1939 + 1939 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003A020000ED0400009C020000 + + + 16 + 3C00000053000000B4020000E5000000 + + + + 1940 + 1940 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003A020000ED0400009C020000 + + + 16 + 3C00000053000000B4020000E5000000 + + + + 1941 + 1941 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003A020000ED0400009C020000 + + + 16 + 3C00000053000000B4020000E5000000 + + + + 1942 + 1942 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003A020000ED0400009C020000 + + + 16 + 3C00000053000000B4020000E5000000 + + + + 195 + 195 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000D200000037020000 + + + 16 + 3C00000053000000380100009D020000 + + + + 196 + 196 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000D200000037020000 + + + 16 + 3C00000053000000380100009D020000 + + + + 197 + 197 + 1 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 000000006802000005040000E6020000 + + + 16 + 3C00000053000000B4020000E5000000 + + + + 198 + 198 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 0000000023020000F0040000C9020000 + + + 16 + 3C00000053000000B4020000E5000000 + + + + 199 + 199 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000006B020000ED040000CD020000 + + + 16 + 3C00000053000000B4020000E5000000 + + + + 203 + 203 + 0 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + D900000063000000F0040000E1000000 + + + 16 + 3C00000053000000B4020000E5000000 + + + + 204 + 204 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + DC00000066000000ED040000C8000000 + + + 16 + 3C00000053000000B4020000E5000000 + + + + 221 + 221 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000000000000000000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2506 + 2506 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1B04000063000000F004000033020000 + + + 16 + 3C000000530000001101000023010000 + + + + 2507 + 2507 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0000000037020000F0040000B5020000 + + + 16 + 3C00000053000000B4020000E5000000 + + + + 343 + 343 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + DC00000066000000ED040000C8000000 + + + 16 + 3C00000053000000B4020000E5000000 + + + + 346 + 346 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + DC00000066000000ED040000C8000000 + + + 16 + 3C00000053000000B4020000E5000000 + + + + 35141 + 35141 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D900000063000000F0040000E1000000 + + + 16 + 3C000000530000001101000023010000 + + + + 35824 + 35824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + DC00000066000000ED040000C8000000 + + + 16 + 3C00000053000000B4020000E5000000 + + + + 35885 + 35885 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 35886 + 35886 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 35887 + 35887 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 35888 + 35888 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 35889 + 35889 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 35890 + 35890 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 35891 + 35891 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 35892 + 35892 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 35893 + 35893 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 35894 + 35894 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 35895 + 35895 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 35896 + 35896 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 35897 + 35897 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 35898 + 35898 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 35899 + 35899 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 35900 + 35900 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 35901 + 35901 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 35902 + 35902 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 35903 + 35903 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 35904 + 35904 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 35905 + 35905 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 38003 + 38003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000D2000000B0020000 + + + 16 + 3C00000053000000380100009D020000 + + + + 38007 + 38007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0000000068020000F0040000E6020000 + + + 16 + 3C00000053000000B4020000E5000000 + + + + 436 + 436 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000006B020000ED040000CD020000 + + + 16 + 3C00000053000000380100009D020000 + + + + 437 + 437 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003A020000ED0400009C020000 + + + 16 + 3C000000530000001101000023010000 + + + + 440 + 440 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003A020000ED0400009C020000 + + + 16 + 3C000000530000001101000023010000 + + + + 463 + 463 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000006B020000ED040000CD020000 + + + 16 + 3C00000053000000380100009D020000 + + + + 466 + 466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000006B020000ED040000CD020000 + + + 16 + 3C00000053000000380100009D020000 + + + + 470 + 470 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + DC00000066000000ED040000C8000000 + + + 16 + 3C00000053000000B4020000E5000000 + + + + 50000 + 50000 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 50001 + 50001 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 50002 + 50002 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 50003 + 50003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 50004 + 50004 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 50005 + 50005 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 50006 + 50006 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 50007 + 50007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 50008 + 50008 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 50009 + 50009 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 50010 + 50010 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 50011 + 50011 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 50012 + 50012 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 50013 + 50013 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 50014 + 50014 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 50015 + 50015 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 50016 + 50016 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 50017 + 50017 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 50018 + 50018 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 50019 + 50019 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 1E04000066000000ED04000084010000 + + + 16 + 3C000000530000001101000023010000 + + + + 59392 + 59392 + 1 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + 0000000000000000D10300001C000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59393 + 0 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000E602000005040000F9020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59399 + 59399 + 1 + 0 + 0 + 0 + 32767 + 0 + 8192 + 1 + + 16 + 000000001C000000E701000038000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59400 + 59400 + 0 + 0 + 0 + 0 + 32767 + 0 + 8192 + 2 + + 16 + 00000000380000006F02000054000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 824 + 824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003A020000ED0400009C020000 + + + 16 + 3C000000530000001101000023010000 + + + + 3312 + 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFD9000000E1000000F0040000E5000000000000000100001004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E6500200000000000003C00000053000000B4020000E5000000D90000004F000000F0040000E10000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF170400004F0000001B04000033020000000000000200001004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C30000018000400000000000003C0000005300000011010000230100001B0400004F000000F00400003302000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFD50000004F000000D900000050020000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000003C000000530000001101000023010000000000004F000000D5000000500200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF000000001F020000F00400002302000000000000010000100400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB090000018000800000000000003C0000005300000011010000230100000000000023020000F0040000C902000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFF78020000230200007C020000C902000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF00000000500200000504000054020000010000000100001004000000010000000000000000000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF01000077940000018000800000010000003C00000053000000B4020000E5000000000000005402000005040000E60200000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + + + 59392 + File + + 3011 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE8030000000000000000000000000000000000000000000000010000000100000096000000020020500000000011636D642D3E6C6173745F66697265636D649600000000000000140011636D642D3E6C6173745F66697265636D640C666565646261636B5F72706D1448414C5F554152545F526563656976655F444D41134D585F5553415254335F554152545F496E6974184253505F43414E5F526567697374657243616C6C6261636B136874696D312E496E7374616E63652D3E4152520E73746D3332667878785F69742E63067072696E74661F43414E5F72656D6F74655F7472616E736D697373696F6E5F72657175657374142043414E5F6964656E7469666965725F74797065034944450E43414E5F333530385F4D325F4944116765745F6D6F746F725F6D6561737572650654585F4F4B20124D50555F4949435F576169745F41636B282938696620286932635F77726974652873742E68772D3E616464722C2073742E7265672D3E7077725F6D676D745F312C20312C206461746129290573742E68770B73742E68772D3E616464721D50726F647563742049442072656164206173203020696E6469636174651048575F535F48575F4D50555F414444520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000000000000010000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65FF7F0000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 + + + + 59399 + Build + + 968 + 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050000000000444766543960000000000000001000444766543000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64FF7F0000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000 + + + + 59400 + Debug + + 2373 + 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720100000000000000000000000100000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7201000000000000000000000001000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000000000000100000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000000000000100000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000000000000100000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F720100000000000000000000000100000001000000000000000000000001000000000000000000054465627567FF7F0000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000 + + + + 0 + 1707 + 1067 + + + + 1 + Debug + + -1 + -1 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F2030000E4000000D205000050030000 + + + 16 + F2030000FB000000D205000067030000 + + + + 1005 + 1005 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000D200000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 109 + 109 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000D200000037030000 + + + 16 + 70000000870000006C010000D1020000 + + + + 1465 + 1465 + 1 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + F5030000FB000000CF05000037030000 + + + 16 + 060300000E0200004F050000B4020000 + + + + 1466 + 1466 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + F5030000FB000000CF05000037030000 + + + 16 + 060300000E0200004F050000B4020000 + + + + 1467 + 1467 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + F5030000FB000000CF05000037030000 + + + 16 + 060300000E0200004F050000B4020000 + + + + 1468 + 1468 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + F5030000FB000000CF05000037030000 + + + 16 + 060300000E0200004F050000B4020000 + + + + 1506 + 1506 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 1913 + 1913 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + DC00000066000000CF050000C7000000 + + + 16 + 7000000087000000E802000019010000 + + + + 1935 + 1935 + 1 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + F5030000FB000000CF05000037030000 + + + 16 + 060300000E0200004F050000B4020000 + + + + 1936 + 1936 + 1 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + F5030000FB000000CF05000037030000 + + + 16 + 060300000E0200004F050000B4020000 + + + + 1937 + 1937 + 1 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + F5030000FB000000CF05000037030000 + + + 16 + 060300000E0200004F050000B4020000 + + + + 1939 + 1939 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + F5030000FB000000CF05000037030000 + + + 16 + 060300000E0200004F050000B4020000 + + + + 1940 + 1940 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + F5030000FB000000CF05000037030000 + + + 16 + 060300000E0200004F050000B4020000 + + + + 1941 + 1941 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + F5030000FB000000CF05000037030000 + + + 16 + 060300000E0200004F050000B4020000 + + + + 1942 + 1942 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + F5030000FB000000CF05000037030000 + + + 16 + 060300000E0200004F050000B4020000 + + + + 195 + 195 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000D200000037030000 + + + 16 + 70000000870000006C010000D1020000 + + + + 196 + 196 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000D200000037030000 + + + 16 + 70000000870000006C010000D1020000 + + + + 197 + 197 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 030000004E020000ED040000B0020000 + + + 16 + 7000000087000000E802000019010000 + + + + 198 + 198 + 1 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 0000000054030000AB06000001040000 + + + 16 + 7000000087000000E802000019010000 + + + + 199 + 199 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000004E020000ED040000B0020000 + + + 16 + 7000000087000000E802000019010000 + + + + 203 + 203 + 1 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + D900000063000000D2050000E0000000 + + + 16 + 7000000087000000E802000019010000 + + + + 204 + 204 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + DC00000066000000CF050000C7000000 + + + 16 + 7000000087000000E802000019010000 + + + + 221 + 221 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000000000000000000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2506 + 2506 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 2507 + 2507 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + F5030000FB000000CF05000037030000 + + + 16 + 060300000E0200004F050000B4020000 + + + + 343 + 343 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + DC00000066000000CF050000C7000000 + + + 16 + 7000000087000000E802000019010000 + + + + 346 + 346 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + DC00000066000000CF050000C7000000 + + + 16 + 7000000087000000E802000019010000 + + + + 35141 + 35141 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + DC00000066000000CF050000C7000000 + + + 16 + 70000000870000004501000057010000 + + + + 35824 + 35824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + DC00000066000000CF050000C7000000 + + + 16 + 7000000087000000E802000019010000 + + + + 35885 + 35885 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 35886 + 35886 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 35887 + 35887 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 35888 + 35888 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 35889 + 35889 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 35890 + 35890 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 35891 + 35891 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 35892 + 35892 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 35893 + 35893 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 35894 + 35894 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 35895 + 35895 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 35896 + 35896 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 35897 + 35897 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 35898 + 35898 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 35899 + 35899 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 35900 + 35900 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 35901 + 35901 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 35902 + 35902 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 35903 + 35903 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 35904 + 35904 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 35905 + 35905 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D605000063000000AB06000050030000 + + + 16 + 70000000870000004501000057010000 + + + + 38003 + 38003 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000D200000037030000 + + + 16 + 70000000870000006C010000D1020000 + + + + 38007 + 38007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000004E020000ED040000B0020000 + + + 16 + 7000000087000000E802000019010000 + + + + 436 + 436 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000004E020000ED040000B0020000 + + + 16 + 70000000870000006C010000D1020000 + + + + 437 + 437 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + F5030000FB000000CF05000037030000 + + + 16 + 060300000E0200004F050000B4020000 + + + + 440 + 440 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + F5030000FB000000CF05000037030000 + + + 16 + 060300000E0200004F050000B4020000 + + + + 463 + 463 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000004E020000ED040000B0020000 + + + 16 + 70000000870000006C010000D1020000 + + + + 466 + 466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000004E020000ED040000B0020000 + + + 16 + 70000000870000006C010000D1020000 + + + + 470 + 470 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + DC00000066000000CF050000C7000000 + + + 16 + 7000000087000000E802000019010000 + + + + 50000 + 50000 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 50001 + 50001 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 50002 + 50002 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 50003 + 50003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 50004 + 50004 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 50005 + 50005 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 50006 + 50006 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 50007 + 50007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 50008 + 50008 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 50009 + 50009 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 50010 + 50010 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 50011 + 50011 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 50012 + 50012 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 50013 + 50013 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 50014 + 50014 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 50015 + 50015 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 50016 + 50016 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 50017 + 50017 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 50018 + 50018 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 50019 + 50019 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D905000066000000A806000037030000 + + + 16 + 70000000870000004501000057010000 + + + + 59392 + 59392 + 1 + 0 + 0 + 0 + 966 + 0 + 8192 + 0 + + 16 + 0000000000000000D10300001C000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59393 + 0 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0000000001040000AB06000014040000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59399 + 59399 + 0 + 0 + 0 + 0 + 476 + 0 + 8192 + 1 + + 16 + 000000001C000000E701000038000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59400 + 59400 + 1 + 0 + 0 + 0 + 612 + 0 + 8192 + 2 + + 16 + 000000001C0000006F02000038000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 824 + 824 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + F5030000FB000000CF05000037030000 + + + 16 + 060300000E0200004F050000B4020000 + + + + 3419 + 000000000C000000000000000040000001000000FFFFFFFFFFFFFFFFEE030000E4000000F20300005003000001000000020000100400000001000000000000000000000000000000000000000000000001000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB090000FFFF02000B004354616262656450616E650040000001000000F2030000FB000000D205000067030000F2030000E4000000D20500005003000000000000404100560F0000001343616C6C20537461636B202B204C6F63616C73010000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031010000009007000001000000FFFFFFFFFFFFFFFF0757617463682032010000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203101000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFF0600000000000000000000000000000000000000000000000000000001000000FFFFFFFF8F07000001000000FFFFFFFF8F070000000000000020000001000000FFFFFFFFFFFFFFFFD9000000E0000000D2050000E40000000100000001000010040000000100000070FFFFFF66020000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D60100004589000001800020000001000000D900000066000000D2050000F7000000D90000004F000000D2050000E00000000000000040280056080000000B446973617373656D626C7901000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000001000000FFFFFFFFFFFFFFFFD20500004F000000D605000050030000010000000200001004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000001000000D605000066000000AB06000067030000D60500004F000000AB0600005003000000000000404100562B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0454494D3101000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFF16000000000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFD50000004F000000D900000050030000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000000000000066000000D500000067030000000000004F000000D5000000500300000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73000000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7300000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657300000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273010000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000001000000FFFFFFFFFFFFFFFF0000000050030000AB060000540300000100000001000010040000000100000054FEFFFF4100000000000000000000000000000001000000C60000000000000001000000000000000000000001000000FFFFFFFF4D020000B0020000510200005603000000000000020000000400000000000000000000000000000000000000000000000000000001000000C600000001000000C6000000000000000080000000000000FFFFFFFFFFFFFFFF0000000033020000F004000037020000000000000100000004000000010000000000000000000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF0100007794000001800080000000000000000000004E020000F0040000E00200000000000037020000F0040000C90200000000000040820046060000000C4275696C64204F757470757400000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0642726F777365000000007794000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + + + 59392 + File + + 3002 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000001448414C5F554152545F526563656976655F444D41960000000000000014001448414C5F554152545F526563656976655F444D41134D585F5553415254335F554152545F496E6974184253505F43414E5F526567697374657243616C6C6261636B136874696D312E496E7374616E63652D3E4152520E73746D3332667878785F69742E63067072696E74661F43414E5F72656D6F74655F7472616E736D697373696F6E5F72657175657374142043414E5F6964656E7469666965725F74797065034944450E43414E5F333530385F4D325F4944116765745F6D6F746F725F6D6561737572650654585F4F4B20124D50555F4949435F576169745F41636B282938696620286932635F77726974652873742E68772D3E616464722C2073742E7265672D3E7077725F6D676D745F312C20312C206461746129290573742E68770B73742E68772D3E616464721D50726F647563742049442072656164206173203020696E6469636174651048575F535F48575F4D50555F414444520A55415254325F536176650775696E74385F740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000100150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 + + + + 59399 + Build + + 955 + 00200000000000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0000000000000000010000000000000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000000002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050FFFFFFFF00960000000000000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000000240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000 + + + + 59400 + Debug + + 2362 + 00200000010000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000004002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000020001002D0000000000000000000000000000000001000000010000000180F07F0000020001002E0000000000000000000000000000000001000000010000000180E8880000020000003700000000000000000000000000000000010000000100000001803B010000020001002F0000000000000000000000000000000001000000010000000180BB8A00000200010030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000002000100310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720000000000000000010000000000000001000000000000000000000001000000000013800F0100000200010032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000002000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7200000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720000000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000002000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730000000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72000000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000 + + + + 0 + 1707 + 1067 + + + + + + 1 + 0 + + 100 + 1 + + ..\User\device\bmi088.h + 0 + 45 + 54 + 1 + + 0 + + + D:\CUBEMX\Quadcopter\DveC\User\bsp\flash.c + 23 + 16 + 28 + 1 + + 0 + + + + +
diff --git a/MDK-ARM/DveC.uvoptx b/MDK-ARM/DveC.uvoptx new file mode 100644 index 0000000..6a39c8d --- /dev/null +++ b/MDK-ARM/DveC.uvoptx @@ -0,0 +1,1381 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + DveC + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + JL2CM3 + -U -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407IGHx$CMSIS\Flash\STM32F4xx_1024.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407IGHx$CMSIS\Flash\STM32F4xx_1024.FLM)) + + + 0 + ST-LINKIII-KEIL_SWO + -U-O142 -O2254 -S0 -C0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407IGHx$CMSIS\Flash\STM32F4xx_1024.FLM) + + + + + 0 + + + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 1 + 0 + 2 + 10000000 + + + + + + Application/MDK-ARM + 0 + 0 + 0 + 0 + + 1 + 1 + 2 + 0 + 0 + 0 + startup_stm32f407xx.s + startup_stm32f407xx.s + 0 + 0 + + + + + Application/User/Core + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ../Core/Src/main.c + main.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ../Core/Src/gpio.c + gpio.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + ../Core/Src/freertos.c + freertos.c + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + ../Core/Src/dma.c + dma.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ../Core/Src/i2c.c + i2c.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ../Core/Src/spi.c + spi.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ../Core/Src/tim.c + tim.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ../Core/Src/usart.c + usart.c + 0 + 0 + + + 2 + 10 + 1 + 0 + 0 + 0 + ../Core/Src/stm32f4xx_it.c + stm32f4xx_it.c + 0 + 0 + + + 2 + 11 + 1 + 0 + 0 + 0 + ../Core/Src/stm32f4xx_hal_msp.c + stm32f4xx_hal_msp.c + 0 + 0 + + + + + Drivers/STM32F4xx_HAL_Driver + 0 + 0 + 0 + 0 + + 3 + 12 + 1 + 0 + 0 + 0 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c + stm32f4xx_hal_rcc.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c + stm32f4xx_hal_rcc_ex.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c + stm32f4xx_hal_flash.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c + stm32f4xx_hal_flash_ex.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c + stm32f4xx_hal_flash_ramfunc.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c + stm32f4xx_hal_gpio.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c + stm32f4xx_hal_dma_ex.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c + stm32f4xx_hal_dma.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c + stm32f4xx_hal_pwr.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c + stm32f4xx_hal_pwr_ex.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c + stm32f4xx_hal_cortex.c + 0 + 0 + + + 3 + 23 + 1 + 0 + 0 + 0 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c + stm32f4xx_hal.c + 0 + 0 + + + 3 + 24 + 1 + 0 + 0 + 0 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c + stm32f4xx_hal_exti.c + 0 + 0 + + + 3 + 25 + 1 + 0 + 0 + 0 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c + stm32f4xx_hal_i2c.c + 0 + 0 + + + 3 + 26 + 1 + 0 + 0 + 0 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c + stm32f4xx_hal_i2c_ex.c + 0 + 0 + + + 3 + 27 + 1 + 0 + 0 + 0 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c + stm32f4xx_hal_spi.c + 0 + 0 + + + 3 + 28 + 1 + 0 + 0 + 0 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c + stm32f4xx_hal_tim.c + 0 + 0 + + + 3 + 29 + 1 + 0 + 0 + 0 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c + stm32f4xx_hal_tim_ex.c + 0 + 0 + + + 3 + 30 + 1 + 0 + 0 + 0 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c + stm32f4xx_hal_uart.c + 0 + 0 + + + + + Drivers/CMSIS + 0 + 0 + 0 + 0 + + 4 + 31 + 1 + 0 + 0 + 0 + ../Core/Src/system_stm32f4xx.c + system_stm32f4xx.c + 0 + 0 + + + + + Middlewares/FreeRTOS + 0 + 0 + 0 + 0 + + 5 + 32 + 1 + 0 + 0 + 0 + ../Middlewares/Third_Party/FreeRTOS/Source/croutine.c + croutine.c + 0 + 0 + + + 5 + 33 + 1 + 0 + 0 + 0 + ../Middlewares/Third_Party/FreeRTOS/Source/event_groups.c + event_groups.c + 0 + 0 + + + 5 + 34 + 1 + 0 + 0 + 0 + ../Middlewares/Third_Party/FreeRTOS/Source/list.c + list.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + ../Middlewares/Third_Party/FreeRTOS/Source/queue.c + queue.c + 0 + 0 + + + 5 + 36 + 1 + 0 + 0 + 0 + ../Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c + stream_buffer.c + 0 + 0 + + + 5 + 37 + 1 + 0 + 0 + 0 + ../Middlewares/Third_Party/FreeRTOS/Source/tasks.c + tasks.c + 0 + 0 + + + 5 + 38 + 1 + 0 + 0 + 0 + ../Middlewares/Third_Party/FreeRTOS/Source/timers.c + timers.c + 0 + 0 + + + 5 + 39 + 1 + 0 + 0 + 0 + ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c + cmsis_os2.c + 0 + 0 + + + 5 + 40 + 1 + 0 + 0 + 0 + ../Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c + heap_4.c + 0 + 0 + + + 5 + 41 + 1 + 0 + 0 + 0 + ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c + port.c + 0 + 0 + + + + + User/bsp + 1 + 0 + 0 + 0 + + 6 + 42 + 5 + 0 + 0 + 0 + ..\User\bsp\bsp.h + bsp.h + 0 + 0 + + + 6 + 43 + 1 + 0 + 0 + 0 + ..\User\bsp\buzzer_pwm.c + buzzer_pwm.c + 0 + 0 + + + 6 + 44 + 5 + 0 + 0 + 0 + ..\User\bsp\buzzer_pwm.h + buzzer_pwm.h + 0 + 0 + + + 6 + 45 + 1 + 0 + 0 + 0 + ..\User\bsp\delay.c + delay.c + 0 + 0 + + + 6 + 46 + 5 + 0 + 0 + 0 + ..\User\bsp\delay.h + delay.h + 0 + 0 + + + 6 + 47 + 1 + 0 + 0 + 0 + ..\User\bsp\dwt.c + dwt.c + 0 + 0 + + + 6 + 48 + 5 + 0 + 0 + 0 + ..\User\bsp\dwt.h + dwt.h + 0 + 0 + + + 6 + 49 + 1 + 0 + 0 + 0 + ..\User\bsp\gpio.c + gpio.c + 0 + 0 + + + 6 + 50 + 5 + 0 + 0 + 0 + ..\User\bsp\gpio.h + gpio.h + 0 + 0 + + + 6 + 51 + 1 + 0 + 0 + 0 + ..\User\bsp\i2c.c + i2c.c + 0 + 0 + + + 6 + 52 + 5 + 0 + 0 + 0 + ..\User\bsp\i2c.h + i2c.h + 0 + 0 + + + 6 + 53 + 1 + 0 + 0 + 0 + ..\User\bsp\led_pwm.c + led_pwm.c + 0 + 0 + + + 6 + 54 + 5 + 0 + 0 + 0 + ..\User\bsp\led_pwm.h + led_pwm.h + 0 + 0 + + + 6 + 55 + 1 + 0 + 0 + 0 + ..\User\bsp\pwm.c + pwm.c + 0 + 0 + + + 6 + 56 + 5 + 0 + 0 + 0 + ..\User\bsp\pwm.h + pwm.h + 0 + 0 + + + 6 + 57 + 1 + 0 + 0 + 0 + ..\User\bsp\spi.c + spi.c + 0 + 0 + + + 6 + 58 + 5 + 0 + 0 + 0 + ..\User\bsp\spi.h + spi.h + 0 + 0 + + + 6 + 59 + 1 + 0 + 0 + 0 + ..\User\bsp\time.c + time.c + 0 + 0 + + + 6 + 60 + 5 + 0 + 0 + 0 + ..\User\bsp\time.h + time.h + 0 + 0 + + + 6 + 61 + 1 + 0 + 0 + 0 + ..\User\bsp\uart.c + uart.c + 0 + 0 + + + 6 + 62 + 5 + 0 + 0 + 0 + ..\User\bsp\uart.h + uart.h + 0 + 0 + + + + + User/device + 0 + 0 + 0 + 0 + + 7 + 63 + 1 + 0 + 0 + 0 + ..\User\device\bmi088.c + bmi088.c + 0 + 0 + + + 7 + 64 + 5 + 0 + 0 + 0 + ..\User\device\bmi088.h + bmi088.h + 0 + 0 + + + 7 + 65 + 5 + 0 + 0 + 0 + ..\User\device\device.h + device.h + 0 + 0 + + + 7 + 66 + 1 + 0 + 0 + 0 + ..\User\device\ist8310.c + ist8310.c + 0 + 0 + + + 7 + 67 + 5 + 0 + 0 + 0 + ..\User\device\ist8310.h + ist8310.h + 0 + 0 + + + 7 + 68 + 1 + 0 + 0 + 0 + ..\User\device\ps2.c + ps2.c + 0 + 0 + + + 7 + 69 + 5 + 0 + 0 + 0 + ..\User\device\ps2.h + ps2.h + 0 + 0 + + + 7 + 70 + 1 + 0 + 0 + 0 + ..\User\device\SPL06.c + SPL06.c + 0 + 0 + + + 7 + 71 + 5 + 0 + 0 + 0 + ..\User\device\SPL06.h + SPL06.h + 0 + 0 + + + + + User/component + 0 + 0 + 0 + 0 + + 8 + 72 + 1 + 0 + 0 + 0 + ..\User\component\ahrs.c + ahrs.c + 0 + 0 + + + 8 + 73 + 5 + 0 + 0 + 0 + ..\User\component\ahrs.h + ahrs.h + 0 + 0 + + + 8 + 74 + 1 + 0 + 0 + 0 + ..\User\component\filter.c + filter.c + 0 + 0 + + + 8 + 75 + 5 + 0 + 0 + 0 + ..\User\component\filter.h + filter.h + 0 + 0 + + + 8 + 76 + 1 + 0 + 0 + 0 + ..\User\component\fixed_height.c + fixed_height.c + 0 + 0 + + + 8 + 77 + 5 + 0 + 0 + 0 + ..\User\component\fixed_height.h + fixed_height.h + 0 + 0 + + + 8 + 78 + 1 + 0 + 0 + 0 + ..\User\component\pid.c + pid.c + 0 + 0 + + + 8 + 79 + 5 + 0 + 0 + 0 + ..\User\component\pid.h + pid.h + 0 + 0 + + + 8 + 80 + 1 + 0 + 0 + 0 + ..\User\component\user_math.c + user_math.c + 0 + 0 + + + 8 + 81 + 5 + 0 + 0 + 0 + ..\User\component\user_math.h + user_math.h + 0 + 0 + + + + + User/module + 0 + 0 + 0 + 0 + + 9 + 82 + 1 + 0 + 0 + 0 + ..\User\module\config.c + config.c + 0 + 0 + + + 9 + 83 + 1 + 0 + 0 + 0 + ..\User\module\easy_control.c + easy_control.c + 0 + 0 + + + 9 + 84 + 5 + 0 + 0 + 0 + ..\User\module\easy_control.h + easy_control.h + 0 + 0 + + + + + User/task + 0 + 0 + 0 + 0 + + 10 + 85 + 1 + 0 + 0 + 0 + ..\User\task\atti_esti.c + atti_esti.c + 0 + 0 + + + 10 + 86 + 1 + 0 + 0 + 0 + ..\User\task\height_cal.c + height_cal.c + 0 + 0 + + + 10 + 87 + 1 + 0 + 0 + 0 + ..\User\task\init.c + init.c + 0 + 0 + + + 10 + 88 + 1 + 0 + 0 + 0 + ..\User\task\main_control.c + main_control.c + 0 + 0 + + + 10 + 89 + 1 + 0 + 0 + 0 + ..\User\task\ps2.c + ps2.c + 0 + 0 + + + 10 + 90 + 1 + 0 + 0 + 0 + ..\User\task\test1.c + test1.c + 0 + 0 + + + 10 + 91 + 1 + 0 + 0 + 0 + ..\User\task\user_task.c + user_task.c + 0 + 0 + + + 10 + 92 + 5 + 0 + 0 + 0 + ..\User\task\user_task.h + user_task.h + 0 + 0 + + + + + ::CMSIS + 0 + 0 + 0 + 1 + + +
diff --git a/MDK-ARM/DveC.uvprojx b/MDK-ARM/DveC.uvprojx new file mode 100644 index 0000000..6314f2a --- /dev/null +++ b/MDK-ARM/DveC.uvprojx @@ -0,0 +1,922 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + DveC + 0x4 + ARM-ADS + 6160000::V6.16::ARMCLANG + 1 + + + STM32F407IGHx + STMicroelectronics + Keil.STM32F4xx_DFP.2.15.0 + http://www.keil.com/pack/ + IRAM(0x20000000-0x2001BFFF) IRAM2(0x2001C000-0x2001FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) FPU2 CPUTYPE("Cortex-M4") TZ + + + + 0 + + + + + + + + + + + $$Device:STM32F407IGHx$CMSIS\SVD\STM32F40x.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + DveC\ + DveC + 1 + 0 + 1 + 1 + 1 + + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 1 + + + 0 + 0 + 0 + 0 + + 1 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 0 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4101 + + 1 + BIN\UL2V8M.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 1 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x1c000 + + + 1 + 0x8000000 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x1c000 + + + 0 + 0x2001c000 + 0x4000 + + + + + + 1 + 2 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 3 + 3 + 1 + 1 + 0 + 0 + 0 + + + USE_HAL_DRIVER,STM32F407xx + + ../Core/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy;../Middlewares/Third_Party/FreeRTOS/Source/include;../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2;../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F;../Drivers/CMSIS/Device/ST/STM32F4xx/Include;../Drivers/CMSIS/Include;..\User + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + + + + + ../Core/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy;../Middlewares/Third_Party/FreeRTOS/Source/include;../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2;../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F;../Drivers/CMSIS/Device/ST/STM32F4xx/Include;../Drivers/CMSIS/Include + + + + 1 + 0 + 0 + 0 + 1 + 0 + + + + + + + + + + + + + + + Application/MDK-ARM + + + startup_stm32f407xx.s + 2 + startup_stm32f407xx.s + + + + + Application/User/Core + + + main.c + 1 + ../Core/Src/main.c + + + gpio.c + 1 + ../Core/Src/gpio.c + + + freertos.c + 1 + ../Core/Src/freertos.c + + + dma.c + 1 + ../Core/Src/dma.c + + + i2c.c + 1 + ../Core/Src/i2c.c + + + spi.c + 1 + ../Core/Src/spi.c + + + tim.c + 1 + ../Core/Src/tim.c + + + usart.c + 1 + ../Core/Src/usart.c + + + stm32f4xx_it.c + 1 + ../Core/Src/stm32f4xx_it.c + + + stm32f4xx_hal_msp.c + 1 + ../Core/Src/stm32f4xx_hal_msp.c + + + + + Drivers/STM32F4xx_HAL_Driver + + + stm32f4xx_hal_rcc.c + 1 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c + + + stm32f4xx_hal_rcc_ex.c + 1 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c + + + stm32f4xx_hal_flash.c + 1 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c + + + stm32f4xx_hal_flash_ex.c + 1 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c + + + stm32f4xx_hal_flash_ramfunc.c + 1 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c + + + stm32f4xx_hal_gpio.c + 1 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c + + + stm32f4xx_hal_dma_ex.c + 1 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c + + + stm32f4xx_hal_dma.c + 1 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c + + + stm32f4xx_hal_pwr.c + 1 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c + + + stm32f4xx_hal_pwr_ex.c + 1 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c + + + stm32f4xx_hal_cortex.c + 1 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c + + + stm32f4xx_hal.c + 1 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c + + + stm32f4xx_hal_exti.c + 1 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c + + + stm32f4xx_hal_i2c.c + 1 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c + + + stm32f4xx_hal_i2c_ex.c + 1 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c + + + stm32f4xx_hal_spi.c + 1 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c + + + stm32f4xx_hal_tim.c + 1 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c + + + stm32f4xx_hal_tim_ex.c + 1 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c + + + stm32f4xx_hal_uart.c + 1 + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c + + + + + Drivers/CMSIS + + + system_stm32f4xx.c + 1 + ../Core/Src/system_stm32f4xx.c + + + + + Middlewares/FreeRTOS + + + croutine.c + 1 + ../Middlewares/Third_Party/FreeRTOS/Source/croutine.c + + + event_groups.c + 1 + ../Middlewares/Third_Party/FreeRTOS/Source/event_groups.c + + + list.c + 1 + ../Middlewares/Third_Party/FreeRTOS/Source/list.c + + + queue.c + 1 + ../Middlewares/Third_Party/FreeRTOS/Source/queue.c + + + stream_buffer.c + 1 + ../Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c + + + tasks.c + 1 + ../Middlewares/Third_Party/FreeRTOS/Source/tasks.c + + + timers.c + 1 + ../Middlewares/Third_Party/FreeRTOS/Source/timers.c + + + cmsis_os2.c + 1 + ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c + + + heap_4.c + 1 + ../Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c + + + port.c + 1 + ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c + + + + + User/bsp + + + bsp.h + 5 + ..\User\bsp\bsp.h + + + buzzer_pwm.c + 1 + ..\User\bsp\buzzer_pwm.c + + + buzzer_pwm.h + 5 + ..\User\bsp\buzzer_pwm.h + + + delay.c + 1 + ..\User\bsp\delay.c + + + delay.h + 5 + ..\User\bsp\delay.h + + + dwt.c + 1 + ..\User\bsp\dwt.c + + + dwt.h + 5 + ..\User\bsp\dwt.h + + + gpio.c + 1 + ..\User\bsp\gpio.c + + + gpio.h + 5 + ..\User\bsp\gpio.h + + + i2c.c + 1 + ..\User\bsp\i2c.c + + + i2c.h + 5 + ..\User\bsp\i2c.h + + + led_pwm.c + 1 + ..\User\bsp\led_pwm.c + + + led_pwm.h + 5 + ..\User\bsp\led_pwm.h + + + pwm.c + 1 + ..\User\bsp\pwm.c + + + pwm.h + 5 + ..\User\bsp\pwm.h + + + spi.c + 1 + ..\User\bsp\spi.c + + + spi.h + 5 + ..\User\bsp\spi.h + + + time.c + 1 + ..\User\bsp\time.c + + + time.h + 5 + ..\User\bsp\time.h + + + uart.c + 1 + ..\User\bsp\uart.c + + + uart.h + 5 + ..\User\bsp\uart.h + + + + + User/device + + + bmi088.c + 1 + ..\User\device\bmi088.c + + + bmi088.h + 5 + ..\User\device\bmi088.h + + + device.h + 5 + ..\User\device\device.h + + + ist8310.c + 1 + ..\User\device\ist8310.c + + + ist8310.h + 5 + ..\User\device\ist8310.h + + + ps2.c + 1 + ..\User\device\ps2.c + + + ps2.h + 5 + ..\User\device\ps2.h + + + SPL06.c + 1 + ..\User\device\SPL06.c + + + SPL06.h + 5 + ..\User\device\SPL06.h + + + + + User/component + + + ahrs.c + 1 + ..\User\component\ahrs.c + + + ahrs.h + 5 + ..\User\component\ahrs.h + + + filter.c + 1 + ..\User\component\filter.c + + + filter.h + 5 + ..\User\component\filter.h + + + fixed_height.c + 1 + ..\User\component\fixed_height.c + + + fixed_height.h + 5 + ..\User\component\fixed_height.h + + + pid.c + 1 + ..\User\component\pid.c + + + pid.h + 5 + ..\User\component\pid.h + + + user_math.c + 1 + ..\User\component\user_math.c + + + user_math.h + 5 + ..\User\component\user_math.h + + + + + User/module + + + config.c + 1 + ..\User\module\config.c + + + easy_control.c + 1 + ..\User\module\easy_control.c + + + easy_control.h + 5 + ..\User\module\easy_control.h + + + + + User/task + + + atti_esti.c + 1 + ..\User\task\atti_esti.c + + + height_cal.c + 1 + ..\User\task\height_cal.c + + + init.c + 1 + ..\User\task\init.c + + + main_control.c + 1 + ..\User\task\main_control.c + + + ps2.c + 1 + ..\User\task\ps2.c + + + test1.c + 1 + ..\User\task\test1.c + + + user_task.c + 1 + ..\User\task\user_task.c + + + user_task.h + 5 + ..\User\task\user_task.h + + + + + ::CMSIS + + + + + + + + + + + + + + + + + + + + + + DveC + 1 + + + + +
diff --git a/MDK-ARM/DveC/DveC.axf b/MDK-ARM/DveC/DveC.axf new file mode 100644 index 0000000000000000000000000000000000000000..1a6cc2c7b49cda61fee47e8473690b3a68eb5227 GIT binary patch literal 411040 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

yTPnvNkz^aMg5_F@)t?Gc0zROK1ufW-m=0 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 literal 0 HcmV?d00001 diff --git a/MDK-ARM/DveC/DveC.build_log.htm b/MDK-ARM/DveC/DveC.build_log.htm new file mode 100644 index 0000000..7a39646 --- /dev/null +++ b/MDK-ARM/DveC/DveC.build_log.htm @@ -0,0 +1,61 @@ + + +

+

Vision Build Log

+

Tool Versions:

+IDE-Version: Vision V5.34.0.0 +Copyright (C) 2021 ARM Ltd and ARM Germany GmbH. All rights reserved. +License Information: jasmine yxm2389287465@outlook.com, qut, LIC=JL28G-VQ49I-NNHAF-6ERW1-ZPP1C-KLZJD + +Tool Versions: +Toolchain: MDK-ARM Plus Version: 5.34.0.0 +Toolchain Path: D:\cangming\ARM\ARMCLANG\Bin +C Compiler: ArmClang.exe V6.16 +Assembler: Armasm.exe V6.16 +Linker/Locator: ArmLink.exe V6.16 +Library Manager: ArmAr.exe V6.16 +Hex Converter: FromElf.exe V6.16 +CPU DLL: SARMCM3.DLL V5.34.0.0 +Dialog DLL: DCM.DLL V1.17.3.0 +Target DLL: Segger\JL2CM3.dll V2.99.38.0 +Dialog DLL: TCM.DLL V1.48.0.0 + +

Project:

+D:\CUBEMX\Quadcopter\DveC\MDK-ARM\DveC.uvprojx +Project File Date: 10/03/2025 + +

Output:

+*** Using Compiler 'V6.16', folder: 'D:\cangming\ARM\ARMCLANG\Bin' +Build target 'DveC' +Note: source file '..\User\bsp\gpio.c' - object file renamed from 'DveC\gpio.o' to 'DveC\gpio_1.o'. +Note: source file '..\User\bsp\i2c.c' - object file renamed from 'DveC\i2c.o' to 'DveC\i2c_1.o'. +Note: source file '..\User\bsp\spi.c' - object file renamed from 'DveC\spi.o' to 'DveC\spi_1.o'. +Note: source file '..\User\task\ps2.c' - object file renamed from 'DveC\ps2.o' to 'DveC\ps2_1.o'. +"DveC\DveC.axf" - 0 Error(s), 0 Warning(s). + +

Software Packages used:

+ +Package Vendor: ARM + http://www.keil.com/pack/ARM.CMSIS.5.7.0.pack + ARM.CMSIS.5.7.0 + CMSIS (Cortex Microcontroller Software Interface Standard) + * Component: CORE Version: 5.4.0 + +Package Vendor: Keil + http://www.keil.com/pack/Keil.STM32F4xx_DFP.2.15.0.pack + Keil.STM32F4xx_DFP.2.15.0 + STMicroelectronics STM32F4 Series Device Support, Drivers and Examples + +

Collection of Component include folders:

+ .\RTE\_DveC + D:\cangming\ARM\CMSIS\5.7.0\CMSIS\Core\Include + D:\cangming\keil\STM32F4xx_DFP\2.15.0\Drivers\CMSIS\Device\ST\STM32F4xx\Include + +

Collection of Component Files used:

+ + * Component: ARM::CMSIS:CORE:5.4.0 + Include file: CMSIS\Core\Include\tz_context.h +Build Time Elapsed: 00:00:00 +
+ + diff --git a/MDK-ARM/DveC/DveC.hex b/MDK-ARM/DveC/DveC.hex new file mode 100644 index 0000000..176ebff --- /dev/null +++ b/MDK-ARM/DveC/DveC.hex @@ -0,0 +1,1209 @@ +:020000040800F2 +:10000000185400202902000839250008D11E0008D4 +:100010003525000821050008592C000800000000C3 +:10002000000000000000000000000000E1250008C2 +:10003000F1050008000000007125000845260008B1 +:10004000430200084302000843020008430200087C +:10005000430200084302000843020008430200086C +:1000600043020008F50500080106000843020008E5 +:100070004302000825050008430200084302000867 +:10008000430200084302000843020008430200083C +:100090004302000843020008430200080D0600085E +:1000A000430200084302000843020008430200081C +:1000B000430200084302000843020008430200080C +:1000C00043020008430200084302000843020008FC +:1000D00043020008430200084302000843020008EC +:1000E00043020008430200084302000843020008DC +:1000F00043020008430200084302000843020008CC +:1001000043020008430200084302000843020008BB +:1001100043020008430200084302000843020008AB +:10012000430200083505000845050008550500088C +:10013000430200084302000843020008430200088B +:10014000430200084302000843020008430200087B +:10015000430200084302000843020008492C00083B +:10016000430200084302000843020008430200085B +:100170004302000843020008430200080000000098 +:10018000430200084302000800F002F800F03CF8C7 +:100190000AA090E8000C82448344AAF10107DA45E2 +:1001A00001D100F031F8AFF2090EBAE80F0013F0F8 +:1001B000010F18BFFB1A43F00103184768490000FC +:1001C00088490000103A24BF78C878C1FAD852078D +:1001D00024BF30C830C144BF04680C6070470000C1 +:1001E0000023002400250026103A28BF78C1FBD840 +:1001F000520728BF30C148BF0B6070471FB504F0DD +:100200005FFC1FBD10B510BD00F054F91146FFF79B +:10021000F5FF02F065FD00F072F903B4FFF7F2FF9D +:1002200003BC00F075F90000094880470948004701 +:10023000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE796 +:10024000FEE7FEE704480549054A064B70470000F3 +:10025000FD26000889010008184E002018540020CF +:10026000185000201850002053EA020C00F069805A +:100270002DE9F04B4FF00006002B1FBFB3FA83F5BA +:1002800003FA05F424FA05F65E4012BF1643B2FAEB +:1002900082F502FA05F4C5F120051EBF22FA05FC1D +:1002A00044EA0C04203556EA044C4FEA144418BFC3 +:1002B000641C4FF000084FF00009904271EB030CF2 +:1002C00039D3002919BFB1FA81F701FA07F6B0FA5C +:1002D00080F700FA07F6C7F120071EBF20FA07FCD7 +:1002E00046EA0C062037B6FBF4FCA7EB0507103FE7 +:1002F00007F01F0BCBF120062CFA06F60CFA0BFBCD +:1003000044BFB3460026202FA4BF5E464FF0000B2B +:100310005BEA060C08BF4FF0010B19EB0B0948EB29 +:100320000608ABFB027C06FB02CC0BFB03CCC01B1C +:1003300071EB0C01C1E70B46024641464846BDE859 +:10034000F08B13B5084318BF4FF0FF300146AFF3F1 +:100350000080BDE81C407047032A40F2308010F056 +:10036000030C00F0158011F8013BBCF1020F624450 +:1003700098BF11F801CB00F8013B38BF11F8013BE1 +:10038000A2F1040298BF00F801CB38BF00F8013B8E +:1003900011F0030300F05780083AC0F0088051F8CC +:1003A000043B083A51F804CBA0E80810F5E7121D09 +:1003B0005CBF51F8043B40F8043BAFF30080D20728 +:1003C00024BF11F8013B11F801CB48BF11F8012BF4 +:1003D00024BF00F8013B00F801CB48BF00F8012B17 +:1003E000704702F0FF0343EA032242EA024200F0B0 +:1003F00002B84FF0000200B51346944696462039E5 +:1004000022BFA0E80C50A0E80C50B1F12001BFF4CD +:10041000F7AF090728BFA0E80C5048BF0CC05DF833 +:1004200004EB890028BF40F8042B08BF704748BF81 +:1004300020F8022B11F0804F18BF00F8012B7047F5 +:1004400070477047704710B5203AC0F00B80B1E894 +:100450001850A0E81850B1E81850A0E81850203AF9 +:10046000BFF4F5AF5FEA027C24BFB1E81850A0E802 +:10047000185044BF18C918C0BDE810405FEA827C1C +:1004800024BF51F8043B40F8043B08BF7047D20733 +:1004900028BF31F8023B48BF11F8012B28BF20F8D4 +:1004A000023B48BF00F8012B70470000004870472E +:1004B000100000207546FFF7F9FFAE4605006946BB +:1004C000534620F00700854618B020B5FFF7BAFE66 +:1004D000BDE820404FF000064FF000074FF0000845 +:1004E0004FF0000BAC46ACE8C009ACE8C009ACE882 +:1004F000C009ACE8C00921F007018D46704710B56E +:100500000446AFF300802046BDE81040FFF785BEEB +:1005100001491820ABBEFEE726000200704700002C +:10052000FEE7000080B540F2DC00C2F2000000F0FF +:10053000C9F880BD80B540F2FC10C2F2000000F0A6 +:10054000C1F880BD80B540F23C10C2F2000000F05E +:10055000B9F880BD80B540F29C10C2F2000000F0F6 +:10056000B1F880BDD0F800C06FF00F024AF6AB239F +:1005700052FA8CF2CAF6AA230146A2FB0330000904 +:1005800005A31B5C40F2FF302CEA00005F2A88BF05 +:100590000430C1E916037047000610160006101655 +:1005A0008269816AB2F5005F06D06AB9022912D069 +:1005B000012914D0D1B90EE0032917D8DFE801F0E2 +:1005C000020B020F0120704703293CBF0120704736 +:1005D0001CBF00207047C06AC0F300607047C06A4B +:1005E000A0F1C070B0FA80F0400970470020704759 +:1005F0007047000080B5082000F0A8F980BD000019 +:1006000080B5102000F0A2F980BD000080B5202048 +:1006100000F09CF980BD000072B600BFFEE700004C +:1006200070B5866D044600F073FA94F8351002290F +:1006300025D105462068216C026822F0160202606E +:10064000426922F08002426109B9A16C19B10168C6 +:1006500021F008010160016821F00101016000BF83 +:1006600020680068C0070ED000F052FA401B062830 +:10067000F6D320206065032084F835000CE080204C +:100680006065012008E0E06D3F2101FA00F0B060F4 +:10069000012084F835000020002184F8341070BD5A +:1006A00090F83510022909D1052180F8351000682D +:1006B000016821F00101016000207047802141653F +:1006C00001207047F0B581B004460020009040F250 +:1006D0000000C2F200000268D4E9166048F2B513C7 +:1006E00037680821C1F64E3381403942A2FB032509 +:1006F0000CD0226813685B0708D5136823F0040345 +:100700001360B160616D41F00101616501218140BB +:10071000394208D022685269120604D5B160616D71 +:1007200041F00201616504218140394208D022680C +:100730001268920704D5B160616D41F004016165F2 +:1007400010218140394215D020680268120711D566 +:10075000B16002680168520306D4C90506D4016875 +:1007600021F00801016001E0080342D4216C09B1C5 +:1007700020468847E16D202000FA01F23A4244D039 +:1007800020680368DB0640D5B26094F83530026813 +:10079000052B1ED122F016020260426922F080026F +:1007A0004261226C0AB9A26C1AB1026822F00802F6 +:1007B00002603F208840B060012084F83500216D40 +:1007C0000020002984F8340040D02046884701B03A +:1007D000F0BD0168520310D4C90512D4016821F09C +:1007E00010010160012084F83500002084F83400F5 +:1007F00007E0A16C0029BBD1BCE7080301D4616C00 +:1008000000E0E16B09B120468847606DF0B1606D92 +:10081000C00717D0052084F835002068A90A0268AF +:1008200022F00102026000BF009A01328A42009267 +:1008300002D80268D207F7D1012084F835000020E1 +:1008400084F83400E16C09B12046884701B0F0BD5E +:100850002DE9F041044600F05BF9C4B105460220E1 +:1008600084F835000020216884F83400086820F0FE +:100870000100086026683068C0070BD000F048F916 +:10088000401B0528F6D903212022032042E0012045 +:10089000BDE8F081306848F23F01CFF21001251D1C +:1008A00000EA010C2ECDD4E9050E41EA0C011143FA +:1008B00019432943D4E90778084340EA0E01606AE6 +:1008C0003943042841EA080103D1D4E90B23114339 +:1008D000194331607169042821F0070141EA0005DC +:1008E0000CD1D4E90A1045EA010538B12046FFF7DA +:1008F00057FE18B10121402201200BE0204675610E +:10090000FFF730FEE16D3F2202FA01F18160002223 +:1009100001210020626584F83510BDE8F0810000F7 +:1009200070B540F2700604460025C2F2000603E0EE +:100930000135102D08BF70BD24FA05F0C007F7D0AF +:1009400056F82500002818BF8047F1E780B543F628 +:100950001441C4F201010A68024208BF80BD086068 +:10096000FFF7DEFF80BD00002DE9F04F83B000F1FE +:100970003E4202F1FF724FEAB22241F60047019275 +:10098000C4F2020708224FF0010E00254FF0000AC2 +:100990004FF00008B84208BF072200920AE000BFEB +:1009A00008F101080AF1040AB8F1100F05F1020577 +:1009B00000F0A4800C680EFA08FB14EA0B09EFD0D3 +:1009C0004C6804F0030CACF1010EBEF1010F11D81C +:1009D0000322876802FA05F6CA68B743AA403A4379 +:1009E00082604268C4F3001722EA0B0207FA08F794 +:1009F0003A434260BCF1030F1CD0C26803238E68E7 +:100A000003FA05F7BA4306FA05F73A43BCF1020FB9 +:100A1000C2600FD16FF0030202EA580202440AF0EA +:100A20001C060F23176A03FA06F40B69A743B340A9 +:100A30003B431362026803234F68AB409A4307F0BD +:100A40000303AB401A4317F4403F4FF0010E02601E +:100A5000A6D0002243F644030292C4F202031A68AD +:100A600043F6004442F480421A601A68C4F201045A +:100A700002F480420292029A28F003024FF6084BD9 +:100A80002244CFF6FF7B52F80B300AF00C070F26FA +:100A9000BE4023EA060C019B009E072B38BF1E4672 +:100AA00006FA07F747EA0C0342F80B30A2684B68D6 +:100AB00042EA090743F60C4CDE0258BF22EA090756 +:100AC000A760C4F2010CDCF800209E0242EA09078C +:100AD00058BF22EA0907CCF8007062689E0342EA18 +:100AE000090758BF22EA090767602268DB0342EA68 +:100AF000090358BF22EA0903236051E703B0BDE8A8 +:100B0000F08F0000002A08BF0904816170470000CF +:100B100044F23860C2F2000000687047F0B581B05E +:100B2000B0B3044690F83D0028B9002084F83C009A +:100B3000204600F0BFF8242084F83D0020680168BA +:100B400021F001010160016841F400410160016888 +:100B500021F40041016000F09DFA48F28041C0F2AA +:100B60001E0140F60012656888424FF00001C0F295 +:100B70003D0248F2A16C4FF0000338BF01219042C2 +:100B8000C0F2010C38BF0123654538BF0B4613B1D5 +:100B9000012001B0F0BD4DF68361C4F21B31A0FB12 +:100BA000011221684FEA924E4B684FF4967623F07B +:100BB0003F0343EA92434B6044F6D3530F6A0EFB64 +:100BC00006F6C1F26203A6FB033627F03F03B7091E +:100BD000654538BF970C7A1C1A430A62CA6948F205 +:100BE000A0674CF6FF73C0F20107BD4222EA030C76 +:100BF0000AD801386A00B0FBF2F001306FF31F3001 +:100C0000042898BF04202BE0A368A0F1010E9BB13B +:100C100019206843BEFBF0F00422013062F31F305C +:100C2000000512D09BB119206843BEFBF0F00422EE +:100C3000013062F31F3011E005EB4500BEFBF0F020 +:100C400001306FF31F300005ECD1012008E005EB07 +:100C50004500BEFBF0F001306FF31F3040F4004060 +:100C600040EA0C00C8610868D4E9072320F0C000FE +:100C7000104318430860886848F2FF3204F10C07FB +:100C800090438CCF18431043A6698860C86820F051 +:100C9000FF0038433043C860086840F00100086036 +:100CA00000202021206484F83D10206384F83E0059 +:100CB00001B0F0BD2DE9F04F87B00446006845F65D +:100CC0000041C4F2000100278842CDE90577CDE953 +:100CD0000377029732D045F60001C4F20001884242 +:100CE00040F09080002443F630050194C4F20205E0 +:100CF0002868122140F020002860286800F02000B9 +:100D00000190019803200290059004200690002095 +:100D1000C4F20200CDE9031400F5A05002A9FFF7C8 +:100D200023FE0194286940F480002861286900F4BA +:100D300080000190019807B0BDE8F08F43F63005C0 +:100D40000197C4F20205286840F2000840F0040050 +:100D500028602868C4F2020800F00400019001989D +:100D60000197286802AE40F00100286028684FF023 +:100D7000120900F00100019001984FF400700290F8 +:100D80004FF0030A4FF0040B08F500603146CDE93F +:100D90000397CDF814A0CDF818B0FFF7E5FD4FF498 +:100DA0008070CDE9020904A880E8800C40463146F5 +:100DB000FFF7DAFD019728694FF0C06140F40000A9 +:100DC0002861286940F2DC0500F4000001900198D8 +:100DD00046F24000C2F20005C4F202004FF4806205 +:100DE00085E883002846C5E90372C5E90577C5E9AA +:100DF00007776F62FFF72CFD002818BFFFF70CFC88 +:100E0000A563AC6307B0BDE8F08F000040F20400BA +:100E100044F23861C2F20000C2F2000100780A68B0 +:100E2000104408607047000080B543F60040C4F2EB +:100E30000200016841F400710160016841F48061C1 +:100E40000160016841F480710160032000F068F8DE +:100E50000F2000F005F800F02BF8002080BD000006 +:100E6000B0B540F20402C2F2000240F20001127872 +:100E7000C2F200014FF47A730968B3FBF2F2044640 +:100E8000B1FBF2F1084600F0F3FB0F2C4FF0010527 +:100E90000CD858B94FF0FF3021460022002500F051 +:100EA0002FF840F20800C2F2000004602846B0BDEE +:100EB00080B582B0002043F640010190C4F20201E7 +:100EC0004A6842F480424A604A6802F480420192D1 +:100ED000019A00900868002240F08050086008687D +:100EE0000F2100F08050009000986FF0010000F09A +:100EF00007F802B080BD000080B501F0AFFE80BDF4 +:100F000070B514460D46064601F0B8FE2946224645 +:100F100001F014FB0146304601F0B8FE70BD000040 +:100F200080B501F0CDFE80BD2DE9F041002800F034 +:100F30008B8043F60808C4F202080446D8F8F80388 +:100F40000D4600F00700884207D288F8F853D8F819 +:100F5000F80300F00700A84276D12068810717D572 +:100F6000410705D5D8F8001041F4E051C8F8001049 +:100F7000010705D5D8F8001041F46041C8F8001009 +:100F8000D8F80010A26821F0F0011143C8F8001051 +:100F9000C0073FD1D8F8F80300F00700A84207D9EE +:100FA00088F8F853D8F8F80300F00700A8424BD1AE +:100FB0002068410707D5D8F80010E26821F4E05115 +:100FC0001143C8F80010000708D5D8F800002169BF +:100FD00020F4604040EAC100C8F8000000F07EF84C +:100FE000D8F8001044F6DA22C1F30311C0F600026B +:100FF000515C40F2000220FA01F140F20800C2F216 +:1010000000000068C2F200021160FFF729FF002013 +:10101000BDE8F0816068811E022907D258F8081CDB +:1010200089015CBF0120BDE8F08110E0012807D1F3 +:1010300058F8081C89035CBF0120BDE8F08106E078 +:1010400058F8081C890702D40120BDE8F081D8F8BF +:10105000001021F003010843C8F80000FFF758FD15 +:10106000064641F2883700BFD8F80000616800F0FA +:101070000C00B0EB810F8DD0FFF74AFD801BB8420A +:10108000F2D90320BDE8F08140F20000C2F2000076 +:101090000068704780B5FFF7F7FF43F60801C4F218 +:1010A0000201096844F6EA22C1F38221C0F6000277 +:1010B000515CC84080BD000080B5FFF7E5FF43F6F6 +:1010C0000801C4F20201096844F6EA22C1F3423180 +:1010D000C0F60002515CC84080BD000010B543F668 +:1010E0000404C4F20204606800F00C0008280AD06E +:1010F000042819BF42F20040C0F2F40041F600306B +:10110000C0F2B70010BD206821682368490241F68B +:101110000031C0F2B70100F03F02C3F388105CBF9A +:1011200042F20041C0F2F401A1FB00010023FFF7ED +:101130009BF821680222C1F3014102EB4101B0FB9F +:10114000F1F010BD2DE9F04182B0002800F0A2803E +:101150000446007843F60006C007C4F2020643D0F6 +:10116000B06800F00C00042805D1306880033BD53E +:101170006068C8BB8EE0B06800F00C00082802D19F +:1011800070684002F1D46568B5F5A02F0AD0B5F5B6 +:10119000803F0BD0306820F480303060306820F41D +:1011A000802006E0306840F480203060306840F4F1 +:1011B00080303060FFF7ACFC002D054611D000BF39 +:1011C0003068800310D4FFF7A3FC401B6428F7D9D4 +:1011D00022E100BFFFF79CFC401B64284FF0030096 +:1011E00055D830688003F5D4207880071AD5B068C8 +:1011F00010F00C0F09D0B06800F00C00082840F087 +:101200008A807068400200F186803068800702D5CD +:10121000E06801283ED13068216920F0F80040EAFA +:10122000C10030602078000738D4207840074CD4C3 +:10123000A5695DB3B06800F00C00082840F09E80FE +:10124000012D27D07068E16900F480028A4221D123 +:10125000216A00F03F028A421CD147F6C071626ADF +:101260000140B1EB821F15D1A26A0023CFF6FF73B4 +:1012700003EBC23200F440316FF30F02914209D107 +:10128000E16A00F07060B0EB016F03D1002002B0A2 +:10129000BDE8F081012002B0BDE8F081606900285E +:1012A00040F20000C4F2472057D00121C0F8801E50 +:1012B000FFF72EFC054600BF706F8007B5D4FFF71F +:1012C00027FC401B0228F7D9A6E0306C10F08058AC +:1012D0000AD100200190306C40F080503064306CB6 +:1012E00000F080500190019847F20007C4F2000717 +:1012F0003868C00524D4386840F480703860FFF73F +:1013000007FC05463868C0051AD4FFF701FC401BEE +:101310000228F7D980E0E068002851D00020C4F20C +:10132000472001210160FFF7F3FB05463068800785 +:101330003FF571AFFFF7ECFB401B0228F6D96BE0DD +:10134000A568052D50D0012D52D0306F20F001003E +:101350003067306F20F004004DE00021C0F8801E9F +:10136000FFF7D6FB054600BF706F80077FF55DAFC6 +:10137000FFF7CEFB401B0228F6D94DE00027C4F250 +:10138000472700203866FFF7C3FB022D05460BD127 +:101390003068800158D5FFF7BBFB401B02284FF097 +:1013A0000300F5D973E700BF306880017FF56EAFA9 +:1013B000FFF7AEFB401B02284FF00300F4D966E7AD +:1013C0000020C4F2472000210160FFF7A1FB054681 +:1013D000306880077FF526AFFFF79AFB401B022895 +:1013E0004FF00300F4D952E7306F40F0040030674B +:1013F000306F40F001003067FFF78AFB002D054693 +:1014000041F2883714D000BF306F800713D4FFF744 +:101410007FFB401BB842F7D9032002B0BDE8F08142 +:10142000FFF776FB401BB8424FF003003FF62FAFAB +:10143000306F8007F4D4B8F1000F7FF4F9AE306C50 +:1014400020F080503064F3E604F11C052FCD0843F2 +:101450000021CFF6FF7140EA821001EBC3316FF338 +:101460000F0140EA05600843706001203866FFF70D +:101470004FFB0446306880013FF508AFFFF748FB9B +:10148000001B02284FF00300F4D900E770B538B113 +:101490000446406A30B10020206104F1140007E0E6 +:1014A000012070BD6068B0F5827F03D004F11C009C +:1014B000002101600026A66294F8510020B9204660 +:1014C00084F8506000F03CF8022084F8510094E861 +:1014D0000F0001F48271056802F4044225F0400512 +:1014E0000560114403F400622369114403F0020211 +:1014F0006369114403F00102A369E569114403F42F +:101500000072114405F03802256A114405F080028A +:10151000A56A114305F4005211430160626A042177 +:1015200001EA134102F0100211444160C16921F443 +:101530000061C1610120666584F85100304670BDCC +:101540002DE9F04F87B0044643F200070068C4F26B +:1015500001070026B8420696CDE904660396029676 +:1015600002D007B0BDE8F08F43F630000196C4F218 +:101570000200416902AD41F48051416141694FF07F +:10158000020901F4805101910199019601684FF01F +:10159000010A41F00201016001684FF0030B01F004 +:1015A000020101910199019601684FF0050841F08F +:1015B000010101600068294600F0010001900198D6 +:1015C0001820029007F55440CDF80C90CDF810A0EB +:1015D000CDF814B0CDF81880FFF7C6F9802002A925 +:1015E00081E8010ECDF8188046F2404807F55040DA +:1015F0002946C4F20208FFF7B7F940F23C15C2F2DF +:1016000000054FF0C0674FF480692846C5E90087A0 +:10161000C5E90266C5E90496C5E90666C5E9086636 +:10162000FFF716F9002818BFFEF7F6FFE564AC6374 +:1016300040F29C1508F11800C2F200054021C5E9EE +:10164000000705F10800002280E806022846C5E9E7 +:101650000522C5E907226A62FFF7FAF8002818BFD9 +:10166000FEF7DAFFA564AC6307B0BDE8F08F0000B9 +:1016700080B500F0CFFF80BDB0B590F83C20012AC6 +:1016800004BF0220B0BD01F108053CCDD1E900CE78 +:1016900023F47C5322F470521A432EF4F0431A437D +:1016A0002CF4E0431A4324F4C0431A432A43C96983 +:1016B00022F48042036811435964002180F83C10F1 +:1016C0000846B0BD10B590F83C20012A4FF0020248 +:1016D00052D0012380F83C3080F83D200268D2F8D7 +:1016E00004E0D2F808C00C682EF07003234341F2E6 +:1016F000FF74C4F20004A24253600DDC40F2FF7399 +:10170000C4F200039A4215DCB2F1804F29D040F2B6 +:101710000043C4F2000322E040F2FF33C4F20103AD +:101720009A4212DC41F60003C4F200039A4218D038 +:10173000002312E040F60003C4F200039A4210D0E6 +:1017400040F60043C4F2000309E044F20003C4F28F +:1017500001039A4205D040F20043C4F201039A42C9 +:1017600004D149682CF080031943916001210022C3 +:1017700080F83D1080F83C20104610BD002804BFC2 +:101780000120704710B5044690F83D0028B90020AC +:1017900084F83C00204600F01FF8022084F83D0049 +:1017A0002068211D00F0B4FF012084F8460084F871 +:1017B0003E0084F83F0084F8400084F8410084F83B +:1017C000420084F8430084F8440084F8450084F81B +:1017D0003D00002010BD000081B0006844F20041CF +:1017E000C4F20101884201D001B07047002000908E +:1017F00043F64400C4F20200016841F40031016084 +:10180000006800F400300090009801B070470000BC +:1018100080B586B000684FF6FF71C4F200018842BF +:101820004FF000010591CDE90311CDE9011129DC4B +:1018300040F60001C4F2000188424AD040F600415F +:10184000C4F20001884240F082804FF0000C43F661 +:101850003000CDF800C0C4F202000268002342F05C +:10186000800202600068022200F080000090009870 +:101870004FF4E050019040F60040C4F2020000F541 +:1018800080505CE044F20041C4F2010188423BD048 +:101890000021C4F20101884259D14FF0000C43F6F7 +:1018A0003000CDF800C0C4F20200026842F010021D +:1018B00002600068012200F01000009000984FF4D0 +:1018C000D440019040F60040C4F2020000F5806070 +:1018D00034E04FF0000C43F63000CDF800C0C4F205 +:1018E00002000268002342F008020260006802223F +:1018F00000F00800009000984FF48040019040F6FE +:101900000040C4F202001AE00020009043F63000CC +:10191000C4F202000168032241F020010160006866 +:101920004FF0020C00F02000009000984020019041 +:1019300040F60040C4F2020000F5006002230221DC +:10194000CDE9021C01A9CDE90432FFF70DF806B07C +:1019500080BD0000B0B5044690F83C00012804BFEB +:101960000220B0BD0D464FEAB2010120032984F8E0 +:101970003C0037D8DFE801F0020A1222206829462D +:1019800000F05CFF206850F8181F0EE02068294620 +:1019900000F086FF206850F8181F16E020682946DE +:1019A00000F0B4FF206850F81C1F41F008010160EE +:1019B000016821F00401016029690FE020682946CF +:1019C00000F0D8FF206850F81C1F41F4006101604E +:1019D000016821F4806101602969090202681143EC +:1019E00001600020002184F83C10B0BD002804BF35 +:1019F0000120704710B5044690F83D0028B900203A +:101A000084F83C00204600F01FF8022084F83D00D6 +:101A10002068211D00F07CFE012084F8460084F837 +:101A20003E0084F83F0084F8400084F8410084F8C8 +:101A3000420084F8430084F8440084F8450084F8A8 +:101A40003D00002010BD000083B0006840F600019A +:101A5000C4F2000188421BD040F60041C4F20001EC +:101A6000884226D00021C4F20101884230D10020F2 +:101A7000029043F64000C4F20200416841F00101C7 +:101A80004160406800F001000290029803B0704786 +:101A90000020019043F64000C4F20200016841F0CA +:101AA00004010160006800F004000190019803B097 +:101AB00070470020009043F64000C4F20200016825 +:101AC00041F008010160006800F0080000900098F3 +:101AD00003B070477047000080B500F0AFFF0228E8 +:101AE00008BF80BD40F2B40100EBC000C2F20001AB +:101AF00001EB80000069002818BF804780BD00000E +:101B0000B0B582B0036804461868D9685A6900F015 +:101B10002F05202D01F0200505D125B1204600F02C +:101B200097FF02B0B0BD5FEA007C1EBF02F0010E5D +:101B300001F4907212EB0E024AD1226B0840C106EA +:101B40003DD5012A3BD100200190186801905868CA +:101B5000019001985869400642D4A08DE18DE28D34 +:101B6000002A1CBF401A5FEA004101D102B0B0BD9B +:101B7000216851E8031F226821F4907142E80313A1 +:101B8000002BF5D1216851E8051F226821F00101E1 +:101B900042E80513002BF5D1202184F842100021E2 +:101BA000216300BF216851E8031F226821F0100162 +:101BB00042E80313002BF5D10221616354E00106D2 +:101BC00054D44006D2D5204600F02CFF02B0B0BD60 +:101BD000C20718BF11F480725DD1420761D467E07B +:101BE000E06B016849688AB2002A44D0A38D9A420A +:101BF00041D2E185C069B0F5807F30D0206850E8DF +:101C0000030F216820F4807041E80302002AF5D117 +:101C1000206850E8050F216820F0010041E8050226 +:101C2000002AF5D1206850E8050F216820F0400017 +:101C300041E80502002AF5D1202084F84200002066 +:101C4000206300BF206850E8030F216820F01000D7 +:101C500041E80302002AF5D1E06BFEF7E1FC022027 +:101C60006063A08DE18D401A81B20FE0204600F044 +:101C7000C1FF02B0B0BDA18D91427FF477AFC069C2 +:101C8000B0F5807F7FF472AF022060632046FFF7DB +:101C900021FF02B0B0BD626C42F0010262644207F3 +:101CA00006D5BEF1000F03D0626C42F002026264FE +:101CB000820706D5BEF1000F03D0626C42F0040229 +:101CC0006264BCF1000F06D55EEA050203D0626CC7 +:101CD00042F008026264626C002A3FF447AF084099 +:101CE000800602D5204600F0B3FE20684069616C92 +:101CF00000F0400001F00801401827D0204600F015 +:101D000069FE2068406940061BD500BF206850E886 +:101D1000050F216820F0400041E80502002AF5D1B6 +:101D2000E06B70B142F6C511C0F600010165FEF727 +:101D3000B7FC00283FF41AAFE06B016D884702B092 +:101D4000B0BD2046FFF7C8FE02B0B0BD2046FFF789 +:101D5000C3FE0020606402B0B0BD0000002804BFD4 +:101D60000120704710B5044690F8410028B90020C2 +:101D700084F84000204600F021F8242084F8410037 +:101D80002068C16821F40051C160204600F0C4FE03 +:101D90002068016921F490410161416921F02A0123 +:101DA0004161C16841F40051C1600020202160649C +:101DB00084F8411084F84210606310BD70B586B09D +:101DC000044641F200402168C4F20100002681422D +:101DD0000596CDE903660296019601D006B070BD66 +:101DE00043F630010096C4F202014A6900F58230E0 +:101DF00042F020024A614A6902F020020092009AF1 +:101E000000960A6842F040020A60096801F0400149 +:101E1000009100994FF4844101910221CDE902160D +:101E2000032104910821059101A9FEF79DFD40F2CF +:101E3000FC1546F22840C2F20005C4F202004FF041 +:101E400020614FF4806285E843002846C5E90362BB +:101E5000C5E90566C5E907666E62FEF7F9FC00286C +:101E600018BFFEF7D9FB472005210022E563AC63CC +:101E7000FFF746F84720FFF73FF806B070BD0000B7 +:101E800080B500F0DBFD022808BF80BD40F2B40140 +:101E900000EBC000C2F2000101EB8000C068002826 +:101EA00018BF804780BD000080B500F0C7FD022844 +:101EB00008BF80BD40F2B40100EBC000C2F20001D7 +:101EC00001EB80004068002818BF804780BD0000FB +:101ED000FEE7000080B582B0002043F6300101909B +:101EE000C4F202010A6842F400120A600A6802F4AD +:101EF00000120192019A00900868002240F48000CC +:101F000008600868052100F48000009000980D200A +:101F1000FEF7F6FF0D20FEF7EFFF39200521002226 +:101F2000FEF7EEFF3920FEF7E7FF3A2000210022FE +:101F3000FEF7E6FF3A20FEF7DFFF3B2005210022F7 +:101F4000FEF7DEFF3B20FEF7D7FF02B080BD0000AA +:101F500080B542F20D6044F6F422C0F60000C0F6EF +:101F60000002002100F01AFF40F2D801C2F2000185 +:101F7000086080BD2DE9F04F87B04FF0000943F6AF +:101F80003000CDF81890CDE90499CDE90299CDF84B +:101F90000490C4F20200016840F2004841F04001A0 +:101FA00001600168C4F2020801F040010191019949 +:101FB000CDF80490016808F5A05741F002010160D6 +:101FC0000168002201F0020101910199CDF804900D +:101FD0000168402541F001010160016801F0010143 +:101FE00001910199CDF80490016841F02001016050 +:101FF000016801F0200101910199CDF80490016878 +:1020000041F004010160016801F0040101910199AE +:10201000CDF80490016841F080010160016801F091 +:10202000800101910199CDF80490016841F0080107 +:102030000160016801F0080101910199CDF8049057 +:10204000016841F0100101600068402100F01000BB +:10205000019001983846FEF755FDA8F58066304698 +:10206000102101224FF0100A0124FEF74BFD4046DB +:102070004BF201010122FEF745FDCDE9025402AD0C +:1020800038462946CDE90444FEF76EFC082002904C +:102090004FF4041B38462946CDE903B4FEF764FC2F +:1020A00030462946CDE902A4CDE90444FEF75CFCA4 +:1020B0003020CDE9020B08F5806029460494FEF734 +:1020C00053FC4FF4304002A981E811020220059030 +:1020D00040462946FEF748FC40462946CDE90244E1 +:1020E000CDE90444FEF740FC4FF48040CDE90209FD +:1020F000404629460494FEF737FC092005210022BA +:10210000FEF7FEFE0920FEF7F7FE0A200521002259 +:10211000FEF7F6FE0A20FEF7EFFE1720052100224B +:10212000FEF7EEFE1720FEF7E7FE07B0BDE8F08FE2 +:1021300080B540F25C2045F60001C2F20000C4F216 +:10214000000148F2A06200234FF4804CC0F201026B +:1021500080E80E00C0E9033CC0E90533C0E907335D +:10216000FEF7DCFC002818BFFEF756FA80BD000021 +:1021700080B540F2B02045F60041C2F20000C4F242 +:10218000000141F6802200234FF4804CC0F2060289 +:1021900080E80E00C0E9033CC0E90533C0E907331D +:1021A000FEF7BCFC002818BFFEF736FA80BD000021 +:1021B000B0B540F2043043F20001C2F20000C4F2B4 +:1021C00001014FF48272002380E80E0000F10C013F +:1021D0004FF0020C4FF0010E4FF40074182581E807 +:1021E00008500A21C0E90645C0E90833C0E90A31B0 +:1021F000FFF74CF9002818BFFEF70EFAB0BD00003B +:1022000080B588B040F2A43044F200420021C2F20E +:102210000000C4F201024FF6FF730791CDE90511EA +:10222000CDE90311CDE90111C0E90021C0E9021394 +:1022300001618161FFF7A2FA002818BFFEF7ECF9EF +:1022400040F2A430C2F20000FFF7D0FB002818BF14 +:10225000FEF7E2F9602001900020CDE90200059030 +:1022600040F2A430C2F2000001A90022FFF772FB85 +:10227000002818BFFEF7D0F940F2A430C2F20000E7 +:10228000FFF7C6FA08B080BD10B592B040F25C30DE +:1022900000210024C2F20000C4F201014FF6FF73D6 +:1022A0001194CDE90F44CDE90D44CDE90B44CDE9BE +:1022B0000944CDE90744CDE90544CDE90344CDE91E +:1022C0000144A72280E81600C0E90334C0E90544B0 +:1022D000FFF78CFB002818BFFEF79EF940F25C3038 +:1022E000C2F2000010A9CDE91044FFF7EBF9002875 +:1022F00018BFFEF791F9602009900020CDE90A008F +:10230000CDE90C00CDE90E0040F25C30C2F20000D5 +:1023100009A90022FFF71EFB002818BFFEF77CF971 +:1023200040F25C30C2F2000009A90422FFF712FB60 +:10233000002818BFFEF770F940F25C30C2F20000CE +:1023400009A90822FFF706FB002818BFFEF764F969 +:1023500040F25C30C2F2000009A90C22FFF7FAFA41 +:10236000002818BFFEF758F900200590CDE90300BA +:10237000CDE901004FF40051089040F25C30069125 +:10238000C2F2000001A9FFF777F9002818BFFEF795 +:1023900043F940F25C30C2F20000FFF739FA12B0A4 +:1023A00010BD000010B58AB040F2EC3040F60001DC +:1023B0000024C2F20000C4F200014FF6FF7309943A +:1023C000CDE90744CDE90544CDE90344CDE9014415 +:1023D000A72280E81600C0E903348461FFF706FBFA +:1023E000002818BFFEF718F940F2EC30C2F20000E6 +:1023F00008A9CDE90844FFF765F9002818BFFEF7E2 +:102400000BF9602001900020CDE90200059040F218 +:10241000EC30C2F2000001A90822FFF79BFA002865 +:1024200018BFFEF7F9F840F2EC30C2F20000FFF7F7 +:10243000EFF90AB010BD000010B58AB040F2344088 +:1024400040F600410024C2F20000C4F200014FF047 +:10245000FF330994CDE90744CDE90544CDE90344B0 +:10246000CDE90144A72280E81600C0E90334846165 +:10247000FFF7BCFA002818BFFEF7CEF840F2344050 +:10248000C2F2000008A9CDE90844FFF71BF90028B3 +:1024900018BFFEF7C1F8602001900020CDE90200CE +:1024A000059040F23440C2F2000001A90022FFF77B +:1024B00051FA002818BFFEF7AFF840F23440C2F2DC +:1024C000000001A90422FFF745FA002818BFFEF713 +:1024D000A3F840F23440C2F2000001A90822FFF73D +:1024E00039FA002818BFFEF797F840F23440C2F2DC +:1024F0000000FFF78DF90AB010BD000080B540F272 +:102500007C4041F20041C2F20000C4F2010100230C +:102510004FF00C0C4FF4E13280E80E00C0E90333B9 +:10252000C0E905C3C361FFF719FC002818BFFEF717 +:1025300073F880BDFEE70000FEE7000000F0070032 +:1025400080F00703042B28BF04234FF0FF3C03381F +:102550000CFA03F338BF0020994381400CFA00F0D5 +:1025600022EA00000843704700000000000000005D +:10257000EFF30980BFF36F8F154B1A681EF0100F31 +:1025800008BF20ED108A20E9F04F10602DE9090006 +:102590004FF0500080F31188BFF34F8FBFF36F8F60 +:1025A00001F014FC4FF0000080F31188BDE8090031 +:1025B00019680868B0E8F04F1EF0100F08BFB0ECC3 +:1025C000108A80F30988BFF36F8F704700BF00BF88 +:1025D000B80500200000000000000000000000001E +:1025E000074B19680868B0E8F04F80F30988BFF31B +:1025F0006F8F4FF0000080F31188704700BF00BF5D +:10260000B805002080B500F053FB80BD012000F02C +:1026100087FBFBE7B0B501380024B4EB106F1CBF9B +:102620000120B0BD4EF21005CEF2000568604FF0FB +:10263000FF300F2100F02AFB0720AC602860204605 +:10264000B0BD000080B5FEF7E1FB01F0EBFF012813 +:1026500018BF01F093FC80BD70B592B006AC204667 +:102660003021FDF7C6FE002543F640000595CDE973 +:102670000355CDE901550095C4F202000168022618 +:1026800041F080510160006800F080500090009897 +:1026900047F200000095C4F20000016841F4804157 +:1026A0000160006800F480400090009801200690CE +:1026B0004FF4803007904FF480000D9006200E906C +:1026C000A820CDE90F060420119020460C96FEF7B5 +:1026D00039FD88B90F20CDE901064FF4A0500490D0 +:1026E0004FF48050059001A805210395FEF71CFCCE +:1026F000002804BF12B070BDFDF78EFF4EF6885063 +:10270000CEF20000016841F47001016070470000E2 +:10271000B0B540F6FF3E0568C4F2000E40F2004C32 +:102720007045C4F2010C0FDCB0F1804F19D040F2BB +:102730000043C4F20003984213D040F60003C4F2F1 +:10274000000398420DD011E040F60043C4F20003AC +:10275000984206D0604504D00023C4F20103984299 +:1027600004D14B6825F0700243EA020541F6FF737D +:10277000C4F2000398420DDC70451FDCB0F1804FBD +:1027800041D040F20043C4F2000398423BD040F6EF +:10279000000321E043F6FF73C4F20103984220DCFA +:1027A00042F20003C4F2000398422CD00023C4F28A +:1027B0000103984227D0604525D029E040F6004328 +:1027C000C4F2000398421ED041F60003C4F2000395 +:1027D000984218D041F60043C4F20003984212D048 +:1027E00016E044F20003C4F2010398420BD044F611 +:1027F0000003C4F20103984205D044F20043C4F23E +:102800000103984204D1CB6825F4407243EA0205E3 +:102810000A688C684B69C46240F4806482626445D3 +:1028200004BF09690163026825F0800142F00402D7 +:1028300019430260012242610160B0BDB0B5026A75 +:10284000036A40F2004523F001030362D0F804E07C +:10285000D0F818C08C6822F0020240F48063C4F201 +:102860000105AB4242EA040205D1CC6822F00C0219 +:1028700024F0040422430C68AB4207D1D1E905538C +:102880002EF4407E45EA0E0545EA030E2CF0730354 +:102890002343C0F804E08361496841630262B0BD2C +:1028A00070B5026A036A40F2004423F01003036229 +:1028B000D0F804E0D0F818C08D6822F0200240F46F +:1028C0008063C4F20104A34242EA051207D1CD6835 +:1028D0006FF0400622F0C00206EA05152A430D6893 +:1028E000A34207D1D1E905642EF4406343EA86038D +:1028F00043EA840E2CF4E64343EA0523C0F804E0DF +:10290000836149688163026270BD000070B5026A2C +:10291000036A40F2004423F480730362D0F804E0B9 +:10292000D0F81CC08D6822F4007240F48063C4F2B9 +:102930000104A34242EA052207D1CD6840F2FF46D6 +:102940002D0222F44062B5432A430D68A34207D109 +:10295000D1E905642EF4405343EA061343EA041E0A +:102960002CF073032B43C0F804E0C3614968C163D2 +:10297000026270BD70B5D0F820C0026A40F2004615 +:1029800022F4805202624268C3690C68D1F808E000 +:1029900040F48065C4F20106B54204D14D6922F4C9 +:1029A000804242EA851223F4E64343EA042342606C +:1029B000C3612CF40056496846EA0E320164026293 +:1029C00070BD000080B5806B0021C185FFF784F8E1 +:1029D00080BD0000016851E8031F026821F4907176 +:1029E00042E80313002BF5D1016851E8051F026886 +:1029F00021F0010142E80513002BF5D1016B0129FB +:102A00000AD100BF016851E8031F026821F01001DC +:102A100042E80313002BF5D1202180F84210002159 +:102A20000163704780B50168CA6822F04002CA603D +:102A3000202180F84110FFF737FA80BD006841F28D +:102A40000041C4F20101401A18BF01204000704744 +:102A500080B582B090F8421022291ED18268B2F56A +:102A6000805F02D1016900294AD0816AB2F5805F96 +:102A700007D00AB9026922B10268526802F07F02E7 +:102A800001E0026852680A700121826A1144816281 +:102A9000C18D01390A04C18501D002B080BD016831 +:102AA000CA6822F02002CA60CA6822F48072CA6032 +:102AB0004A6922F001024A61202180F84210002177 +:102AC0004163026B012A23D1016300BF016851E811 +:102AD000031F026821F0100142E80313002BF5D117 +:102AE00001680A68D20606D5002201920A6801929E +:102AF000496801910199818DFEF7ECFF02B080BD1C +:102B00000168826A49686FF35F2111800221BCE786 +:102B1000FFF7B6F902B080BD10B504460068D4E9ED +:102B200002C22369016921F44051114301616269C4 +:102B300043EA0C01E3691143C268194349F20C638B +:102B40009A431143C1604169A26921F4407141F285 +:102B50000043114340F48062C4F201039A42416190 +:102B600002D1FEF7A9FA01E0FEF794FAE169636881 +:102B70001922B1F5004FA0FB02011CD15A00DB0F56 +:102B8000FDF772FB48F21F51C5F2EB11A0FB0123C8 +:102B90005A096FF0630302FB0300322303EBC0000A +:102BA000A0FB01014FF4F87000EA111000EB0210D5 +:102BB000C1F342111AE09A009B0FFDF755FB48F252 +:102BC0001F51C5F2EB11A0FB01235A096FF06303FB +:102BD00002FB0300322303EB0010A0FB0101F020F5 +:102BE00000EA511000EB0210C1F3431122680843C0 +:102BF000906010BD90F84110212923D18168B1F572 +:102C0000805F01D1016931B1016A02684B1C036226 +:102C10000978516007E0016A036831F8022B6FF30D +:102C20005F225A600162C18C01390A04C18418BF55 +:102C300070470068C16821F08001C160C16841F03F +:102C40004001C1607047000080B540F27C40C2F294 +:102C50000000FEF755FF80BDFEE70000002848BFDA +:102C6000704700F01F01012202FA01F14EF200123A +:102C70004009CEF2000242F8201070474EF60C5088 +:102C8000CEF200000068C0F3022070474EF61453E5 +:102C900000F00F02CEF2000309011A4400F1604374 +:102CA000B0F1FF3FC8BF03F56442117070470000E8 +:102CB0004EF61F50CEF20000002101707047000058 +:102CC0004EF60C51CEF200010A684FF6FF031A408F +:102CD00060F30A2242F0806040F0FD7008607047A7 +:102CE000FEF7A2F8FFF7B8FCFFF744F9FFF7F2F898 +:102CF000FFF71EFAFFF73CFAFFF7C6FAFFF752FBA1 +:102D0000FFF79AFBFFF77CFAFFF752FAFFF7F6FBA3 +:102D100000F016F8FFF71CF900F026F8FEE70000B7 +:102D2000EFF3058100291CBF6FF0050070470028F4 +:102D300004BF0020704780B500F074FF002080BD04 +:102D4000EFF3058000281CBF6FF00500704740F2CC +:102D5000B000C2F200000168002911BF4FF0FF303F +:102D6000012101600020704710B5EFF305800028B5 +:102D70001CBF6FF0050010BD40F2B004C2F20004A9 +:102D8000206801281CBF4FF0FF3010BDFFF73AFC50 +:102D90000220206000F0C0FF002010BD70B584B09C +:102DA0008E46002100280391EFF3058146D00029CB +:102DB00044D1FAB19369002B08BF1823382B16D8D9 +:102DC0001179C90713D15569946811684FEA950CB8 +:102DD000002D08BF4FF0800CFCB1D6685C2E1BD3D1 +:102DE000D5B11569C5B10024012555B91BE00020F6 +:102DF00004B070BD0124002118234FF0800C002581 +:102E00008DB1946812690294CDE90032624673462E +:102E100001F0CCFB039011E00CB9D4689CB1002503 +:102E20000024002DEDD14CB103AC00931FFA8CF2BD +:102E30007346019401F086FB012802D1039804B087 +:102E400070BD0020E6E71469B4FA84F46409D6E79B +:102E5000F0B581B00D4644F6046140F2B856C2F2B6 +:102E60000001C2F200060F6831680446081D00F038 +:102E700061FD601C0AD14DB13068011D44F6DC5083 +:102E8000C2F2000000F0B2FD01B0F0BD3068E419FC +:102E900044600AD340F2C850C2F2000000683168B2 +:102EA000043100F085FD01B0F0BD40F2C050C2F227 +:102EB000000000683168043100F07AFD44F6685083 +:102EC000C2F2000001688C4238BF046001B0F0BD5E +:102ED00070B5044600F0A2FD44F23C60C2F200006E +:102EE000016840F2B85501310160C2F2000529685D +:102EF00044F6D056C2F2000641B1306860B9286885 +:102F0000E16AC06A884298BF2C6005E02C600068C6 +:102F1000012801D100F0C4F944F24860C2F2000077 +:102F2000016801310160616444F24C61C2F2000148 +:102F3000E06A0A68904288BF086040F2D05100EB16 +:102F40008000C2F2000101EB8000211D00F04EFD67 +:102F500000F088FD306880B12868E16AC06A884264 +:102F600028BF70BD4EF60450CEF200004FF08051E5 +:102F70000160BFF34F8FBFF36F8F70BD70B582B02C +:102F800000F04CFD44F60866C2F20006306850BB03 +:102F900044F60854C2F20004204600F0F9FC44F65E +:102FA0001C55C2F20005284600F0F2FC40F2BC506D +:102FB000C2F20000046040F2CC50C2F2000040F2C5 +:102FC000C44240F2645305600025C2F20002C2F21E +:102FD00000030A201021009500F0E8FF306010B1D6 +:102FE00003A100F0E9FD00F03DFD02B070BD00BF9F +:102FF000546D725100000000F0B581B044F240659C +:10300000C2F200052868E0B144F6F05644F23C678D +:10301000C2F20006C2F2000700F000FDF068C468CA +:10302000201D00F087FC38680138386028680138B6 +:10303000286000F017FD204600F058F828680028A6 +:10304000EAD101B0F0BD000080B5026C002A08BFD3 +:1030500080BDD0E902C31344C360634524BF036845 +:10306000C360C36808461946FDF776F980BD0000C5 +:1030700070B5866B036C0446E3B115461AB3E0687D +:103080001A46FDF769F9E168206C2268091A914235 +:10309000E16003D2A16840420844E060A81EB0FA93 +:1030A00080F040093146002E18BF01210840361A31 +:1030B000002516E02068002598B9A06801F076FB8D +:1030C000A56005460DE060681A46FDF745F9216CDC +:1030D000D4E90102002508446060904224BF2068C2 +:1030E0006060711C2846A16370BD000010B50446E5 +:1030F00090F85900022808BF10BD012803D030B94C +:10310000206B00F0C7FC204600F0C4FC10BD4FF05F +:10311000500080F31188BFF36F8FBFF34F8F00BF54 +:10312000FEE7000040F2BC51C2F2000109680A68E3 +:10313000B2FA82F35B090360002A0EBF0020C86860 +:103140000068704740F63020C2F20000C21D22F035 +:10315000070210F0070CA0EB020318BF104644F65C +:10316000D452C2F200020021C2E900014FF47052B1 +:10317000BCF1000F18BF03F570520244083A40F248 +:10318000C45322F00702C2F200031A60C2E9001120 +:10319000111A1A68C0E9002144F66450C2F2000016 +:1031A000016044F65C50C2F20000016044F6305009 +:1031B000C2F20000012101707047000040F2D054BB +:1031C0004EF60455C2F20004CEF200054FF08056D0 +:1031D000FFF712FF20680228FAD32E60BFF34F8F4B +:1031E000BFF36F8FF4E70000B0B5049D002914BF52 +:1031F0002A602D60C5E90F01284601211C4600F018 +:1032000021FF85F84C40B0BD2DE9F0470A9C82466D +:10321000206B16460F46DDE908599100A522984615 +:10322000FDF7DFF8206B00EB8600A0F1040020F032 +:1032300007067FB104F13400002100BF7A5C4254DC +:103240007A5C1AB10F2901F10101F7D3002084F84B +:10325000430002E0002084F834000027201D372DB1 +:1032600028BF3725E562C4E9135700F09DFB04F140 +:10327000180000F099FBC5F13800A06130465146B6 +:10328000424624616462676584F8587000F03EFB32 +:10329000B9F1000F206018BFC9F80040BDE8F08701 +:1032A000B0B540F2D0550024C2F20005281900F054 +:1032B0006FFB1434B4F58C6FF8D144F63454C2F279 +:1032C0000004204600F064FB44F64855C2F20005B5 +:1032D000284600F05DFB44F67C50C2F2000000F08E +:1032E00057FB44F6F050C2F2000000F051FB44F6E8 +:1032F000DC50C2F2000000F04BFB40F2C050C2F2C2 +:103300000000046040F2C850C2F200000560B0BD89 +:1033100080B544F6D452C2F2000200BF11461268D2 +:103320008242FBD3D1F804C001EB0C03834203D1EA +:103330004068604448600846D0F804C000EB0C03C5 +:10334000934201D013460BE040F2C453C2F2000393 +:103350001B689A4204D0D2E9003E0EEB0C02426098 +:103360008142036018BF086080BD000080B58C46B4 +:10337000014641F804CF9445006108D99A4201D230 +:103380009C4511D240F2BC50C2F2000007E08069B7 +:10339000D21A824208D240F2CC50C2F20000006839 +:1033A00000F006FB002080BD012080BD10B5044662 +:1033B00000F034FBA06BB0FA80F0440900F052FB3F +:1033C000204610BD10B5044600F028FBA06BE16B51 +:1033D000401AB0FA80F0440900F044FB204610BDCA +:1033E00008480068006880F308884FF0000080F308 +:1033F000148862B661B6BFF34F8FBFF36F8F00DFE3 +:1034000000BF00BF08ED00E070B582B040F2BC52D2 +:10341000C2F2000212680546D2680E46D468201D2A +:1034200000F088FA94F82800410704D400F0FE0068 +:1034300084F8280010E0A0693246411920462B4646 +:10344000FFF794FF40B10026204600212A460023C2 +:10345000009601F001FB20B1216A2046884702B0A6 +:1034600070BD4FF0500080F31188BFF36F8FBFF332 +:103470004F8F00BFFEE700002DE9F04186B044F613 +:103480000867C2F20007386802A900224FF000085E +:1034900000F052FF00286AD001AC02AD0BE000F052 +:1034A000FE0086F8280000BF38682946002200F098 +:1034B00043FF00285BD00298B0F1FF3F03DCDDE959 +:1034C00003200599904702980028EDD4049E706966 +:1034D00010B1301D00F02EFA204600F0B3F802992A +:1034E0000929E1D80246DFE801F0080808052A3971 +:1034F0000808052A96F82800D1E796F82800039BCB +:10350000B16940F0010086F8280019443046FFF701 +:103510002DFF0028C8D0316A3046884796F8280029 +:103520004007C1D50398B16900230A18304600212D +:10353000CDF8008001F090FA0028B5D123E096F88C +:10354000280040F00101039886F82810B06188B186 +:10355000811830461346FFF709FFA5E796F82800C3 +:1035600081073FF59CAF304600F094FA9CE706B027 +:10357000BDE8F0814FF0500080F31188BFF36F8FEA +:10358000BFF34F8FFEE74FF0500080F31188BFF379 +:103590006F8FBFF34F8F00BFFEE7000070B582B0A2 +:1035A0000E46044600F00AFC01A800F04BF8019911 +:1035B00019B101F08DF902B070BD05464EB9A542B2 +:1035C00007D301F085F920462946FFF71DFF02B019 +:1035D00070BD4EB140F2CC50C2F2000000680068ED +:1035E000B0FA80F0420900E0002244F60860C2F21E +:1035F00000000068611B00F0F3FA01F069F900288F +:10360000D9D14EF60450CEF200004FF08051016047 +:10361000BFF34F8FBFF36F8F02B070BD40F2C05049 +:10362000C2F200000168096821B10068C068C06882 +:10363000406801E04FF0FF3044F66851C2F20001EB +:103640000860704770B5044601F000F840F2B456C7 +:10365000C2F2000631680546884203D200F008F83D +:10366000012000E0002020602846356070BD000089 +:103670002DE9F04182B040F2BC57C2F20007386831 +:10368000016891B34FF0000809E000BF606038683E +:103690002946246100F08CF93868016829B3C068B4 +:1036A000C4680668251D284600F044F9216A2046B2 +:1036B000884794F828004007EED5A0693044B0420E +:1036C000E4D82046002132460023CDF8008001F0E6 +:1036D000C3F90028E0D14FF0500080F31188BFF308 +:1036E0006F8FBFF34F8F00BFFEE740F2CC51C2F2A5 +:1036F00000010A6808603A6002B0BDE8F08100008D +:1037000081B00020009040F20C00C2F2000000687E +:103710004FF0500181F31188BFF36F8FBFF34F8FCC +:10372000013001D0FEE700BF00980028FCD001B0B6 +:103730007047000082B001AC2046FFF7F3FC01990E +:10374000FFF72CFFFFF798FEF6E70000F0B581B019 +:10375000044600F063F994F94560012E0FDB04F193 +:10376000240500BF286850B1284601F069F80028F8 +:1037700018BF00F08FFA70B2013E0128F2DCFF267C +:1037800084F8456000F06EF900F048F994F944704F +:10379000012F0EDB04F11005286850B1284601F016 +:1037A0004FF8002818BF00F075FA78B2013F0128E1 +:1037B000F2DC84F8446000F055F901B0F0BD00007F +:1037C0002DE9F04381B0044600F0F8FA40F2C45607 +:1037D000C2F200063068002808BFFFF7B3FC44F6C9 +:1037E0003058C2F2000898F80000002818BF4FF0C7 +:1037F000004020420DD0002401F06AF860071ED07E +:103800004FF0500080F31188BFF36F8FBFF34F8FDD +:10381000FEE7C4B114F0070004F108011EBF081A46 +:1038200000F108015FEA41700ED04FF0500080F3C4 +:103830001188BFF36F8FBFF34F8F00BFFEE72046A5 +:1038400001B0BDE8F083002144F65C59C2F20009E2 +:10385000D9F800004A1E8242CDD244F6D450C2F2BA +:10386000000005682F4657F8042F8A4211D22B68B2 +:103870005BB100BF1F4657F8042F28461D468A42F9 +:1038800007D22B68002BF5D103E044F6D450C2F2E6 +:10389000000033689D42AED004682B68521A112A8A +:1038A000036010D36818430709D04FF0500080F32D +:1038B0001188BFF36F8FBFF34F8F00BFFEE74260E9 +:1038C0003960FFF725FD44F664503968D9F80020C7 +:1038D000C2F200000368511A9942C9F8001038BFBB +:1038E000016098F80000396800284FF0000018BF08 +:1038F00041F00041286044F67050C2F200000268B6 +:1039000008343960511C016076E70000034643F239 +:103910000170C0F600004FF0807C21F0010103E946 +:1039200003106FF0020043F8240CA3F1440043F8A5 +:10393000202C7047D0E9013201699A60D1F804C0A7 +:1039400082688445536008BF4A60002202610868AB +:10395000013808600868704744F65003C2F200035B +:10396000036044F25060C2F20000086080201060E2 +:103970007047000044F6AC43C2F20003036044F613 +:10398000AC00C2F2000008604FF480701060704715 +:103990004FF0FF31024642F8081F00214260C0E9A3 +:1039A00003220160704700000021016170470000A0 +:1039B00080B5D1F800C01CF1010207D000F1080366 +:1039C0009E465B681A686245FAD901E0D0F810E0BB +:1039D000DEF8042008614A609160C1F808E0CEF882 +:1039E000041001680131016080BD0000D0F800C002 +:1039F000436808619A684B608A609A689960516070 +:103A00000CF1010101607047DFF80C00016841F41E +:103A100070010160704700BF88ED00E04FF050007A +:103A200080F31188BFF36F8FBFF34F8F40F20C000C +:103A3000C2F2000001684A1C026001B170474EF6F4 +:103A40000450CEF200000068000608BF70474FF037 +:103A5000500080F31188BFF36F8FBFF34F8F00BF0B +:103A6000FEE7000040F20C00C2F20000016839B12C +:103A70000139016018BF7047002080F3118870473A +:103A80004FF0500080F31188BFF36F8FBFF34F8F5B +:103A9000FEE70000B0B5002808BFB0BD044644F6FC +:103AA0003050C2F20000007854F8041C002818BFFF +:103AB0004FF0004008420CD0A4F108052A6892B1EA +:103AC0004FF0500080F31188BFF36F8FBFF34F8F1B +:103AD000FEE74FF0500080F31188BFF36F8FBFF304 +:103AE0004F8F00BFFEE721EA000044F8040C00F00D +:103AF00065F944F65C51C2F2000154F8040C0A68FE +:103B0000104408602846FFF703FC44F67450C2F2E4 +:103B1000000001680131016000F0DAFEB0BD000074 +:103B20004EF21000CEF2000000210160816040F2F0 +:103B30000001C2F20001096844F6D352C1F26202E8 +:103B4000A1FB02124FF0FF3101EB921141600721FE +:103B500001607047EFF30580102814D34EF2F03166 +:103B6000CEF20001405C44F23061C2F200010978FB +:103B7000884208D24FF0500080F31188BFF36F8F56 +:103B8000BFF34F8FFEE74EF60C50CEF2000044F22A +:103B900034610068C2F20001096800F4E060884204 +:103BA00098BF70474FF0500080F31188BFF36F8FBC +:103BB000BFF34F8FFEE7000044F6905C0022C2F294 +:103BC000000C00BF5CF8323023B10132082A08BF74 +:103BD0007047F7E70CEBC2034CF83210586070479F +:103BE00070B515460E460446FFF718FF94F84400DA +:103BF000FF2804BF002084F8440094F84500FF2803 +:103C000004BF002084F84500FFF72CFFA06B28B903 +:103C100004F1240031462A4600F05EF82046FFF702 +:103C200095FD70BD10B5D8B1044644F24460C2F2AF +:103C30000000006848B14FF0500080F31188BFF3D6 +:103C40006F8FBFF34F8F00BFFEE700F0B7F820463D +:103C50000021FFF7FDF800F03BFE002818BF10BD63 +:103C60004EF60450CEF200004FF080510160BFF3D9 +:103C70004F8FBFF36F8F10BD44F66C51C2F200013D +:103C80000968016044F60461C2F2000109684160FC +:103C90007047000044F61060C2F20000012101608C +:103CA0007047000010B568B10C4640F2B851C2F23E +:103CB000000109681831FFF77BFE20460121FFF75C +:103CC000C7F810BD4FF0500080F31188BFF36F8F1D +:103CD000BFF34F8FFEE70000B0B590B10D4640F244 +:103CE000B851C2F20001096814461831FFF77EFE90 +:103CF000002C18BF4FF0FF3528462146FFF7A8F8E3 +:103D0000B0BD4FF0500080F31188BFF36F8FBFF349 +:103D10004F8F00BFFEE7000010B586B0002405A855 +:103D200004A903AACDE90444FFF716FEDDE9032048 +:103D300005990023CDE9010143F2BD10C0F6000052 +:103D40001CA1009400F032FC44F66051C2F2000164 +:103D5000086010B100F046FE0446601C20D0012C23 +:103D60001CD14FF0500080F31188BFF36F8FBFF369 +:103D70004F8F44F66850C2F200004FF0FF310160EF +:103D800044F6D050C2F200000121016044F6046004 +:103D9000C2F200000021016000F066F806B010BD1C +:103DA0004FF0500080F31188BFF36F8FBFF34F8F38 +:103DB000FEE700BF49444C450000000044F2446067 +:103DC000C2F20000016801310160704744F24460B2 +:103DD000C2F20000006830B144F61060C2F2000088 +:103DE00001210160704744F61060C2F2000000211A +:103DF00044F24C6C0160C2F2000CDCF8001040F29E +:103E0000D05201EB8103C2F2000252F8230048B9FC +:103E100002EB8300A0F11403D9B153F8140901395E +:103E20000028F9D001EB810002EB800252F8040F68 +:103E30004368101D8342136001D1586810601068F8 +:103E400040F2B852C068C2F200021060CCF8001014 +:103E500070474FF0500080F31188BFF36F8FBFF3AE +:103E60004F8F00BFFEE7000080B582B04EF20040E9 +:103E7000CEF200004CF27021C4F20F11D0F80029EC +:103E80004B1C9A4209D14FF0500080F31188BFF3C8 +:103E90006F8FBFF34F8F00BFFEE7D0F800298A4233 +:103EA00009D14FF0500080F31188BFF36F8FBFF33B +:103EB0004F8F00BFFEE7017844F230620191FF218D +:103EC00001700178C2F200028DF803109DF8031012 +:103ED00001F05001117044F23461C2F20001072276 +:103EE0000A609DF90320B2F1FF3F0CDC0A6800BFB5 +:103EF0009DF80330013A5B008DF803309DF90330E3 +:103F0000002BF5D40A600A68032A2DD14FF4E06330 +:103F100003EA02220A6001990170D0F8201941F4E5 +:103F20007001C0F82019D0F8201941F07041C0F894 +:103F30002019FFF7F5FD40F20C00C2F2000000214D +:103F40000160FFF761FD4EF63470CEF200000168AB +:103F500041F040410160FFF743FAFFF737FFFFF7F9 +:103F6000CFFB002002B080BD4FF0500080F31188DD +:103F7000BFF36F8FBFF34F8FFEE7000080B54FF0A8 +:103F8000500080F31188BFF36F8FBFF34F8F00F0A5 +:103F900063FB30B14EF60450CEF200004FF080517A +:103FA0000160002080F3118880BD0000B0B582B0B0 +:103FB00068B11D46ABB1F1B9EAB14FF0500080F3E2 +:103FC0001188BFF36F8FBFF34F8F00BFFEE74FF035 +:103FD000500080F31188BFF36F8FBFF34F8F00BF86 +:103FE000FEE74FF0500080F31188BFF36F8FBFF3EF +:103FF0004F8F00BFFEE751B14AB94FF0500080F338 +:104000001188BFF36F8FBFF34F8F00BFFEE75023C0 +:104010000193019B502B0AD1069B019C012485F83A +:1040200046400095FFF7E0F8284602B0B0BD4FF0DB +:10403000500080F31188BFF36F8FBFF34F8F00BF25 +:10404000FEE7000070B5F8B104460E46FFF7E6FC47 +:104050002068D4E90F12002502FB0103013901FB9E +:104060000201A563C4E90103FF20E16084F8440074 +:1040700084F8450004F110007EB1FFF789FC04F1DB +:104080002400FFF785FC18E04FF0500080F3118802 +:10409000BFF36F8FBFF34F8FFEE7016869B100F088 +:1040A000CFFB50B14EF60450CEF200004FF08051DD +:1040B0000160BFF34F8FBFF36F8FFFF7D3FC012079 +:1040C00070BD00002DE9F04F83B00292B8B11D46DB +:1040D0000E460446E9B1022D03D1E06B012840F001 +:1040E0009A8000F09FFA00BB0298F0B14FF05000A8 +:1040F00080F31188BFF36F8FBFF34F8FFEE74FF050 +:10410000500080F31188BFF36F8FBFF34F8F00BF54 +:10411000FEE7206C0028DED04FF0500080F31188BD +:10412000BFF36F8FBFF34F8FFEE7FFF777FCA06BF6 +:10413000022D58D0E16B884255D304F110080120BC +:104140006F464FF0000B0DF108094FF0805A00BF89 +:104150000299002900F07B80C00702D03846FFF7A3 +:104160008BFDFFF77FFCFFF729FEFFF757FC94F864 +:104170004400FF2808BF84F844B094F84500FF28A5 +:1041800008BF84F845B0FFF76DFC3846494600F09B +:1041900095F900285ED12046FFF714F9A0B10299E5 +:1041A0004046FFF77FFD2046FFF7D0FA00F090FB76 +:1041B00078B94EF60450CEF20000C0F800A0BFF36C +:1041C0004F8FBFF36F8F04E02046FFF7BFFA00F078 +:1041D0007FFBFFF723FCA06B022D04D0E16B88422C +:1041E0004FF00000B4D2204631462A46FEF740FF89 +:1041F00054F8241FC9B1204600F022FB08B34EF644 +:104200000450CEF200004FF080510160BFF34F8F99 +:10421000BFF36F8F15E04FF0500080F31188BFF3AC +:104220006F8FBFF34F8F00BFFEE750B14EF60450C3 +:10423000CEF200004FF080510160BFF34F8FBFF30B +:104240006F8FFFF70FFC012003B0BDE8F08FFFF781 +:1042500009FC04E02046FFF779FA00F039FB002062 +:1042600003B0BDE8F08F00002DE9F04381B0E8B164 +:104270001E46914605460F4609B3022E02D1E86B51 +:10428000012837D1FFF766FCEFF311884FF050009B +:1042900080F31188BFF36F8FBFF34F8FA86B022E8F +:1042A00019D0E96B884216D300203FE04FF0500050 +:1042B00080F31188BFF36F8FBFF34F8FFEE7286C39 +:1042C0000028DAD04FF0500080F31188BFF36F8FD1 +:1042D000BFF34F8FFEE795F84540A86B2846394657 +:1042E0003246FEF7C5FEFF2C0DD0601C85F8450058 +:1042F00001201BE04FF0500080F31188BFF36F8F57 +:10430000BFF34F8FFEE755F8240F70B1284600F039 +:1043100097FA0146B9F1000F4FF0010006D00029CD +:104320001CBF0120C9F8000000E0012088F31188BB +:1043300001B0BDE8F08300002DE9F04F85B0049294 +:1043400098B10C460546002900F0A58000F06AF9F6 +:10435000A8B9049898B14FF0500080F31188BFF3CA +:104360006F8FBFF34F8F00BFFEE74FF0500080F319 +:104370001188BFF36F8FBFF34F8F00BFFEE705F1CA +:10438000240005F11009019002AF0DF1100A4FF061 +:1043900000080AE02846FFF7D9F900F099FA284604 +:1043A000FFF704F8002840F08480FFF737FBD5F8CA +:1043B00038B0BBF1000F1DD028462146FEF744FE61 +:1043C000ABF10100A863286970B1484600F038FAE3 +:1043D00050B14EF60450CEF200004FF08051016013 +:1043E000BFF34F8FBFF36F8FFFF73CFB0020012619 +:1043F000A0B95FE0049850B1B8F1000F02D138467F +:10440000FFF73AFC4FF00108012038B952E0FFF7FE +:1044100029FB0026002000284CD000BFFFF722FB1C +:10442000FFF7CCFCFFF7FAFA95F84400FF2804BF29 +:10443000002085F8440095F84500FF2804BF0020BF +:1044400085F84500FFF70EFB3846514600F036F878 +:1044500000289FD12846FEF7A9FFB0B10499019822 +:10446000FFF720FC2846FFF771F900F031FA002829 +:104470009BD14EF60450CEF200004FF08051016007 +:10448000BFF34F8FBFF36F8F8FE72846FFF75EF9BB +:1044900000F01EFA89E7286C00283FF457AF4FF070 +:1044A000500080F31188BFF36F8FBFF34F8F00BFB1 +:1044B000FEE70026304605B0BDE8F08FB0B5D0B1BC +:1044C0000D4611B30446FFF7A9FA44F60460C2F2A0 +:1044D000000001682868421C21D044F66C536268D1 +:1044E000C2F20003D3F800C091421AD323689C455E +:1044F00017D0012422E04FF0500080F31188BFF361 +:104500006F8FBFF34F8F00BFFEE74FF0500080F377 +:104510001188BFF36F8FBFF34F8F00BFFEE70024FA +:104520000CE0891A884206D9401A28602046FFF715 +:10453000A3FB002402E0002001242860FFF792FA88 +:104540002046B0BD2DE9F04383B007469000984661 +:1045500015468946FFF734F978B106465C20FFF727 +:104560002FF938B10446066354B94FF0FF3003B059 +:10457000BDE8F0833046FFF78DFA0024002CF4D01C +:10458000DDE90A10002284F85920CDE900103846F0 +:1045900049462A4643460294FEF736FE2046FEF779 +:1045A00097FC012003B0BDE8F083000070B586B031 +:1045B0000B9CCCB10C9E06B35C250495049D5C2D30 +:1045C00025D1049DDDF828C0022586F8595005AD97 +:1045D0003463CDE900C50296FEF716FE3046FEF7BD +:1045E00077FC059806B070BD4FF0500080F311883D +:1045F000BFF36F8FBFF34F8FFEE74FF0500080F394 +:104600001188BFF36F8FBFF34F8F00BFFEE74FF0EE +:10461000500080F31188BFF36F8FBFF34F8F00BF3F +:10462000FEE7000044F6D050C2F200000068002807 +:1046300004BF0120704744F24460C2F200000068E9 +:10464000B0FA80F0400940007047000044F6046072 +:10465000C2F20000006870472DE9F04F81B044F2CB +:104660004460C2F20000006840B144F67850C2F2E3 +:104670000000016800240131016092E044F604600A +:10468000C2F2000001684E1C066021D340F2C05007 +:10469000C2F200000168096849B14FF0500080F390 +:1046A0001188BFF36F8FBFF34F8F00BFFEE740F25B +:1046B000C852C2F2000201681368036044F66C50ED +:1046C0001160C2F20000016801310160FEF7A6FF2F +:1046D00044F66851C2F20001086840F2B85A40F24C +:1046E000D0588642C2F2000AC2F2000801D2002469 +:1046F00045E040F2C057C2F2000738680024006865 +:1047000098B344F24C6BC2F2000B19E0D9F82C00BC +:10471000DBF80010884288BFCBF8000000EB800077 +:1047200008EB80002946FFF761F9D9F82C00DAF888 +:104730000010C96A3A68884228BF01241068B8B1DD +:104740003868C068D0F80C904D4655F8040F864282 +:1047500010D32846FFF7EEF8D9F828000028D5D066 +:1047600009F11800FFF7E6F8D0E74FF0FF3005E059 +:104770004FF0FF3044F66851C2F200010860DAF8E9 +:104780000000C06A00EB800058F82000012844F6C1 +:104790001060C2F2000088BF01240068002818BF22 +:1047A0000124204601B0BDE8F08F0000B0B580B113 +:1047B000044640F2B850C2F200000068A0420AD09D +:1047C0004FF0500080F31188BFF36F8FBFF34F8F0E +:1047D000FEE70020B0BD206D38B3013820654FF0F2 +:1047E000000018BFB0BDE16AE26C91421CD0251DEB +:1047F0002846FFF79FF8E06CC0F13801A16144F250 +:104800004C61E062C2F200010A68904288BF086011 +:1048100040F2D05100EB8000C2F2000101EB8000B9 +:104820002946FFF7E3F80120B0BD4FF0500080F3B8 +:104830001188BFF36F8FBFF34F8F00BFFEE70000FB +:10484000B0B5C068C5687DB105F118042046FFF712 +:1048500071F844F24460C2F20000006868B144F6A6 +:104860007C50C2F200001DE04FF0500080F3118830 +:10487000BFF36F8FBFF34F8FFEE72C1D2046FFF76E +:1048800059F844F24C61C2F20001E86A0A689042A9 +:1048900088BF086040F2D05100EB8000C2F20001F6 +:1048A00001EB80002146FFF7A1F840F2B851C2F2B7 +:1048B0000001E86A0968C96A884291BF002044F68D +:1048C0001061C2F20001012088BF0860B0BD000085 +:1048D0002DE9F04F81B044F24464C2F20004206834 +:1048E00068B1FFF79BF8206801382060206880B12C +:1048F0000024FFF7B7F8204601B0BDE8F08F4FF075 +:10490000500080F31188BFF36F8FBFF34F8F00BF4C +:10491000FEE744F23C60C2F20000006800285DD06F +:1049200044F67C56C2F20006306844F61068C2F2C3 +:10493000000890B344F24C6740F2D05940F2B85BA3 +:10494000C2F20007C2F20009C2F2000B4FF0010AE6 +:10495000F068C56805F11800FEF7ECFF2C1D204635 +:10496000FEF7E8FFE86A3968884288BF386000EBE4 +:10497000800009EB80002146FFF738F8E86ADBF891 +:104980000010C96A884228BFC8F800A03068002813 +:10499000DED1002D18BFFEF741FE44F67854C2F276 +:1049A0000004256855B10126FFF756FE002818BF00 +:1049B000C8F80060013DF7D100202060D8F8000061 +:1049C00070B14EF60450CEF200004FF080510160FD +:1049D000BFF34F8F0124BFF36F8F8AE7002488E76E +:1049E000002486E780B586B0FEF7C8FA44F6086072 +:1049F000C2F20000006808B30020CDE9040005A859 +:104A000004A903AAFEF7B6FFDDE903200221DDF8C1 +:104A100014C0CDE9001043F23570C0F600000CA1BF +:104A20000023CDF808C0FFF7C1FD44F60C61C2F2C7 +:104A30000001086010B1012006B080BD4FF05000A9 +:104A400080F31188BFF36F8FBFF34F8FFEE700BF76 +:104A5000546D72205376630010B584B0A8B144F64B +:104A60000864C2F2000484462068C0B10529CDE97B +:104A70000012CDF808C015DCFFF7D4FD0146206810 +:104A8000022916D1069A694615E04FF0500080F3CE +:104A90001188BFF36F8FBFF34F8F00BFFEE7002079 +:104AA00004B010BD69461A460023FFF7DDFB04B0D1 +:104AB00010BD694600220023FFF704FB04B010BDBF +:104AC000F1EE100A4FF6FF71C0F2C03120EA01008A +:104AD00040F04070E1EE100A704700000000000056 +:104AE000000001020304060708090000000001029B +:104AF00003040000184B0008000000000000000044 +:104B0000000000000000000000020000180000008B +:104B1000000000000000000064656661756C74545C +:104B200061736B00484B000800000020100000007B +:104B3000C4010008584B0008100000200854000071 +:104B4000E0010008000000000024F4000100000063 +:084B500010000000AAAAAAAAA5 +:040000050800018965 +:00000001FF diff --git a/MDK-ARM/DveC/DveC.htm b/MDK-ARM/DveC/DveC.htm new file mode 100644 index 0000000..c52406c --- /dev/null +++ b/MDK-ARM/DveC/DveC.htm @@ -0,0 +1,2071 @@ + + +Static Call Graph - [DveC\DveC.axf] +
+

Static Call Graph for image DveC\DveC.axf


+

#<CALLGRAPH># ARM Linker, 6160001: Last Updated: Fri Oct 3 14:29:48 2025 +

+

Maximum Stack Usage = 256 bytes + Unknown(Functions without stacksize, Cycles, Untraceable Function Pointers)

+Call chain for Maximum Stack Depth:

+prvTimerTask ⇒ prvProcessReceivedCommands ⇒ prvSampleTimeNow ⇒ prvSwitchTimerLists ⇒ xTimerGenericCommand ⇒ xQueueGenericSend ⇒ xTaskResumeAll ⇒ xTaskIncrementTick +

+

+Functions with no stack information +

+ +

+

+Mutually Recursive functions +

  • ADC_IRQHandler   ⇒   ADC_IRQHandler
    +
  • BusFault_Handler   ⇒   BusFault_Handler
    +
  • HardFault_Handler   ⇒   HardFault_Handler
    +
  • MemManage_Handler   ⇒   MemManage_Handler
    +
  • NMI_Handler   ⇒   NMI_Handler
    +
  • StartDefaultTask   ⇒   StartDefaultTask
    +
  • UART_EndRxTransfer   ⇒   UART_EndRxTransfer
    +
  • UsageFault_Handler   ⇒   UsageFault_Handler
    + +

    +

    +Function Pointers +

      +
    • ADC_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • BusFault_Handler from stm32f4xx_it.o(.text.BusFault_Handler) referenced from startup_stm32f407xx.o(RESET) +
    • CAN1_RX0_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • CAN1_RX1_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • CAN1_SCE_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • CAN1_TX_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • CAN2_RX0_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • CAN2_RX1_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • CAN2_SCE_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • CAN2_TX_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • DCMI_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • DMA1_Stream0_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • DMA1_Stream1_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • DMA1_Stream2_IRQHandler from stm32f4xx_it.o(.text.DMA1_Stream2_IRQHandler) referenced from startup_stm32f407xx.o(RESET) +
    • DMA1_Stream3_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • DMA1_Stream4_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • DMA1_Stream5_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • DMA1_Stream6_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • DMA1_Stream7_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • DMA2_Stream0_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • DMA2_Stream1_IRQHandler from stm32f4xx_it.o(.text.DMA2_Stream1_IRQHandler) referenced from startup_stm32f407xx.o(RESET) +
    • DMA2_Stream2_IRQHandler from stm32f4xx_it.o(.text.DMA2_Stream2_IRQHandler) referenced from startup_stm32f407xx.o(RESET) +
    • DMA2_Stream3_IRQHandler from stm32f4xx_it.o(.text.DMA2_Stream3_IRQHandler) referenced from startup_stm32f407xx.o(RESET) +
    • DMA2_Stream4_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • DMA2_Stream5_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • DMA2_Stream6_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • DMA2_Stream7_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • DebugMon_Handler from stm32f4xx_it.o(.text.DebugMon_Handler) referenced from startup_stm32f407xx.o(RESET) +
    • ETH_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • ETH_WKUP_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • EXTI0_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • EXTI15_10_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • EXTI1_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • EXTI2_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • EXTI3_IRQHandler from stm32f4xx_it.o(.text.EXTI3_IRQHandler) referenced from startup_stm32f407xx.o(RESET) +
    • EXTI4_IRQHandler from stm32f4xx_it.o(.text.EXTI4_IRQHandler) referenced from startup_stm32f407xx.o(RESET) +
    • EXTI9_5_IRQHandler from stm32f4xx_it.o(.text.EXTI9_5_IRQHandler) referenced from startup_stm32f407xx.o(RESET) +
    • FLASH_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • FMC_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • FPU_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • HASH_RNG_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • HardFault_Handler from stm32f4xx_it.o(.text.HardFault_Handler) referenced from startup_stm32f407xx.o(RESET) +
    • I2C1_ER_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • I2C1_EV_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • I2C2_ER_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • I2C2_EV_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • I2C3_ER_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • I2C3_EV_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • MemManage_Handler from stm32f4xx_it.o(.text.MemManage_Handler) referenced from startup_stm32f407xx.o(RESET) +
    • NMI_Handler from stm32f4xx_it.o(.text.NMI_Handler) referenced from startup_stm32f407xx.o(RESET) +
    • OTG_FS_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • OTG_FS_WKUP_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • OTG_HS_EP1_IN_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • OTG_HS_EP1_OUT_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • OTG_HS_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • OTG_HS_WKUP_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • PVD_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • PendSV_Handler from port.o(.text.PendSV_Handler) referenced from startup_stm32f407xx.o(RESET) +
    • RCC_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • RTC_Alarm_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • RTC_WKUP_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • Reset_Handler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • SDIO_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • SPI1_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • SPI2_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • SPI3_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • SVC_Handler from port.o(.text.SVC_Handler) referenced from startup_stm32f407xx.o(RESET) +
    • StartDefaultTask from freertos.o(.text.StartDefaultTask) referenced 2 times from freertos.o(.text.MX_FREERTOS_Init) +
    • SysTick_Handler from stm32f4xx_it.o(.text.SysTick_Handler) referenced from startup_stm32f407xx.o(RESET) +
    • SystemInit from system_stm32f4xx.o(.text.SystemInit) referenced from startup_stm32f407xx.o(.text) +
    • TAMP_STAMP_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • TIM1_BRK_TIM9_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • TIM1_CC_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • TIM1_TRG_COM_TIM11_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • TIM1_UP_TIM10_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • TIM2_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • TIM3_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • TIM4_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • TIM5_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • TIM6_DAC_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • TIM7_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • TIM8_BRK_TIM12_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • TIM8_CC_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • TIM8_TRG_COM_TIM14_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • TIM8_UP_TIM13_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • UART4_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • UART5_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • UART_DMAAbortOnError from stm32f4xx_hal_uart.o(.text.UART_DMAAbortOnError) referenced 2 times from stm32f4xx_hal_uart.o(.text.HAL_UART_IRQHandler) +
    • USART1_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • USART2_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • USART3_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • USART6_IRQHandler from stm32f4xx_it.o(.text.USART6_IRQHandler) referenced from startup_stm32f407xx.o(RESET) +
    • UsageFault_Handler from stm32f4xx_it.o(.text.UsageFault_Handler) referenced from startup_stm32f407xx.o(RESET) +
    • WWDG_IRQHandler from startup_stm32f407xx.o(.text) referenced from startup_stm32f407xx.o(RESET) +
    • __main from __main.o(!!!main) referenced from startup_stm32f407xx.o(.text) +
    • prvIdleTask from tasks.o(.text.prvIdleTask) referenced 2 times from tasks.o(.text.vTaskStartScheduler) +
    • prvTaskExitError from port.o(.text.prvTaskExitError) referenced 2 times from port.o(.text.pxPortInitialiseStack) +
    • prvTimerTask from timers.o(.text.prvTimerTask) referenced 2 times from timers.o(.text.xTimerCreateTimerTask) +
    +

    +

    +Global Symbols +

    +

    __main (Thumb, 8 bytes, Stack size 0 bytes, __main.o(!!!main)) +

    [Calls]

    • >>   __scatterload +
    • >>   __rt_entry +
    +
    [Address Reference Count : 1]
    • startup_stm32f407xx.o(.text) +
    +

    __scatterload (Thumb, 0 bytes, Stack size unknown bytes, __scatter.o(!!!scatter)) +

    [Called By]

    • >>   __main +
    + +

    __scatterload_rt2 (Thumb, 44 bytes, Stack size unknown bytes, __scatter.o(!!!scatter), UNUSED) +

    [Calls]

    • >>   __rt_entry +
    + +

    __scatterload_rt2_thumb_only (Thumb, 0 bytes, Stack size unknown bytes, __scatter.o(!!!scatter), UNUSED) + +

    __scatterload_null (Thumb, 0 bytes, Stack size unknown bytes, __scatter.o(!!!scatter), UNUSED) + +

    __scatterload_copy (Thumb, 26 bytes, Stack size unknown bytes, __scatter_copy.o(!!handler_copy), UNUSED) +

    [Calls]

    • >>   __scatterload_copy +
    +
    [Called By]
    • >>   __scatterload_copy +
    + +

    __scatterload_zeroinit (Thumb, 28 bytes, Stack size unknown bytes, __scatter_zi.o(!!handler_zi), UNUSED) + +

    __rt_lib_init (Thumb, 0 bytes, Stack size unknown bytes, libinit.o(.ARM.Collect$$libinit$$00000000)) +

    [Called By]

    • >>   __rt_entry_li +
    + +

    __rt_lib_init_fp_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000001)) +

    [Calls]

    • >>   _fp_init +
    + +

    __rt_lib_init_alloca_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000002E)) + +

    __rt_lib_init_argv_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000002C)) + +

    __rt_lib_init_atexit_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000001B)) + +

    __rt_lib_init_clock_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000021)) + +

    __rt_lib_init_cpp_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000032)) + +

    __rt_lib_init_exceptions_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000030)) + +

    __rt_lib_init_fp_trap_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000001F)) + +

    __rt_lib_init_getenv_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000023)) + +

    __rt_lib_init_heap_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000000A)) + +

    __rt_lib_init_lc_collate_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000011)) + +

    __rt_lib_init_lc_ctype_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000013)) + +

    __rt_lib_init_lc_monetary_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000015)) + +

    __rt_lib_init_lc_numeric_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000017)) + +

    __rt_lib_init_lc_time_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000019)) + +

    __rt_lib_init_preinit_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000004)) + +

    __rt_lib_init_rand_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000000E)) + +

    __rt_lib_init_return (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000033)) + +

    __rt_lib_init_signal_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000001D)) + +

    __rt_lib_init_stdio_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$00000025)) + +

    __rt_lib_init_user_alloc_1 (Thumb, 0 bytes, Stack size unknown bytes, libinit2.o(.ARM.Collect$$libinit$$0000000C)) + +

    __rt_lib_shutdown (Thumb, 0 bytes, Stack size unknown bytes, libshutdown.o(.ARM.Collect$$libshutdown$$00000000)) +

    [Called By]

    • >>   __rt_exit_ls +
    + +

    __rt_lib_shutdown_cpp_1 (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$00000002)) + +

    __rt_lib_shutdown_fp_trap_1 (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$00000007)) + +

    __rt_lib_shutdown_heap_1 (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$0000000F)) + +

    __rt_lib_shutdown_return (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$00000010)) + +

    __rt_lib_shutdown_signal_1 (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$0000000A)) + +

    __rt_lib_shutdown_stdio_1 (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$00000004)) + +

    __rt_lib_shutdown_user_alloc_1 (Thumb, 0 bytes, Stack size unknown bytes, libshutdown2.o(.ARM.Collect$$libshutdown$$0000000C)) + +

    __rt_entry (Thumb, 0 bytes, Stack size unknown bytes, __rtentry.o(.ARM.Collect$$rtentry$$00000000)) +

    [Called By]

    • >>   __main +
    • >>   __scatterload_rt2 +
    + +

    __rt_entry_presh_1 (Thumb, 0 bytes, Stack size unknown bytes, __rtentry2.o(.ARM.Collect$$rtentry$$00000002)) + +

    __rt_entry_sh (Thumb, 0 bytes, Stack size unknown bytes, __rtentry4.o(.ARM.Collect$$rtentry$$00000004)) +

    [Stack]

    • Max Depth = 8 + Unknown Stack Size +
    • Call Chain = __rt_entry_sh ⇒ __user_setup_stackheap +
    +
    [Calls]
    • >>   __user_setup_stackheap +
    + +

    __rt_entry_li (Thumb, 0 bytes, Stack size unknown bytes, __rtentry2.o(.ARM.Collect$$rtentry$$0000000A)) +

    [Calls]

    • >>   __rt_lib_init +
    + +

    __rt_entry_postsh_1 (Thumb, 0 bytes, Stack size unknown bytes, __rtentry2.o(.ARM.Collect$$rtentry$$00000009)) + +

    __rt_entry_main (Thumb, 0 bytes, Stack size unknown bytes, __rtentry2.o(.ARM.Collect$$rtentry$$0000000D)) +

    [Stack]

    • Max Depth = 192 + Unknown Stack Size +
    • Call Chain = __rt_entry_main ⇒ main ⇒ MX_FREERTOS_Init ⇒ osThreadNew ⇒ xTaskCreate ⇒ pvPortMalloc ⇒ xTaskResumeAll ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   main +
    • >>   exit +
    + +

    __rt_entry_postli_1 (Thumb, 0 bytes, Stack size unknown bytes, __rtentry2.o(.ARM.Collect$$rtentry$$0000000C)) + +

    __rt_exit (Thumb, 0 bytes, Stack size unknown bytes, rtexit.o(.ARM.Collect$$rtexit$$00000000)) +

    [Called By]

    • >>   exit +
    + +

    __rt_exit_ls (Thumb, 0 bytes, Stack size unknown bytes, rtexit2.o(.ARM.Collect$$rtexit$$00000003)) +

    [Calls]

    • >>   __rt_lib_shutdown +
    + +

    __rt_exit_prels_1 (Thumb, 0 bytes, Stack size unknown bytes, rtexit2.o(.ARM.Collect$$rtexit$$00000002)) + +

    __rt_exit_exit (Thumb, 0 bytes, Stack size unknown bytes, rtexit2.o(.ARM.Collect$$rtexit$$00000004)) +

    [Calls]

    • >>   _sys_exit +
    + +

    Reset_Handler (Thumb, 8 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    ADC_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +

    [Calls]

    • >>   ADC_IRQHandler +
    +
    [Called By]
    • >>   ADC_IRQHandler +
    +
    [Address Reference Count : 1]
    • startup_stm32f407xx.o(RESET) +
    +

    CAN1_RX0_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    CAN1_RX1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    CAN1_SCE_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    CAN1_TX_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    CAN2_RX0_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    CAN2_RX1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    CAN2_SCE_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    CAN2_TX_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    DCMI_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    DMA1_Stream0_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    DMA1_Stream1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    DMA1_Stream3_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    DMA1_Stream4_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    DMA1_Stream5_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    DMA1_Stream6_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    DMA1_Stream7_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    DMA2_Stream0_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    DMA2_Stream4_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    DMA2_Stream5_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    DMA2_Stream6_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    DMA2_Stream7_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    ETH_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    ETH_WKUP_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    EXTI0_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    EXTI15_10_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    EXTI1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    EXTI2_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    FLASH_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    FMC_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    FPU_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    HASH_RNG_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    I2C1_ER_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    I2C1_EV_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    I2C2_ER_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    I2C2_EV_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    I2C3_ER_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    I2C3_EV_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    OTG_FS_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    OTG_FS_WKUP_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    OTG_HS_EP1_IN_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    OTG_HS_EP1_OUT_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    OTG_HS_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    OTG_HS_WKUP_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    PVD_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    RCC_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    RTC_Alarm_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    RTC_WKUP_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    SDIO_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    SPI1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    SPI2_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    SPI3_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    TAMP_STAMP_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    TIM1_BRK_TIM9_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    TIM1_CC_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    TIM1_TRG_COM_TIM11_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    TIM1_UP_TIM10_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    TIM2_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    TIM3_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    TIM4_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    TIM5_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    TIM6_DAC_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    TIM7_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    TIM8_BRK_TIM12_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    TIM8_CC_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    TIM8_TRG_COM_TIM14_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    TIM8_UP_TIM13_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    UART4_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    UART5_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    USART1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    USART2_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    USART3_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    WWDG_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f407xx.o(.text)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    __user_initial_stackheap (Thumb, 0 bytes, Stack size unknown bytes, startup_stm32f407xx.o(.text)) +

    [Called By]

    • >>   __user_setup_stackheap +
    + +

    __aeabi_uldivmod (Thumb, 0 bytes, Stack size 48 bytes, lludivv7m.o(.text)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = __aeabi_uldivmod +
    +
    [Called By]
    • >>   HAL_RCC_GetSysClockFreq +
    • >>   UART_SetConfig +
    + +

    _ll_udiv (Thumb, 240 bytes, Stack size 48 bytes, lludivv7m.o(.text), UNUSED) + +

    __aeabi_memcpy (Thumb, 0 bytes, Stack size 0 bytes, rt_memcpy_v6.o(.text)) +

    [Called By]

    • >>   prvCopyDataToQueue +
    • >>   prvCopyDataFromQueue +
    + +

    __rt_memcpy (Thumb, 138 bytes, Stack size 0 bytes, rt_memcpy_v6.o(.text), UNUSED) +

    [Calls]

    • >>   __aeabi_memcpy4 +
    + +

    _memcpy_lastbytes (Thumb, 0 bytes, Stack size unknown bytes, rt_memcpy_v6.o(.text), UNUSED) + +

    __aeabi_memset4 (Thumb, 16 bytes, Stack size 0 bytes, aeabi_memset4.o(.text)) +

    [Stack]

    • Max Depth = 4
    • Call Chain = __aeabi_memset4 ⇒ _memset_w +
    +
    [Calls]
    • >>   _memset_w +
    +
    [Called By]
    • >>   prvInitialiseNewTask +
    + +

    __aeabi_memset8 (Thumb, 0 bytes, Stack size 0 bytes, aeabi_memset4.o(.text), UNUSED) + +

    __aeabi_memclr4 (Thumb, 0 bytes, Stack size unknown bytes, rt_memclr_w.o(.text)) +

    [Called By]

    • >>   SystemClock_Config +
    + +

    __aeabi_memclr8 (Thumb, 0 bytes, Stack size unknown bytes, rt_memclr_w.o(.text), UNUSED) + +

    __rt_memclr_w (Thumb, 0 bytes, Stack size unknown bytes, rt_memclr_w.o(.text), UNUSED) + +

    _memset_w (Thumb, 74 bytes, Stack size 4 bytes, rt_memclr_w.o(.text)) +

    [Stack]

    • Max Depth = 4
    • Call Chain = _memset_w +
    +
    [Called By]
    • >>   __aeabi_memset4 +
    + +

    __use_two_region_memory (Thumb, 2 bytes, Stack size 0 bytes, heapauxi.o(.text), UNUSED) + +

    __rt_heap_escrow$2region (Thumb, 2 bytes, Stack size 0 bytes, heapauxi.o(.text), UNUSED) + +

    __rt_heap_expand$2region (Thumb, 2 bytes, Stack size 0 bytes, heapauxi.o(.text), UNUSED) + +

    __aeabi_memcpy4 (Thumb, 0 bytes, Stack size 8 bytes, rt_memcpy_w.o(.text), UNUSED) +

    [Called By]

    • >>   __rt_memcpy +
    + +

    __aeabi_memcpy8 (Thumb, 0 bytes, Stack size 8 bytes, rt_memcpy_w.o(.text), UNUSED) + +

    __rt_memcpy_w (Thumb, 100 bytes, Stack size 8 bytes, rt_memcpy_w.o(.text), UNUSED) + +

    _memcpy_lastbytes_aligned (Thumb, 0 bytes, Stack size unknown bytes, rt_memcpy_w.o(.text), UNUSED) + +

    __user_libspace (Thumb, 8 bytes, Stack size 0 bytes, libspace.o(.text), UNUSED) + +

    __user_perproc_libspace (Thumb, 0 bytes, Stack size 0 bytes, libspace.o(.text)) +

    [Called By]

    • >>   __user_setup_stackheap +
    + +

    __user_perthread_libspace (Thumb, 0 bytes, Stack size 0 bytes, libspace.o(.text), UNUSED) + +

    __user_setup_stackheap (Thumb, 74 bytes, Stack size 8 bytes, sys_stackheap_outer.o(.text)) +

    [Stack]

    • Max Depth = 8 + Unknown Stack Size +
    • Call Chain = __user_setup_stackheap +
    +
    [Calls]
    • >>   __user_initial_stackheap +
    • >>   __user_perproc_libspace +
    +
    [Called By]
    • >>   __rt_entry_sh +
    + +

    exit (Thumb, 18 bytes, Stack size 8 bytes, exit.o(.text)) +

    [Stack]

    • Max Depth = 8 + Unknown Stack Size +
    • Call Chain = exit +
    +
    [Calls]
    • >>   __rt_exit +
    +
    [Called By]
    • >>   __rt_entry_main +
    + +

    _sys_exit (Thumb, 8 bytes, Stack size 0 bytes, sys_exit.o(.text)) +

    [Called By]

    • >>   __rt_exit_exit +
    + +

    __I$use$semihosting (Thumb, 0 bytes, Stack size 0 bytes, use_no_semi.o(.text), UNUSED) + +

    __use_no_semihosting_swi (Thumb, 2 bytes, Stack size 0 bytes, use_no_semi.o(.text), UNUSED) + +

    __semihosting_library_function (Thumb, 0 bytes, Stack size unknown bytes, indicate_semi.o(.text), UNUSED) + +

    BusFault_Handler (Thumb, 2 bytes, Stack size 0 bytes, stm32f4xx_it.o(.text.BusFault_Handler)) +

    [Calls]

    • >>   BusFault_Handler +
    +
    [Called By]
    • >>   BusFault_Handler +
    +
    [Address Reference Count : 1]
    • startup_stm32f407xx.o(RESET) +
    +

    DMA1_Stream2_IRQHandler (Thumb, 16 bytes, Stack size 8 bytes, stm32f4xx_it.o(.text.DMA1_Stream2_IRQHandler)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = DMA1_Stream2_IRQHandler ⇒ HAL_DMA_IRQHandler +
    +
    [Calls]
    • >>   HAL_DMA_IRQHandler +
    +
    [Address Reference Count : 1]
    • startup_stm32f407xx.o(RESET) +
    +

    DMA2_Stream1_IRQHandler (Thumb, 16 bytes, Stack size 8 bytes, stm32f4xx_it.o(.text.DMA2_Stream1_IRQHandler)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = DMA2_Stream1_IRQHandler ⇒ HAL_DMA_IRQHandler +
    +
    [Calls]
    • >>   HAL_DMA_IRQHandler +
    +
    [Address Reference Count : 1]
    • startup_stm32f407xx.o(RESET) +
    +

    DMA2_Stream2_IRQHandler (Thumb, 16 bytes, Stack size 8 bytes, stm32f4xx_it.o(.text.DMA2_Stream2_IRQHandler)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = DMA2_Stream2_IRQHandler ⇒ HAL_DMA_IRQHandler +
    +
    [Calls]
    • >>   HAL_DMA_IRQHandler +
    +
    [Address Reference Count : 1]
    • startup_stm32f407xx.o(RESET) +
    +

    DMA2_Stream3_IRQHandler (Thumb, 16 bytes, Stack size 8 bytes, stm32f4xx_it.o(.text.DMA2_Stream3_IRQHandler)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = DMA2_Stream3_IRQHandler ⇒ HAL_DMA_IRQHandler +
    +
    [Calls]
    • >>   HAL_DMA_IRQHandler +
    +
    [Address Reference Count : 1]
    • startup_stm32f407xx.o(RESET) +
    +

    DebugMon_Handler (Thumb, 2 bytes, Stack size 0 bytes, stm32f4xx_it.o(.text.DebugMon_Handler)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    EXTI3_IRQHandler (Thumb, 10 bytes, Stack size 8 bytes, stm32f4xx_it.o(.text.EXTI3_IRQHandler)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = EXTI3_IRQHandler ⇒ HAL_GPIO_EXTI_IRQHandler ⇒ HAL_GPIO_EXTI_Callback +
    +
    [Calls]
    • >>   HAL_GPIO_EXTI_IRQHandler +
    +
    [Address Reference Count : 1]
    • startup_stm32f407xx.o(RESET) +
    +

    EXTI4_IRQHandler (Thumb, 10 bytes, Stack size 8 bytes, stm32f4xx_it.o(.text.EXTI4_IRQHandler)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = EXTI4_IRQHandler ⇒ HAL_GPIO_EXTI_IRQHandler ⇒ HAL_GPIO_EXTI_Callback +
    +
    [Calls]
    • >>   HAL_GPIO_EXTI_IRQHandler +
    +
    [Address Reference Count : 1]
    • startup_stm32f407xx.o(RESET) +
    +

    EXTI9_5_IRQHandler (Thumb, 10 bytes, Stack size 8 bytes, stm32f4xx_it.o(.text.EXTI9_5_IRQHandler)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = EXTI9_5_IRQHandler ⇒ HAL_GPIO_EXTI_IRQHandler ⇒ HAL_GPIO_EXTI_Callback +
    +
    [Calls]
    • >>   HAL_GPIO_EXTI_IRQHandler +
    +
    [Address Reference Count : 1]
    • startup_stm32f407xx.o(RESET) +
    +

    Error_Handler (Thumb, 6 bytes, Stack size 0 bytes, main.o(.text.Error_Handler)) +

    [Called By]

    • >>   HAL_UART_MspInit +
    • >>   HAL_SPI_MspInit +
    • >>   HAL_I2C_MspInit +
    • >>   SystemClock_Config +
    • >>   MX_USART6_UART_Init +
    • >>   MX_TIM5_Init +
    • >>   MX_TIM4_Init +
    • >>   MX_TIM1_Init +
    • >>   MX_TIM10_Init +
    • >>   MX_SPI1_Init +
    • >>   MX_I2C3_Init +
    • >>   MX_I2C2_Init +
    + +

    HAL_DMA_Abort (Thumb, 128 bytes, Stack size 16 bytes, stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = HAL_DMA_Abort +
    +
    [Calls]
    • >>   HAL_GetTick +
    +
    [Called By]
    • >>   HAL_UART_IRQHandler +
    + +

    HAL_DMA_Abort_IT (Thumb, 36 bytes, Stack size 0 bytes, stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT)) +

    [Called By]

    • >>   HAL_UART_IRQHandler +
    + +

    HAL_DMA_IRQHandler (Thumb, 396 bytes, Stack size 24 bytes, stm32f4xx_hal_dma.o(.text.HAL_DMA_IRQHandler)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = HAL_DMA_IRQHandler +
    +
    [Called By]
    • >>   DMA2_Stream3_IRQHandler +
    • >>   DMA2_Stream2_IRQHandler +
    • >>   DMA2_Stream1_IRQHandler +
    • >>   DMA1_Stream2_IRQHandler +
    + +

    HAL_DMA_Init (Thumb, 206 bytes, Stack size 24 bytes, stm32f4xx_hal_dma.o(.text.HAL_DMA_Init)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = HAL_DMA_Init +
    +
    [Calls]
    • >>   DMA_CheckFifoParam +
    • >>   DMA_CalcBaseAndBitshift +
    • >>   HAL_GetTick +
    +
    [Called By]
    • >>   HAL_UART_MspInit +
    • >>   HAL_SPI_MspInit +
    • >>   HAL_I2C_MspInit +
    + +

    HAL_GPIO_EXTI_Callback (Thumb, 44 bytes, Stack size 16 bytes, gpio_1.o(.text.HAL_GPIO_EXTI_Callback)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = HAL_GPIO_EXTI_Callback +
    +
    [Called By]
    • >>   HAL_GPIO_EXTI_IRQHandler +
    + +

    HAL_GPIO_EXTI_IRQHandler (Thumb, 26 bytes, Stack size 8 bytes, stm32f4xx_hal_gpio.o(.text.HAL_GPIO_EXTI_IRQHandler)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = HAL_GPIO_EXTI_IRQHandler ⇒ HAL_GPIO_EXTI_Callback +
    +
    [Calls]
    • >>   HAL_GPIO_EXTI_Callback +
    +
    [Called By]
    • >>   EXTI9_5_IRQHandler +
    • >>   EXTI4_IRQHandler +
    • >>   EXTI3_IRQHandler +
    + +

    HAL_GPIO_Init (Thumb, 410 bytes, Stack size 48 bytes, stm32f4xx_hal_gpio.o(.text.HAL_GPIO_Init)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = HAL_GPIO_Init +
    +
    [Called By]
    • >>   HAL_UART_MspInit +
    • >>   HAL_TIM_MspPostInit +
    • >>   HAL_SPI_MspInit +
    • >>   HAL_I2C_MspInit +
    • >>   MX_GPIO_Init +
    + +

    HAL_GPIO_WritePin (Thumb, 10 bytes, Stack size 0 bytes, stm32f4xx_hal_gpio.o(.text.HAL_GPIO_WritePin)) +

    [Called By]

    • >>   MX_GPIO_Init +
    + +

    HAL_GetTick (Thumb, 12 bytes, Stack size 0 bytes, stm32f4xx_hal.o(.text.HAL_GetTick)) +

    [Called By]

    • >>   HAL_DMA_Abort +
    • >>   HAL_DMA_Init +
    • >>   HAL_RCC_OscConfig +
    • >>   HAL_RCC_ClockConfig +
    + +

    HAL_I2C_Init (Thumb, 408 bytes, Stack size 24 bytes, stm32f4xx_hal_i2c.o(.text.HAL_I2C_Init)) +

    [Stack]

    • Max Depth = 136
    • Call Chain = HAL_I2C_Init ⇒ HAL_I2C_MspInit ⇒ HAL_GPIO_Init +
    +
    [Calls]
    • >>   HAL_RCC_GetPCLK1Freq +
    • >>   HAL_I2C_MspInit +
    +
    [Called By]
    • >>   MX_I2C3_Init +
    • >>   MX_I2C2_Init +
    + +

    HAL_I2C_MspInit (Thumb, 342 bytes, Stack size 64 bytes, i2c.o(.text.HAL_I2C_MspInit)) +

    [Stack]

    • Max Depth = 112
    • Call Chain = HAL_I2C_MspInit ⇒ HAL_GPIO_Init +
    +
    [Calls]
    • >>   HAL_DMA_Init +
    • >>   HAL_GPIO_Init +
    • >>   Error_Handler +
    +
    [Called By]
    • >>   HAL_I2C_Init +
    + +

    HAL_IncTick (Thumb, 26 bytes, Stack size 0 bytes, stm32f4xx_hal.o(.text.HAL_IncTick)) +

    [Called By]

    • >>   SysTick_Handler +
    + +

    HAL_Init (Thumb, 54 bytes, Stack size 8 bytes, stm32f4xx_hal.o(.text.HAL_Init)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = HAL_Init ⇒ HAL_InitTick ⇒ HAL_SYSTICK_Config ⇒ SysTick_Config +
    +
    [Calls]
    • >>   HAL_NVIC_SetPriorityGrouping +
    • >>   HAL_InitTick +
    • >>   HAL_MspInit +
    +
    [Called By]
    • >>   main +
    + +

    HAL_InitTick (Thumb, 80 bytes, Stack size 16 bytes, stm32f4xx_hal.o(.text.HAL_InitTick)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = HAL_InitTick ⇒ HAL_SYSTICK_Config ⇒ SysTick_Config +
    +
    [Calls]
    • >>   HAL_SYSTICK_Config +
    • >>   HAL_NVIC_SetPriority +
    +
    [Called By]
    • >>   HAL_RCC_ClockConfig +
    • >>   HAL_Init +
    + +

    HAL_MspInit (Thumb, 70 bytes, Stack size 16 bytes, stm32f4xx_hal_msp.o(.text.HAL_MspInit)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = HAL_MspInit ⇒ HAL_NVIC_SetPriority +
    +
    [Calls]
    • >>   HAL_NVIC_SetPriority +
    +
    [Called By]
    • >>   HAL_Init +
    + +

    HAL_NVIC_EnableIRQ (Thumb, 8 bytes, Stack size 8 bytes, stm32f4xx_hal_cortex.o(.text.HAL_NVIC_EnableIRQ)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = HAL_NVIC_EnableIRQ +
    +
    [Calls]
    • >>   __NVIC_EnableIRQ +
    +
    [Called By]
    • >>   HAL_UART_MspInit +
    • >>   MX_GPIO_Init +
    • >>   MX_DMA_Init +
    + +

    HAL_NVIC_SetPriority (Thumb, 30 bytes, Stack size 16 bytes, stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SetPriority)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = HAL_NVIC_SetPriority +
    +
    [Calls]
    • >>   __NVIC_SetPriority +
    • >>   __NVIC_GetPriorityGrouping +
    • >>   NVIC_EncodePriority +
    +
    [Called By]
    • >>   HAL_InitTick +
    • >>   HAL_MspInit +
    • >>   HAL_UART_MspInit +
    • >>   MX_GPIO_Init +
    • >>   MX_DMA_Init +
    + +

    HAL_NVIC_SetPriorityGrouping (Thumb, 8 bytes, Stack size 8 bytes, stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SetPriorityGrouping)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = HAL_NVIC_SetPriorityGrouping +
    +
    [Calls]
    • >>   __NVIC_SetPriorityGrouping +
    +
    [Called By]
    • >>   HAL_Init +
    + +

    HAL_RCC_ClockConfig (Thumb, 352 bytes, Stack size 24 bytes, stm32f4xx_hal_rcc.o(.text.HAL_RCC_ClockConfig)) +

    [Stack]

    • Max Depth = 80
    • Call Chain = HAL_RCC_ClockConfig ⇒ HAL_RCC_GetSysClockFreq ⇒ __aeabi_uldivmod +
    +
    [Calls]
    • >>   HAL_RCC_GetSysClockFreq +
    • >>   HAL_InitTick +
    • >>   HAL_GetTick +
    +
    [Called By]
    • >>   SystemClock_Config +
    + +

    HAL_RCC_GetHCLKFreq (Thumb, 12 bytes, Stack size 0 bytes, stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetHCLKFreq)) +

    [Called By]

    • >>   HAL_RCC_GetPCLK2Freq +
    • >>   HAL_RCC_GetPCLK1Freq +
    + +

    HAL_RCC_GetPCLK1Freq (Thumb, 34 bytes, Stack size 8 bytes, stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetPCLK1Freq)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = HAL_RCC_GetPCLK1Freq +
    +
    [Calls]
    • >>   HAL_RCC_GetHCLKFreq +
    +
    [Called By]
    • >>   HAL_I2C_Init +
    • >>   UART_SetConfig +
    + +

    HAL_RCC_GetPCLK2Freq (Thumb, 34 bytes, Stack size 8 bytes, stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetPCLK2Freq)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = HAL_RCC_GetPCLK2Freq +
    +
    [Calls]
    • >>   HAL_RCC_GetHCLKFreq +
    +
    [Called By]
    • >>   UART_SetConfig +
    + +

    HAL_RCC_GetSysClockFreq (Thumb, 104 bytes, Stack size 8 bytes, stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetSysClockFreq)) +

    [Stack]

    • Max Depth = 56
    • Call Chain = HAL_RCC_GetSysClockFreq ⇒ __aeabi_uldivmod +
    +
    [Calls]
    • >>   __aeabi_uldivmod +
    +
    [Called By]
    • >>   HAL_RCC_ClockConfig +
    + +

    HAL_RCC_OscConfig (Thumb, 840 bytes, Stack size 32 bytes, stm32f4xx_hal_rcc.o(.text.HAL_RCC_OscConfig)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = HAL_RCC_OscConfig +
    +
    [Calls]
    • >>   HAL_GetTick +
    +
    [Called By]
    • >>   SystemClock_Config +
    + +

    HAL_SPI_Init (Thumb, 180 bytes, Stack size 16 bytes, stm32f4xx_hal_spi.o(.text.HAL_SPI_Init)) +

    [Stack]

    • Max Depth = 128
    • Call Chain = HAL_SPI_Init ⇒ HAL_SPI_MspInit ⇒ HAL_GPIO_Init +
    +
    [Calls]
    • >>   HAL_SPI_MspInit +
    +
    [Called By]
    • >>   MX_SPI1_Init +
    + +

    HAL_SPI_MspInit (Thumb, 302 bytes, Stack size 64 bytes, spi.o(.text.HAL_SPI_MspInit)) +

    [Stack]

    • Max Depth = 112
    • Call Chain = HAL_SPI_MspInit ⇒ HAL_GPIO_Init +
    +
    [Calls]
    • >>   HAL_DMA_Init +
    • >>   HAL_GPIO_Init +
    • >>   Error_Handler +
    +
    [Called By]
    • >>   HAL_SPI_Init +
    + +

    HAL_SYSTICK_Config (Thumb, 8 bytes, Stack size 8 bytes, stm32f4xx_hal_cortex.o(.text.HAL_SYSTICK_Config)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = HAL_SYSTICK_Config ⇒ SysTick_Config +
    +
    [Calls]
    • >>   SysTick_Config +
    +
    [Called By]
    • >>   HAL_InitTick +
    + +

    HAL_TIMEx_ConfigBreakDeadTime (Thumb, 76 bytes, Stack size 16 bytes, stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_ConfigBreakDeadTime)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = HAL_TIMEx_ConfigBreakDeadTime +
    +
    [Called By]
    • >>   MX_TIM1_Init +
    + +

    HAL_TIMEx_MasterConfigSynchronization (Thumb, 184 bytes, Stack size 8 bytes, stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_MasterConfigSynchronization)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = HAL_TIMEx_MasterConfigSynchronization +
    +
    [Called By]
    • >>   MX_TIM5_Init +
    • >>   MX_TIM4_Init +
    • >>   MX_TIM1_Init +
    + +

    HAL_TIM_Base_Init (Thumb, 90 bytes, Stack size 8 bytes, stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Init)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = HAL_TIM_Base_Init ⇒ TIM_Base_SetConfig +
    +
    [Calls]
    • >>   HAL_TIM_Base_MspInit +
    • >>   TIM_Base_SetConfig +
    +
    [Called By]
    • >>   MX_TIM10_Init +
    + +

    HAL_TIM_Base_MspInit (Thumb, 54 bytes, Stack size 4 bytes, tim.o(.text.HAL_TIM_Base_MspInit)) +

    [Stack]

    • Max Depth = 4
    • Call Chain = HAL_TIM_Base_MspInit +
    +
    [Called By]
    • >>   HAL_TIM_Base_Init +
    + +

    HAL_TIM_MspPostInit (Thumb, 322 bytes, Stack size 32 bytes, tim.o(.text.HAL_TIM_MspPostInit)) +

    [Stack]

    • Max Depth = 80
    • Call Chain = HAL_TIM_MspPostInit ⇒ HAL_GPIO_Init +
    +
    [Calls]
    • >>   HAL_GPIO_Init +
    +
    [Called By]
    • >>   MX_TIM5_Init +
    • >>   MX_TIM4_Init +
    • >>   MX_TIM1_Init +
    • >>   MX_TIM10_Init +
    + +

    HAL_TIM_PWM_ConfigChannel (Thumb, 152 bytes, Stack size 16 bytes, stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_ConfigChannel)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = HAL_TIM_PWM_ConfigChannel ⇒ TIM_OC2_SetConfig +
    +
    [Calls]
    • >>   TIM_OC2_SetConfig +
    • >>   TIM_OC4_SetConfig +
    • >>   TIM_OC3_SetConfig +
    • >>   TIM_OC1_SetConfig +
    +
    [Called By]
    • >>   MX_TIM5_Init +
    • >>   MX_TIM4_Init +
    • >>   MX_TIM1_Init +
    • >>   MX_TIM10_Init +
    + +

    HAL_TIM_PWM_Init (Thumb, 90 bytes, Stack size 8 bytes, stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Init)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = HAL_TIM_PWM_Init ⇒ TIM_Base_SetConfig +
    +
    [Calls]
    • >>   HAL_TIM_PWM_MspInit +
    • >>   TIM_Base_SetConfig +
    +
    [Called By]
    • >>   MX_TIM5_Init +
    • >>   MX_TIM4_Init +
    • >>   MX_TIM1_Init +
    • >>   MX_TIM10_Init +
    + +

    HAL_TIM_PWM_MspInit (Thumb, 140 bytes, Stack size 12 bytes, tim.o(.text.HAL_TIM_PWM_MspInit)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = HAL_TIM_PWM_MspInit +
    +
    [Called By]
    • >>   HAL_TIM_PWM_Init +
    + +

    HAL_UARTEx_RxEventCallback (Thumb, 2 bytes, Stack size 0 bytes, stm32f4xx_hal_uart.o(.text.HAL_UARTEx_RxEventCallback)) +

    [Called By]

    • >>   HAL_UART_IRQHandler +
    • >>   UART_Receive_IT +
    + +

    HAL_UART_ErrorCallback (Thumb, 38 bytes, Stack size 8 bytes, uart.o(.text.HAL_UART_ErrorCallback)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = HAL_UART_ErrorCallback +
    +
    [Calls]
    • >>   UART_Get +
    +
    [Called By]
    • >>   HAL_UART_IRQHandler +
    • >>   UART_DMAAbortOnError +
    + +

    HAL_UART_IRQHandler (Thumb, 602 bytes, Stack size 24 bytes, stm32f4xx_hal_uart.o(.text.HAL_UART_IRQHandler)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = HAL_UART_IRQHandler ⇒ UART_Receive_IT ⇒ HAL_UART_RxCpltCallback +
    +
    [Calls]
    • >>   HAL_DMA_Abort_IT +
    • >>   HAL_DMA_Abort +
    • >>   HAL_UARTEx_RxEventCallback +
    • >>   UART_Transmit_IT +
    • >>   UART_Receive_IT +
    • >>   UART_EndTransmit_IT +
    • >>   UART_EndRxTransfer +
    • >>   HAL_UART_ErrorCallback +
    +
    [Called By]
    • >>   USART6_IRQHandler +
    + +

    HAL_UART_Init (Thumb, 96 bytes, Stack size 8 bytes, stm32f4xx_hal_uart.o(.text.HAL_UART_Init)) +

    [Stack]

    • Max Depth = 96
    • Call Chain = HAL_UART_Init ⇒ HAL_UART_MspInit ⇒ HAL_GPIO_Init +
    +
    [Calls]
    • >>   HAL_UART_MspInit +
    • >>   UART_SetConfig +
    +
    [Called By]
    • >>   MX_USART6_UART_Init +
    + +

    HAL_UART_MspInit (Thumb, 194 bytes, Stack size 40 bytes, usart.o(.text.HAL_UART_MspInit)) +

    [Stack]

    • Max Depth = 88
    • Call Chain = HAL_UART_MspInit ⇒ HAL_GPIO_Init +
    +
    [Calls]
    • >>   HAL_DMA_Init +
    • >>   HAL_NVIC_SetPriority +
    • >>   HAL_NVIC_EnableIRQ +
    • >>   HAL_GPIO_Init +
    • >>   Error_Handler +
    +
    [Called By]
    • >>   HAL_UART_Init +
    + +

    HAL_UART_RxCpltCallback (Thumb, 38 bytes, Stack size 8 bytes, uart.o(.text.HAL_UART_RxCpltCallback)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = HAL_UART_RxCpltCallback +
    +
    [Calls]
    • >>   UART_Get +
    +
    [Called By]
    • >>   UART_Receive_IT +
    + +

    HAL_UART_TxCpltCallback (Thumb, 38 bytes, Stack size 8 bytes, uart.o(.text.HAL_UART_TxCpltCallback)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = HAL_UART_TxCpltCallback +
    +
    [Calls]
    • >>   UART_Get +
    +
    [Called By]
    • >>   UART_EndTransmit_IT +
    + +

    HardFault_Handler (Thumb, 2 bytes, Stack size 0 bytes, stm32f4xx_it.o(.text.HardFault_Handler)) +

    [Calls]

    • >>   HardFault_Handler +
    +
    [Called By]
    • >>   HardFault_Handler +
    +
    [Address Reference Count : 1]
    • startup_stm32f407xx.o(RESET) +
    +

    MX_DMA_Init (Thumb, 122 bytes, Stack size 16 bytes, dma.o(.text.MX_DMA_Init)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = MX_DMA_Init ⇒ HAL_NVIC_SetPriority +
    +
    [Calls]
    • >>   HAL_NVIC_SetPriority +
    • >>   HAL_NVIC_EnableIRQ +
    +
    [Called By]
    • >>   main +
    + +

    MX_FREERTOS_Init (Thumb, 36 bytes, Stack size 8 bytes, freertos.o(.text.MX_FREERTOS_Init)) +

    [Stack]

    • Max Depth = 192
    • Call Chain = MX_FREERTOS_Init ⇒ osThreadNew ⇒ xTaskCreate ⇒ pvPortMalloc ⇒ xTaskResumeAll ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   osThreadNew +
    +
    [Called By]
    • >>   main +
    + +

    MX_GPIO_Init (Thumb, 444 bytes, Stack size 64 bytes, gpio.o(.text.MX_GPIO_Init)) +

    [Stack]

    • Max Depth = 112
    • Call Chain = MX_GPIO_Init ⇒ HAL_GPIO_Init +
    +
    [Calls]
    • >>   HAL_NVIC_SetPriority +
    • >>   HAL_NVIC_EnableIRQ +
    • >>   HAL_GPIO_WritePin +
    • >>   HAL_GPIO_Init +
    +
    [Called By]
    • >>   main +
    + +

    MX_I2C2_Init (Thumb, 62 bytes, Stack size 8 bytes, i2c.o(.text.MX_I2C2_Init)) +

    [Stack]

    • Max Depth = 144
    • Call Chain = MX_I2C2_Init ⇒ HAL_I2C_Init ⇒ HAL_I2C_MspInit ⇒ HAL_GPIO_Init +
    +
    [Calls]
    • >>   HAL_I2C_Init +
    • >>   Error_Handler +
    +
    [Called By]
    • >>   main +
    + +

    MX_I2C3_Init (Thumb, 62 bytes, Stack size 8 bytes, i2c.o(.text.MX_I2C3_Init)) +

    [Stack]

    • Max Depth = 144
    • Call Chain = MX_I2C3_Init ⇒ HAL_I2C_Init ⇒ HAL_I2C_MspInit ⇒ HAL_GPIO_Init +
    +
    [Calls]
    • >>   HAL_I2C_Init +
    • >>   Error_Handler +
    +
    [Called By]
    • >>   main +
    + +

    MX_SPI1_Init (Thumb, 78 bytes, Stack size 16 bytes, spi.o(.text.MX_SPI1_Init)) +

    [Stack]

    • Max Depth = 144
    • Call Chain = MX_SPI1_Init ⇒ HAL_SPI_Init ⇒ HAL_SPI_MspInit ⇒ HAL_GPIO_Init +
    +
    [Calls]
    • >>   HAL_SPI_Init +
    • >>   Error_Handler +
    +
    [Called By]
    • >>   main +
    + +

    MX_TIM10_Init (Thumb, 136 bytes, Stack size 40 bytes, tim.o(.text.MX_TIM10_Init)) +

    [Stack]

    • Max Depth = 120
    • Call Chain = MX_TIM10_Init ⇒ HAL_TIM_MspPostInit ⇒ HAL_GPIO_Init +
    +
    [Calls]
    • >>   HAL_TIM_PWM_Init +
    • >>   HAL_TIM_PWM_ConfigChannel +
    • >>   HAL_TIM_MspPostInit +
    • >>   HAL_TIM_Base_Init +
    • >>   Error_Handler +
    +
    [Called By]
    • >>   main +
    + +

    MX_TIM1_Init (Thumb, 282 bytes, Stack size 80 bytes, tim.o(.text.MX_TIM1_Init)) +

    [Stack]

    • Max Depth = 160
    • Call Chain = MX_TIM1_Init ⇒ HAL_TIM_MspPostInit ⇒ HAL_GPIO_Init +
    +
    [Calls]
    • >>   HAL_TIM_PWM_Init +
    • >>   HAL_TIM_PWM_ConfigChannel +
    • >>   HAL_TIM_MspPostInit +
    • >>   HAL_TIMEx_MasterConfigSynchronization +
    • >>   HAL_TIMEx_ConfigBreakDeadTime +
    • >>   Error_Handler +
    +
    [Called By]
    • >>   main +
    + +

    MX_TIM4_Init (Thumb, 146 bytes, Stack size 48 bytes, tim.o(.text.MX_TIM4_Init)) +

    [Stack]

    • Max Depth = 128
    • Call Chain = MX_TIM4_Init ⇒ HAL_TIM_MspPostInit ⇒ HAL_GPIO_Init +
    +
    [Calls]
    • >>   HAL_TIM_PWM_Init +
    • >>   HAL_TIM_PWM_ConfigChannel +
    • >>   HAL_TIM_MspPostInit +
    • >>   HAL_TIMEx_MasterConfigSynchronization +
    • >>   Error_Handler +
    +
    [Called By]
    • >>   main +
    + +

    MX_TIM5_Init (Thumb, 194 bytes, Stack size 48 bytes, tim.o(.text.MX_TIM5_Init)) +

    [Stack]

    • Max Depth = 128
    • Call Chain = MX_TIM5_Init ⇒ HAL_TIM_MspPostInit ⇒ HAL_GPIO_Init +
    +
    [Calls]
    • >>   HAL_TIM_PWM_Init +
    • >>   HAL_TIM_PWM_ConfigChannel +
    • >>   HAL_TIM_MspPostInit +
    • >>   HAL_TIMEx_MasterConfigSynchronization +
    • >>   Error_Handler +
    +
    [Called By]
    • >>   main +
    + +

    MX_USART6_UART_Init (Thumb, 56 bytes, Stack size 8 bytes, usart.o(.text.MX_USART6_UART_Init)) +

    [Stack]

    • Max Depth = 104
    • Call Chain = MX_USART6_UART_Init ⇒ HAL_UART_Init ⇒ HAL_UART_MspInit ⇒ HAL_GPIO_Init +
    +
    [Calls]
    • >>   HAL_UART_Init +
    • >>   Error_Handler +
    +
    [Called By]
    • >>   main +
    + +

    MemManage_Handler (Thumb, 2 bytes, Stack size 0 bytes, stm32f4xx_it.o(.text.MemManage_Handler)) +

    [Calls]

    • >>   MemManage_Handler +
    +
    [Called By]
    • >>   MemManage_Handler +
    +
    [Address Reference Count : 1]
    • startup_stm32f407xx.o(RESET) +
    +

    NMI_Handler (Thumb, 2 bytes, Stack size 0 bytes, stm32f4xx_it.o(.text.NMI_Handler)) +

    [Calls]

    • >>   NMI_Handler +
    +
    [Called By]
    • >>   NMI_Handler +
    +
    [Address Reference Count : 1]
    • startup_stm32f407xx.o(RESET) +
    +

    PendSV_Handler (Thumb, 100 bytes, Stack size 0 bytes, port.o(.text.PendSV_Handler)) +

    [Calls]

    • >>   vTaskSwitchContext +
    +
    [Address Reference Count : 1]
    • startup_stm32f407xx.o(RESET) +
    +

    SVC_Handler (Thumb, 36 bytes, Stack size 0 bytes, port.o(.text.SVC_Handler)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(RESET) +
    +

    StartDefaultTask (Thumb, 8 bytes, Stack size 0 bytes, freertos.o(.text.StartDefaultTask)) +

    [Stack]

    • Max Depth = 96 + In Cycle +
    • Call Chain = StartDefaultTask ⇒ StartDefaultTask (Cycle) +
    +
    [Calls]
    • >>   osDelay +
    • >>   StartDefaultTask +
    +
    [Called By]
    • >>   StartDefaultTask +
    +
    [Address Reference Count : 1]
    • freertos.o(.text.MX_FREERTOS_Init) +
    +

    SysTick_Handler (Thumb, 20 bytes, Stack size 8 bytes, stm32f4xx_it.o(.text.SysTick_Handler)) +

    [Stack]

    • Max Depth = 56
    • Call Chain = SysTick_Handler ⇒ xPortSysTickHandler ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   xTaskGetSchedulerState +
    • >>   xPortSysTickHandler +
    • >>   HAL_IncTick +
    +
    [Address Reference Count : 1]
    • startup_stm32f407xx.o(RESET) +
    +

    SystemClock_Config (Thumb, 164 bytes, Stack size 88 bytes, main.o(.text.SystemClock_Config)) +

    [Stack]

    • Max Depth = 168 + Unknown Stack Size +
    • Call Chain = SystemClock_Config ⇒ HAL_RCC_ClockConfig ⇒ HAL_RCC_GetSysClockFreq ⇒ __aeabi_uldivmod +
    +
    [Calls]
    • >>   HAL_RCC_OscConfig +
    • >>   HAL_RCC_ClockConfig +
    • >>   Error_Handler +
    • >>   __aeabi_memclr4 +
    +
    [Called By]
    • >>   main +
    + +

    SystemInit (Thumb, 18 bytes, Stack size 0 bytes, system_stm32f4xx.o(.text.SystemInit)) +
    [Address Reference Count : 1]

    • startup_stm32f407xx.o(.text) +
    +

    TIM_Base_SetConfig (Thumb, 300 bytes, Stack size 16 bytes, stm32f4xx_hal_tim.o(.text.TIM_Base_SetConfig)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = TIM_Base_SetConfig +
    +
    [Called By]
    • >>   HAL_TIM_PWM_Init +
    • >>   HAL_TIM_Base_Init +
    + +

    TIM_OC2_SetConfig (Thumb, 106 bytes, Stack size 16 bytes, stm32f4xx_hal_tim.o(.text.TIM_OC2_SetConfig)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = TIM_OC2_SetConfig +
    +
    [Called By]
    • >>   HAL_TIM_PWM_ConfigChannel +
    + +

    USART6_IRQHandler (Thumb, 16 bytes, Stack size 8 bytes, stm32f4xx_it.o(.text.USART6_IRQHandler)) +

    [Stack]

    • Max Depth = 56
    • Call Chain = USART6_IRQHandler ⇒ HAL_UART_IRQHandler ⇒ UART_Receive_IT ⇒ HAL_UART_RxCpltCallback +
    +
    [Calls]
    • >>   HAL_UART_IRQHandler +
    +
    [Address Reference Count : 1]
    • startup_stm32f407xx.o(RESET) +
    +

    UsageFault_Handler (Thumb, 2 bytes, Stack size 0 bytes, stm32f4xx_it.o(.text.UsageFault_Handler)) +

    [Calls]

    • >>   UsageFault_Handler +
    +
    [Called By]
    • >>   UsageFault_Handler +
    +
    [Address Reference Count : 1]
    • startup_stm32f407xx.o(RESET) +
    +

    main (Thumb, 62 bytes, Stack size 0 bytes, main.o(.text.main)) +

    [Stack]

    • Max Depth = 192 + Unknown Stack Size +
    • Call Chain = main ⇒ MX_FREERTOS_Init ⇒ osThreadNew ⇒ xTaskCreate ⇒ pvPortMalloc ⇒ xTaskResumeAll ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   osKernelStart +
    • >>   osKernelInitialize +
    • >>   SystemClock_Config +
    • >>   MX_USART6_UART_Init +
    • >>   MX_TIM5_Init +
    • >>   MX_TIM4_Init +
    • >>   MX_TIM1_Init +
    • >>   MX_TIM10_Init +
    • >>   MX_SPI1_Init +
    • >>   MX_I2C3_Init +
    • >>   MX_I2C2_Init +
    • >>   MX_GPIO_Init +
    • >>   MX_FREERTOS_Init +
    • >>   MX_DMA_Init +
    • >>   HAL_Init +
    +
    [Called By]
    • >>   __rt_entry_main +
    + +

    osDelay (Thumb, 32 bytes, Stack size 8 bytes, cmsis_os2.o(.text.osDelay)) +

    [Stack]

    • Max Depth = 96
    • Call Chain = osDelay ⇒ vTaskDelay ⇒ xTaskResumeAll ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   vTaskDelay +
    +
    [Called By]
    • >>   StartDefaultTask +
    + +

    osKernelInitialize (Thumb, 40 bytes, Stack size 0 bytes, cmsis_os2.o(.text.osKernelInitialize)) +

    [Called By]

    • >>   main +
    + +

    osKernelStart (Thumb, 52 bytes, Stack size 8 bytes, cmsis_os2.o(.text.osKernelStart)) +

    [Stack]

    • Max Depth = 168
    • Call Chain = osKernelStart ⇒ vTaskStartScheduler ⇒ xTimerCreateTimerTask ⇒ prvCheckForValidListAndQueue ⇒ xQueueGenericCreateStatic ⇒ prvInitialiseNewQueue ⇒ xQueueGenericReset ⇒ xTaskRemoveFromEventList +
    +
    [Calls]
    • >>   SVC_Setup +
    • >>   vTaskStartScheduler +
    +
    [Called By]
    • >>   main +
    + +

    osThreadNew (Thumb, 180 bytes, Stack size 32 bytes, cmsis_os2.o(.text.osThreadNew)) +

    [Stack]

    • Max Depth = 184
    • Call Chain = osThreadNew ⇒ xTaskCreate ⇒ pvPortMalloc ⇒ xTaskResumeAll ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   xTaskCreateStatic +
    • >>   xTaskCreate +
    +
    [Called By]
    • >>   MX_FREERTOS_Init +
    + +

    pvPortMalloc (Thumb, 330 bytes, Stack size 32 bytes, heap_4.o(.text.pvPortMalloc)) +

    [Stack]

    • Max Depth = 112
    • Call Chain = pvPortMalloc ⇒ xTaskResumeAll ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   xTaskResumeAll +
    • >>   vTaskSuspendAll +
    • >>   prvInsertBlockIntoFreeList +
    • >>   prvHeapInit +
    +
    [Called By]
    • >>   xTaskCreate +
    + +

    pxPortInitialiseStack (Thumb, 40 bytes, Stack size 0 bytes, port.o(.text.pxPortInitialiseStack)) +

    [Called By]

    • >>   prvInitialiseNewTask +
    + +

    uxListRemove (Thumb, 36 bytes, Stack size 0 bytes, list.o(.text.uxListRemove)) +

    [Called By]

    • >>   prvSwitchTimerLists +
    • >>   prvProcessReceivedCommands +
    • >>   prvProcessExpiredTimer +
    • >>   xTaskIncrementTick +
    • >>   prvCheckTasksWaitingTermination +
    • >>   prvAddCurrentTaskToDelayedList +
    • >>   xTaskRemoveFromEventList +
    • >>   xTaskPriorityDisinherit +
    • >>   xTaskResumeAll +
    + +

    vApplicationGetIdleTaskMemory (Thumb, 26 bytes, Stack size 0 bytes, cmsis_os2.o(.text.vApplicationGetIdleTaskMemory)) +

    [Called By]

    • >>   vTaskStartScheduler +
    + +

    vApplicationGetTimerTaskMemory (Thumb, 28 bytes, Stack size 0 bytes, cmsis_os2.o(.text.vApplicationGetTimerTaskMemory)) +

    [Called By]

    • >>   xTimerCreateTimerTask +
    + +

    vListInitialise (Thumb, 22 bytes, Stack size 0 bytes, list.o(.text.vListInitialise)) +

    [Called By]

    • >>   prvCheckForValidListAndQueue +
    • >>   prvInitialiseTaskLists +
    • >>   xQueueGenericReset +
    + +

    vListInitialiseItem (Thumb, 6 bytes, Stack size 0 bytes, list.o(.text.vListInitialiseItem)) +

    [Called By]

    • >>   prvInitialiseNewTask +
    + +

    vListInsert (Thumb, 58 bytes, Stack size 8 bytes, list.o(.text.vListInsert)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = vListInsert +
    +
    [Called By]
    • >>   prvSwitchTimerLists +
    • >>   prvInsertTimerInActiveList +
    • >>   prvAddCurrentTaskToDelayedList +
    • >>   vTaskPlaceOnEventList +
    + +

    vListInsertEnd (Thumb, 28 bytes, Stack size 0 bytes, list.o(.text.vListInsertEnd)) +

    [Called By]

    • >>   xTaskIncrementTick +
    • >>   prvAddNewTaskToReadyList +
    • >>   prvAddCurrentTaskToDelayedList +
    • >>   xTaskRemoveFromEventList +
    • >>   xTaskPriorityDisinherit +
    • >>   vTaskPlaceOnEventListRestricted +
    • >>   xTaskResumeAll +
    + +

    vPortEnterCritical (Thumb, 70 bytes, Stack size 0 bytes, port.o(.text.vPortEnterCritical)) +

    [Called By]

    • >>   prvCheckForValidListAndQueue +
    • >>   prvCheckTasksWaitingTermination +
    • >>   prvAddNewTaskToReadyList +
    • >>   xTaskCheckForTimeOut +
    • >>   xQueueReceive +
    • >>   xQueueGenericSend +
    • >>   xQueueGenericReset +
    • >>   vQueueWaitForMessageRestricted +
    • >>   prvUnlockQueue +
    • >>   prvIsQueueFull +
    • >>   prvIsQueueEmpty +
    • >>   xTaskResumeAll +
    + +

    vPortExitCritical (Thumb, 46 bytes, Stack size 0 bytes, port.o(.text.vPortExitCritical)) +

    [Called By]

    • >>   prvCheckForValidListAndQueue +
    • >>   prvCheckTasksWaitingTermination +
    • >>   prvAddNewTaskToReadyList +
    • >>   xTaskCheckForTimeOut +
    • >>   xQueueReceive +
    • >>   xQueueGenericSend +
    • >>   xQueueGenericReset +
    • >>   vQueueWaitForMessageRestricted +
    • >>   prvUnlockQueue +
    • >>   prvIsQueueFull +
    • >>   prvIsQueueEmpty +
    • >>   xTaskResumeAll +
    + +

    vPortFree (Thumb, 138 bytes, Stack size 16 bytes, heap_4.o(.text.vPortFree)) +

    [Stack]

    • Max Depth = 96
    • Call Chain = vPortFree ⇒ xTaskResumeAll ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   xTaskResumeAll +
    • >>   vTaskSuspendAll +
    • >>   prvInsertBlockIntoFreeList +
    +
    [Called By]
    • >>   prvProcessReceivedCommands +
    • >>   xTaskCreate +
    • >>   prvDeleteTCB +
    + +

    vPortSetupTimerInterrupt (Thumb, 52 bytes, Stack size 0 bytes, port.o(.text.vPortSetupTimerInterrupt)) +

    [Called By]

    • >>   xPortStartScheduler +
    + +

    vPortValidateInterruptPriority (Thumb, 98 bytes, Stack size 0 bytes, port.o(.text.vPortValidateInterruptPriority)) +

    [Called By]

    • >>   xQueueGenericSendFromISR +
    + +

    vQueueAddToRegistry (Thumb, 40 bytes, Stack size 0 bytes, queue.o(.text.vQueueAddToRegistry)) +

    [Called By]

    • >>   prvCheckForValidListAndQueue +
    + +

    vQueueWaitForMessageRestricted (Thumb, 68 bytes, Stack size 16 bytes, queue.o(.text.vQueueWaitForMessageRestricted)) +

    [Stack]

    • Max Depth = 64
    • Call Chain = vQueueWaitForMessageRestricted ⇒ vTaskPlaceOnEventListRestricted ⇒ prvAddCurrentTaskToDelayedList ⇒ vListInsert +
    +
    [Calls]
    • >>   vTaskPlaceOnEventListRestricted +
    • >>   prvUnlockQueue +
    • >>   vPortExitCritical +
    • >>   vPortEnterCritical +
    +
    [Called By]
    • >>   prvProcessTimerOrBlockTask +
    + +

    vTaskDelay (Thumb, 84 bytes, Stack size 8 bytes, tasks.o(.text.vTaskDelay)) +

    [Stack]

    • Max Depth = 88
    • Call Chain = vTaskDelay ⇒ xTaskResumeAll ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   prvAddCurrentTaskToDelayedList +
    • >>   xTaskResumeAll +
    • >>   vTaskSuspendAll +
    +
    [Called By]
    • >>   osDelay +
    + +

    vTaskInternalSetTimeOutState (Thumb, 26 bytes, Stack size 0 bytes, tasks.o(.text.vTaskInternalSetTimeOutState)) +

    [Called By]

    • >>   xTaskCheckForTimeOut +
    • >>   xQueueReceive +
    • >>   xQueueGenericSend +
    + +

    vTaskMissedYield (Thumb, 14 bytes, Stack size 0 bytes, tasks.o(.text.vTaskMissedYield)) +

    [Called By]

    • >>   prvUnlockQueue +
    + +

    vTaskPlaceOnEventList (Thumb, 50 bytes, Stack size 8 bytes, tasks.o(.text.vTaskPlaceOnEventList)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = vTaskPlaceOnEventList ⇒ prvAddCurrentTaskToDelayedList ⇒ vListInsert +
    +
    [Calls]
    • >>   prvAddCurrentTaskToDelayedList +
    • >>   vListInsert +
    +
    [Called By]
    • >>   xQueueReceive +
    • >>   xQueueGenericSend +
    + +

    vTaskPlaceOnEventListRestricted (Thumb, 62 bytes, Stack size 16 bytes, tasks.o(.text.vTaskPlaceOnEventListRestricted)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = vTaskPlaceOnEventListRestricted ⇒ prvAddCurrentTaskToDelayedList ⇒ vListInsert +
    +
    [Calls]
    • >>   prvAddCurrentTaskToDelayedList +
    • >>   vListInsertEnd +
    +
    [Called By]
    • >>   vQueueWaitForMessageRestricted +
    + +

    vTaskStartScheduler (Thumb, 156 bytes, Stack size 32 bytes, tasks.o(.text.vTaskStartScheduler)) +

    [Stack]

    • Max Depth = 160
    • Call Chain = vTaskStartScheduler ⇒ xTimerCreateTimerTask ⇒ prvCheckForValidListAndQueue ⇒ xQueueGenericCreateStatic ⇒ prvInitialiseNewQueue ⇒ xQueueGenericReset ⇒ xTaskRemoveFromEventList +
    +
    [Calls]
    • >>   xTimerCreateTimerTask +
    • >>   xTaskCreateStatic +
    • >>   xPortStartScheduler +
    • >>   vApplicationGetIdleTaskMemory +
    +
    [Called By]
    • >>   osKernelStart +
    + +

    vTaskSuspendAll (Thumb, 16 bytes, Stack size 0 bytes, tasks.o(.text.vTaskSuspendAll)) +

    [Called By]

    • >>   prvProcessTimerOrBlockTask +
    • >>   vTaskDelay +
    • >>   xQueueReceive +
    • >>   xQueueGenericSend +
    • >>   vPortFree +
    • >>   pvPortMalloc +
    + +

    vTaskSwitchContext (Thumb, 154 bytes, Stack size 0 bytes, tasks.o(.text.vTaskSwitchContext)) +

    [Called By]

    • >>   xPortStartScheduler +
    • >>   PendSV_Handler +
    + +

    xPortStartScheduler (Thumb, 274 bytes, Stack size 16 bytes, port.o(.text.xPortStartScheduler)) +

    [Stack]

    • Max Depth = 20
    • Call Chain = xPortStartScheduler ⇒ prvTaskExitError +
    +
    [Calls]
    • >>   vTaskSwitchContext +
    • >>   vPortSetupTimerInterrupt +
    • >>   vPortEnableVFP +
    • >>   prvTaskExitError +
    • >>   prvPortStartFirstTask +
    +
    [Called By]
    • >>   vTaskStartScheduler +
    + +

    xPortSysTickHandler (Thumb, 46 bytes, Stack size 8 bytes, port.o(.text.xPortSysTickHandler)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = xPortSysTickHandler ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   xTaskIncrementTick +
    +
    [Called By]
    • >>   SysTick_Handler +
    + +

    xQueueGenericCreateStatic (Thumb, 150 bytes, Stack size 24 bytes, queue.o(.text.xQueueGenericCreateStatic)) +

    [Stack]

    • Max Depth = 72
    • Call Chain = xQueueGenericCreateStatic ⇒ prvInitialiseNewQueue ⇒ xQueueGenericReset ⇒ xTaskRemoveFromEventList +
    +
    [Calls]
    • >>   prvInitialiseNewQueue +
    +
    [Called By]
    • >>   prvCheckForValidListAndQueue +
    + +

    xQueueGenericReset (Thumb, 126 bytes, Stack size 16 bytes, queue.o(.text.xQueueGenericReset)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = xQueueGenericReset ⇒ xTaskRemoveFromEventList +
    +
    [Calls]
    • >>   xTaskRemoveFromEventList +
    • >>   vPortExitCritical +
    • >>   vPortEnterCritical +
    • >>   vListInitialise +
    +
    [Called By]
    • >>   prvInitialiseNewQueue +
    + +

    xQueueGenericSend (Thumb, 418 bytes, Stack size 48 bytes, queue.o(.text.xQueueGenericSend)) +

    [Stack]

    • Max Depth = 128
    • Call Chain = xQueueGenericSend ⇒ xTaskResumeAll ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   xTaskGetSchedulerState +
    • >>   xTaskRemoveFromEventList +
    • >>   xTaskCheckForTimeOut +
    • >>   vTaskPlaceOnEventList +
    • >>   vTaskInternalSetTimeOutState +
    • >>   prvUnlockQueue +
    • >>   prvIsQueueFull +
    • >>   prvCopyDataToQueue +
    • >>   xTaskResumeAll +
    • >>   vTaskSuspendAll +
    • >>   vPortExitCritical +
    • >>   vPortEnterCritical +
    +
    [Called By]
    • >>   xTimerGenericCommand +
    + +

    xQueueGenericSendFromISR (Thumb, 206 bytes, Stack size 32 bytes, queue.o(.text.xQueueGenericSendFromISR)) +

    [Stack]

    • Max Depth = 64
    • Call Chain = xQueueGenericSendFromISR ⇒ prvCopyDataToQueue ⇒ xTaskPriorityDisinherit +
    +
    [Calls]
    • >>   xTaskRemoveFromEventList +
    • >>   vPortValidateInterruptPriority +
    • >>   prvCopyDataToQueue +
    +
    [Called By]
    • >>   xTimerGenericCommand +
    + +

    xQueueReceive (Thumb, 388 bytes, Stack size 56 bytes, queue.o(.text.xQueueReceive)) +

    [Stack]

    • Max Depth = 136
    • Call Chain = xQueueReceive ⇒ xTaskResumeAll ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   xTaskGetSchedulerState +
    • >>   xTaskRemoveFromEventList +
    • >>   xTaskCheckForTimeOut +
    • >>   vTaskPlaceOnEventList +
    • >>   vTaskInternalSetTimeOutState +
    • >>   prvUnlockQueue +
    • >>   prvIsQueueEmpty +
    • >>   prvCopyDataFromQueue +
    • >>   xTaskResumeAll +
    • >>   vTaskSuspendAll +
    • >>   vPortExitCritical +
    • >>   vPortEnterCritical +
    +
    [Called By]
    • >>   prvProcessReceivedCommands +
    + +

    xTaskCheckForTimeOut (Thumb, 136 bytes, Stack size 16 bytes, tasks.o(.text.xTaskCheckForTimeOut)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = xTaskCheckForTimeOut +
    +
    [Calls]
    • >>   vTaskInternalSetTimeOutState +
    • >>   vPortExitCritical +
    • >>   vPortEnterCritical +
    +
    [Called By]
    • >>   xQueueReceive +
    • >>   xQueueGenericSend +
    + +

    xTaskCreate (Thumb, 102 bytes, Stack size 40 bytes, tasks.o(.text.xTaskCreate)) +

    [Stack]

    • Max Depth = 152
    • Call Chain = xTaskCreate ⇒ pvPortMalloc ⇒ xTaskResumeAll ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   prvInitialiseNewTask +
    • >>   prvAddNewTaskToReadyList +
    • >>   vPortFree +
    • >>   pvPortMalloc +
    +
    [Called By]
    • >>   osThreadNew +
    + +

    xTaskCreateStatic (Thumb, 118 bytes, Stack size 40 bytes, tasks.o(.text.xTaskCreateStatic)) +

    [Stack]

    • Max Depth = 76
    • Call Chain = xTaskCreateStatic ⇒ prvInitialiseNewTask ⇒ __aeabi_memset4 ⇒ _memset_w +
    +
    [Calls]
    • >>   prvInitialiseNewTask +
    • >>   prvAddNewTaskToReadyList +
    +
    [Called By]
    • >>   osThreadNew +
    • >>   xTimerCreateTimerTask +
    • >>   vTaskStartScheduler +
    + +

    xTaskGetSchedulerState (Thumb, 38 bytes, Stack size 0 bytes, tasks.o(.text.xTaskGetSchedulerState)) +

    [Called By]

    • >>   SysTick_Handler +
    • >>   xTimerGenericCommand +
    • >>   xQueueReceive +
    • >>   xQueueGenericSend +
    + +

    xTaskGetTickCount (Thumb, 12 bytes, Stack size 0 bytes, tasks.o(.text.xTaskGetTickCount)) +

    [Called By]

    • >>   prvSampleTimeNow +
    + +

    xTaskIncrementTick (Thumb, 338 bytes, Stack size 40 bytes, tasks.o(.text.xTaskIncrementTick)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = xTaskIncrementTick +
    +
    [Calls]
    • >>   prvResetNextTaskUnblockTime +
    • >>   vListInsertEnd +
    • >>   uxListRemove +
    +
    [Called By]
    • >>   xPortSysTickHandler +
    • >>   xTaskResumeAll +
    + +

    xTaskPriorityDisinherit (Thumb, 146 bytes, Stack size 16 bytes, tasks.o(.text.xTaskPriorityDisinherit)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = xTaskPriorityDisinherit +
    +
    [Calls]
    • >>   vListInsertEnd +
    • >>   uxListRemove +
    +
    [Called By]
    • >>   prvCopyDataToQueue +
    + +

    xTaskRemoveFromEventList (Thumb, 142 bytes, Stack size 16 bytes, tasks.o(.text.xTaskRemoveFromEventList)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = xTaskRemoveFromEventList +
    +
    [Calls]
    • >>   vListInsertEnd +
    • >>   uxListRemove +
    +
    [Called By]
    • >>   xQueueReceive +
    • >>   xQueueGenericSendFromISR +
    • >>   xQueueGenericSend +
    • >>   xQueueGenericReset +
    • >>   prvUnlockQueue +
    + +

    xTaskResumeAll (Thumb, 276 bytes, Stack size 40 bytes, tasks.o(.text.xTaskResumeAll)) +

    [Stack]

    • Max Depth = 80
    • Call Chain = xTaskResumeAll ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   xTaskIncrementTick +
    • >>   prvResetNextTaskUnblockTime +
    • >>   vListInsertEnd +
    • >>   uxListRemove +
    • >>   vPortExitCritical +
    • >>   vPortEnterCritical +
    +
    [Called By]
    • >>   prvProcessTimerOrBlockTask +
    • >>   vTaskDelay +
    • >>   xQueueReceive +
    • >>   xQueueGenericSend +
    • >>   vPortFree +
    • >>   pvPortMalloc +
    + +

    xTimerCreateTimerTask (Thumb, 108 bytes, Stack size 32 bytes, timers.o(.text.xTimerCreateTimerTask)) +

    [Stack]

    • Max Depth = 128
    • Call Chain = xTimerCreateTimerTask ⇒ prvCheckForValidListAndQueue ⇒ xQueueGenericCreateStatic ⇒ prvInitialiseNewQueue ⇒ xQueueGenericReset ⇒ xTaskRemoveFromEventList +
    +
    [Calls]
    • >>   vApplicationGetTimerTaskMemory +
    • >>   prvCheckForValidListAndQueue +
    • >>   xTaskCreateStatic +
    +
    [Called By]
    • >>   vTaskStartScheduler +
    + +

    xTimerGenericCommand (Thumb, 104 bytes, Stack size 24 bytes, timers.o(.text.xTimerGenericCommand)) +

    [Stack]

    • Max Depth = 152
    • Call Chain = xTimerGenericCommand ⇒ xQueueGenericSend ⇒ xTaskResumeAll ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   xTaskGetSchedulerState +
    • >>   xQueueGenericSendFromISR +
    • >>   xQueueGenericSend +
    +
    [Called By]
    • >>   prvSwitchTimerLists +
    • >>   prvProcessReceivedCommands +
    • >>   prvProcessExpiredTimer +
    + +

    _fp_init (Thumb, 26 bytes, Stack size 0 bytes, fpinit.o(x$fpl$fpinit)) +

    [Called By]

    • >>   __rt_lib_init_fp_1 +
    + +

    __fplib_config_fpu_vfp (Thumb, 0 bytes, Stack size unknown bytes, fpinit.o(x$fpl$fpinit), UNUSED) + +

    __fplib_config_pureend_doubles (Thumb, 0 bytes, Stack size unknown bytes, fpinit.o(x$fpl$fpinit), UNUSED) +

    +

    +Local Symbols +

    +

    DMA_CalcBaseAndBitshift (Thumb, 52 bytes, Stack size 0 bytes, stm32f4xx_hal_dma.o(.text.DMA_CalcBaseAndBitshift)) +

    [Called By]

    • >>   HAL_DMA_Init +
    + +

    DMA_CheckFifoParam (Thumb, 80 bytes, Stack size 0 bytes, stm32f4xx_hal_dma.o(.text.DMA_CheckFifoParam)) +

    [Called By]

    • >>   HAL_DMA_Init +
    + +

    NVIC_EncodePriority (Thumb, 44 bytes, Stack size 0 bytes, stm32f4xx_hal_cortex.o(.text.NVIC_EncodePriority)) +

    [Called By]

    • >>   HAL_NVIC_SetPriority +
    + +

    SysTick_Config (Thumb, 46 bytes, Stack size 16 bytes, stm32f4xx_hal_cortex.o(.text.SysTick_Config)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = SysTick_Config +
    +
    [Calls]
    • >>   __NVIC_SetPriority +
    +
    [Called By]
    • >>   HAL_SYSTICK_Config +
    + +

    __NVIC_EnableIRQ (Thumb, 32 bytes, Stack size 0 bytes, stm32f4xx_hal_cortex.o(.text.__NVIC_EnableIRQ)) +

    [Called By]

    • >>   HAL_NVIC_EnableIRQ +
    + +

    __NVIC_GetPriorityGrouping (Thumb, 16 bytes, Stack size 0 bytes, stm32f4xx_hal_cortex.o(.text.__NVIC_GetPriorityGrouping)) +

    [Called By]

    • >>   HAL_NVIC_SetPriority +
    + +

    __NVIC_SetPriority (Thumb, 34 bytes, Stack size 0 bytes, stm32f4xx_hal_cortex.o(.text.__NVIC_SetPriority)) +

    [Called By]

    • >>   SysTick_Config +
    • >>   HAL_NVIC_SetPriority +
    + +

    __NVIC_SetPriorityGrouping (Thumb, 32 bytes, Stack size 0 bytes, stm32f4xx_hal_cortex.o(.text.__NVIC_SetPriorityGrouping)) +

    [Called By]

    • >>   HAL_NVIC_SetPriorityGrouping +
    + +

    TIM_OC1_SetConfig (Thumb, 100 bytes, Stack size 16 bytes, stm32f4xx_hal_tim.o(.text.TIM_OC1_SetConfig)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = TIM_OC1_SetConfig +
    +
    [Called By]
    • >>   HAL_TIM_PWM_ConfigChannel +
    + +

    TIM_OC3_SetConfig (Thumb, 104 bytes, Stack size 16 bytes, stm32f4xx_hal_tim.o(.text.TIM_OC3_SetConfig)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = TIM_OC3_SetConfig +
    +
    [Called By]
    • >>   HAL_TIM_PWM_ConfigChannel +
    + +

    TIM_OC4_SetConfig (Thumb, 78 bytes, Stack size 16 bytes, stm32f4xx_hal_tim.o(.text.TIM_OC4_SetConfig)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = TIM_OC4_SetConfig +
    +
    [Called By]
    • >>   HAL_TIM_PWM_ConfigChannel +
    + +

    UART_DMAAbortOnError (Thumb, 14 bytes, Stack size 8 bytes, stm32f4xx_hal_uart.o(.text.UART_DMAAbortOnError)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = UART_DMAAbortOnError ⇒ HAL_UART_ErrorCallback +
    +
    [Calls]
    • >>   HAL_UART_ErrorCallback +
    +
    [Address Reference Count : 1]
    • stm32f4xx_hal_uart.o(.text.HAL_UART_IRQHandler) +
    +

    UART_EndRxTransfer (Thumb, 80 bytes, Stack size 0 bytes, stm32f4xx_hal_uart.o(.text.UART_EndRxTransfer)) +

    [Calls]

    • >>   UART_EndRxTransfer +
    +
    [Called By]
    • >>   HAL_UART_IRQHandler +
    • >>   UART_EndRxTransfer +
    + +

    UART_EndTransmit_IT (Thumb, 24 bytes, Stack size 8 bytes, stm32f4xx_hal_uart.o(.text.UART_EndTransmit_IT)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = UART_EndTransmit_IT ⇒ HAL_UART_TxCpltCallback +
    +
    [Calls]
    • >>   HAL_UART_TxCpltCallback +
    +
    [Called By]
    • >>   HAL_UART_IRQHandler +
    + +

    UART_Receive_IT (Thumb, 200 bytes, Stack size 16 bytes, stm32f4xx_hal_uart.o(.text.UART_Receive_IT)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = UART_Receive_IT ⇒ HAL_UART_RxCpltCallback +
    +
    [Calls]
    • >>   HAL_UARTEx_RxEventCallback +
    • >>   HAL_UART_RxCpltCallback +
    +
    [Called By]
    • >>   HAL_UART_IRQHandler +
    + +

    UART_SetConfig (Thumb, 220 bytes, Stack size 8 bytes, stm32f4xx_hal_uart.o(.text.UART_SetConfig)) +

    [Stack]

    • Max Depth = 56
    • Call Chain = UART_SetConfig ⇒ __aeabi_uldivmod +
    +
    [Calls]
    • >>   HAL_RCC_GetPCLK2Freq +
    • >>   HAL_RCC_GetPCLK1Freq +
    • >>   __aeabi_uldivmod +
    +
    [Called By]
    • >>   HAL_UART_Init +
    + +

    UART_Transmit_IT (Thumb, 82 bytes, Stack size 0 bytes, stm32f4xx_hal_uart.o(.text.UART_Transmit_IT)) +

    [Called By]

    • >>   HAL_UART_IRQHandler +
    + +

    prvCopyDataFromQueue (Thumb, 38 bytes, Stack size 8 bytes, queue.o(.text.prvCopyDataFromQueue)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = prvCopyDataFromQueue +
    +
    [Calls]
    • >>   __aeabi_memcpy +
    +
    [Called By]
    • >>   xQueueReceive +
    + +

    prvCopyDataToQueue (Thumb, 122 bytes, Stack size 16 bytes, queue.o(.text.prvCopyDataToQueue)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = prvCopyDataToQueue ⇒ xTaskPriorityDisinherit +
    +
    [Calls]
    • >>   xTaskPriorityDisinherit +
    • >>   __aeabi_memcpy +
    +
    [Called By]
    • >>   xQueueGenericSendFromISR +
    • >>   xQueueGenericSend +
    + +

    prvInitialiseNewQueue (Thumb, 32 bytes, Stack size 16 bytes, queue.o(.text.prvInitialiseNewQueue)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = prvInitialiseNewQueue ⇒ xQueueGenericReset ⇒ xTaskRemoveFromEventList +
    +
    [Calls]
    • >>   xQueueGenericReset +
    +
    [Called By]
    • >>   xQueueGenericCreateStatic +
    + +

    prvIsQueueEmpty (Thumb, 24 bytes, Stack size 8 bytes, queue.o(.text.prvIsQueueEmpty)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = prvIsQueueEmpty +
    +
    [Calls]
    • >>   vPortExitCritical +
    • >>   vPortEnterCritical +
    +
    [Called By]
    • >>   xQueueReceive +
    + +

    prvIsQueueFull (Thumb, 28 bytes, Stack size 8 bytes, queue.o(.text.prvIsQueueFull)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = prvIsQueueFull +
    +
    [Calls]
    • >>   vPortExitCritical +
    • >>   vPortEnterCritical +
    +
    [Called By]
    • >>   xQueueGenericSend +
    + +

    prvUnlockQueue (Thumb, 114 bytes, Stack size 24 bytes, queue.o(.text.prvUnlockQueue)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = prvUnlockQueue ⇒ xTaskRemoveFromEventList +
    +
    [Calls]
    • >>   xTaskRemoveFromEventList +
    • >>   vTaskMissedYield +
    • >>   vPortExitCritical +
    • >>   vPortEnterCritical +
    +
    [Called By]
    • >>   xQueueReceive +
    • >>   xQueueGenericSend +
    • >>   vQueueWaitForMessageRestricted +
    + +

    prvAddCurrentTaskToDelayedList (Thumb, 128 bytes, Stack size 24 bytes, tasks.o(.text.prvAddCurrentTaskToDelayedList)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = prvAddCurrentTaskToDelayedList ⇒ vListInsert +
    +
    [Calls]
    • >>   vListInsertEnd +
    • >>   vListInsert +
    • >>   uxListRemove +
    +
    [Called By]
    • >>   vTaskDelay +
    • >>   vTaskPlaceOnEventListRestricted +
    • >>   vTaskPlaceOnEventList +
    + +

    prvAddNewTaskToReadyList (Thumb, 172 bytes, Stack size 16 bytes, tasks.o(.text.prvAddNewTaskToReadyList)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = prvAddNewTaskToReadyList ⇒ prvInitialiseTaskLists +
    +
    [Calls]
    • >>   prvInitialiseTaskLists +
    • >>   vListInsertEnd +
    • >>   vPortExitCritical +
    • >>   vPortEnterCritical +
    +
    [Called By]
    • >>   xTaskCreateStatic +
    • >>   xTaskCreate +
    + +

    prvCheckTasksWaitingTermination (Thumb, 78 bytes, Stack size 24 bytes, tasks.o(.text.prvCheckTasksWaitingTermination)) +

    [Stack]

    • Max Depth = 128
    • Call Chain = prvCheckTasksWaitingTermination ⇒ prvDeleteTCB ⇒ vPortFree ⇒ xTaskResumeAll ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   prvDeleteTCB +
    • >>   uxListRemove +
    • >>   vPortExitCritical +
    • >>   vPortEnterCritical +
    +
    [Called By]
    • >>   prvIdleTask +
    + +

    prvDeleteTCB (Thumb, 54 bytes, Stack size 8 bytes, tasks.o(.text.prvDeleteTCB)) +

    [Stack]

    • Max Depth = 104
    • Call Chain = prvDeleteTCB ⇒ vPortFree ⇒ xTaskResumeAll ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   vPortFree +
    +
    [Called By]
    • >>   prvCheckTasksWaitingTermination +
    + +

    prvIdleTask (Thumb, 42 bytes, Stack size 0 bytes, tasks.o(.text.prvIdleTask)) +

    [Stack]

    • Max Depth = 128
    • Call Chain = prvIdleTask ⇒ prvCheckTasksWaitingTermination ⇒ prvDeleteTCB ⇒ vPortFree ⇒ xTaskResumeAll ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   prvCheckTasksWaitingTermination +
    +
    [Address Reference Count : 1]
    • tasks.o(.text.vTaskStartScheduler) +
    +

    prvInitialiseNewTask (Thumb, 152 bytes, Stack size 32 bytes, tasks.o(.text.prvInitialiseNewTask)) +

    [Stack]

    • Max Depth = 36
    • Call Chain = prvInitialiseNewTask ⇒ __aeabi_memset4 ⇒ _memset_w +
    +
    [Calls]
    • >>   pxPortInitialiseStack +
    • >>   vListInitialiseItem +
    • >>   __aeabi_memset4 +
    +
    [Called By]
    • >>   xTaskCreateStatic +
    • >>   xTaskCreate +
    + +

    prvInitialiseTaskLists (Thumb, 112 bytes, Stack size 16 bytes, tasks.o(.text.prvInitialiseTaskLists)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = prvInitialiseTaskLists +
    +
    [Calls]
    • >>   vListInitialise +
    +
    [Called By]
    • >>   prvAddNewTaskToReadyList +
    + +

    prvResetNextTaskUnblockTime (Thumb, 40 bytes, Stack size 0 bytes, tasks.o(.text.prvResetNextTaskUnblockTime)) +

    [Called By]

    • >>   xTaskIncrementTick +
    • >>   xTaskResumeAll +
    + +

    prvCheckForValidListAndQueue (Thumb, 116 bytes, Stack size 24 bytes, timers.o(.text.prvCheckForValidListAndQueue)) +

    [Stack]

    • Max Depth = 96
    • Call Chain = prvCheckForValidListAndQueue ⇒ xQueueGenericCreateStatic ⇒ prvInitialiseNewQueue ⇒ xQueueGenericReset ⇒ xTaskRemoveFromEventList +
    +
    [Calls]
    • >>   xQueueGenericCreateStatic +
    • >>   vQueueAddToRegistry +
    • >>   vPortExitCritical +
    • >>   vPortEnterCritical +
    • >>   vListInitialise +
    +
    [Called By]
    • >>   xTimerCreateTimerTask +
    + +

    prvGetNextExpireTime (Thumb, 32 bytes, Stack size 0 bytes, timers.o(.text.prvGetNextExpireTime)) +

    [Called By]

    • >>   prvTimerTask +
    + +

    prvInsertTimerInActiveList (Thumb, 64 bytes, Stack size 8 bytes, timers.o(.text.prvInsertTimerInActiveList)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = prvInsertTimerInActiveList ⇒ vListInsert +
    +
    [Calls]
    • >>   vListInsert +
    +
    [Called By]
    • >>   prvProcessReceivedCommands +
    • >>   prvProcessExpiredTimer +
    + +

    prvProcessExpiredTimer (Thumb, 110 bytes, Stack size 24 bytes, timers.o(.text.prvProcessExpiredTimer)) +

    [Stack]

    • Max Depth = 176
    • Call Chain = prvProcessExpiredTimer ⇒ xTimerGenericCommand ⇒ xQueueGenericSend ⇒ xTaskResumeAll ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   xTimerGenericCommand +
    • >>   prvInsertTimerInActiveList +
    • >>   uxListRemove +
    +
    [Called By]
    • >>   prvProcessTimerOrBlockTask +
    + +

    prvProcessReceivedCommands (Thumb, 290 bytes, Stack size 48 bytes, timers.o(.text.prvProcessReceivedCommands)) +

    [Stack]

    • Max Depth = 248
    • Call Chain = prvProcessReceivedCommands ⇒ prvSampleTimeNow ⇒ prvSwitchTimerLists ⇒ xTimerGenericCommand ⇒ xQueueGenericSend ⇒ xTaskResumeAll ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   xTimerGenericCommand +
    • >>   prvSampleTimeNow +
    • >>   prvInsertTimerInActiveList +
    • >>   xQueueReceive +
    • >>   uxListRemove +
    • >>   vPortFree +
    +
    [Called By]
    • >>   prvTimerTask +
    + +

    prvProcessTimerOrBlockTask (Thumb, 128 bytes, Stack size 24 bytes, timers.o(.text.prvProcessTimerOrBlockTask)) +

    [Stack]

    • Max Depth = 224
    • Call Chain = prvProcessTimerOrBlockTask ⇒ prvSampleTimeNow ⇒ prvSwitchTimerLists ⇒ xTimerGenericCommand ⇒ xQueueGenericSend ⇒ xTaskResumeAll ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   prvSampleTimeNow +
    • >>   prvProcessExpiredTimer +
    • >>   vQueueWaitForMessageRestricted +
    • >>   xTaskResumeAll +
    • >>   vTaskSuspendAll +
    +
    [Called By]
    • >>   prvTimerTask +
    + +

    prvSampleTimeNow (Thumb, 42 bytes, Stack size 16 bytes, timers.o(.text.prvSampleTimeNow)) +

    [Stack]

    • Max Depth = 200
    • Call Chain = prvSampleTimeNow ⇒ prvSwitchTimerLists ⇒ xTimerGenericCommand ⇒ xQueueGenericSend ⇒ xTaskResumeAll ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   prvSwitchTimerLists +
    • >>   xTaskGetTickCount +
    +
    [Called By]
    • >>   prvProcessTimerOrBlockTask +
    • >>   prvProcessReceivedCommands +
    + +

    prvSwitchTimerLists (Thumb, 142 bytes, Stack size 32 bytes, timers.o(.text.prvSwitchTimerLists)) +

    [Stack]

    • Max Depth = 184
    • Call Chain = prvSwitchTimerLists ⇒ xTimerGenericCommand ⇒ xQueueGenericSend ⇒ xTaskResumeAll ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   xTimerGenericCommand +
    • >>   vListInsert +
    • >>   uxListRemove +
    +
    [Called By]
    • >>   prvSampleTimeNow +
    + +

    prvTimerTask (Thumb, 22 bytes, Stack size 8 bytes, timers.o(.text.prvTimerTask)) +

    [Stack]

    • Max Depth = 256
    • Call Chain = prvTimerTask ⇒ prvProcessReceivedCommands ⇒ prvSampleTimeNow ⇒ prvSwitchTimerLists ⇒ xTimerGenericCommand ⇒ xQueueGenericSend ⇒ xTaskResumeAll ⇒ xTaskIncrementTick +
    +
    [Calls]
    • >>   prvProcessTimerOrBlockTask +
    • >>   prvProcessReceivedCommands +
    • >>   prvGetNextExpireTime +
    +
    [Address Reference Count : 1]
    • timers.o(.text.xTimerCreateTimerTask) +
    +

    SVC_Setup (Thumb, 8 bytes, Stack size 8 bytes, cmsis_os2.o(.text.SVC_Setup)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = SVC_Setup +
    +
    [Calls]
    • >>   __NVIC_SetPriority +
    +
    [Called By]
    • >>   osKernelStart +
    + +

    __NVIC_SetPriority (Thumb, 14 bytes, Stack size 0 bytes, cmsis_os2.o(.text.__NVIC_SetPriority)) +

    [Called By]

    • >>   SVC_Setup +
    + +

    prvHeapInit (Thumb, 118 bytes, Stack size 0 bytes, heap_4.o(.text.prvHeapInit)) +

    [Called By]

    • >>   pvPortMalloc +
    + +

    prvInsertBlockIntoFreeList (Thumb, 90 bytes, Stack size 8 bytes, heap_4.o(.text.prvInsertBlockIntoFreeList)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = prvInsertBlockIntoFreeList +
    +
    [Called By]
    • >>   vPortFree +
    • >>   pvPortMalloc +
    + +

    prvPortStartFirstTask (Thumb, 34 bytes, Stack size 0 bytes, port.o(.text.prvPortStartFirstTask)) +

    [Called By]

    • >>   xPortStartScheduler +
    + +

    prvTaskExitError (Thumb, 50 bytes, Stack size 4 bytes, port.o(.text.prvTaskExitError)) +

    [Stack]

    • Max Depth = 4
    • Call Chain = prvTaskExitError +
    +
    [Called By]
    • >>   xPortStartScheduler +
    +
    [Address Reference Count : 1]
    • port.o(.text.pxPortInitialiseStack) +
    +

    vPortEnableVFP (Thumb, 14 bytes, Stack size 0 bytes, port.o(.text.vPortEnableVFP)) +

    [Called By]

    • >>   xPortStartScheduler +
    + +

    UART_Get (Thumb, 20 bytes, Stack size 0 bytes, uart.o(.text.UART_Get)) +

    [Called By]

    • >>   HAL_UART_TxCpltCallback +
    • >>   HAL_UART_RxCpltCallback +
    • >>   HAL_UART_ErrorCallback +
    +

    +

    +Undefined Global Symbols +


    diff --git a/MDK-ARM/DveC/DveC.lnp b/MDK-ARM/DveC/DveC.lnp new file mode 100644 index 0000000..0ffa2c1 --- /dev/null +++ b/MDK-ARM/DveC/DveC.lnp @@ -0,0 +1,74 @@ +--cpu=Cortex-M4.fp.sp +"dvec\startup_stm32f407xx.o" +"dvec\main.o" +"dvec\gpio.o" +"dvec\freertos.o" +"dvec\dma.o" +"dvec\i2c.o" +"dvec\spi.o" +"dvec\tim.o" +"dvec\usart.o" +"dvec\stm32f4xx_it.o" +"dvec\stm32f4xx_hal_msp.o" +"dvec\stm32f4xx_hal_rcc.o" +"dvec\stm32f4xx_hal_rcc_ex.o" +"dvec\stm32f4xx_hal_flash.o" +"dvec\stm32f4xx_hal_flash_ex.o" +"dvec\stm32f4xx_hal_flash_ramfunc.o" +"dvec\stm32f4xx_hal_gpio.o" +"dvec\stm32f4xx_hal_dma_ex.o" +"dvec\stm32f4xx_hal_dma.o" +"dvec\stm32f4xx_hal_pwr.o" +"dvec\stm32f4xx_hal_pwr_ex.o" +"dvec\stm32f4xx_hal_cortex.o" +"dvec\stm32f4xx_hal.o" +"dvec\stm32f4xx_hal_exti.o" +"dvec\stm32f4xx_hal_i2c.o" +"dvec\stm32f4xx_hal_i2c_ex.o" +"dvec\stm32f4xx_hal_spi.o" +"dvec\stm32f4xx_hal_tim.o" +"dvec\stm32f4xx_hal_tim_ex.o" +"dvec\stm32f4xx_hal_uart.o" +"dvec\system_stm32f4xx.o" +"dvec\croutine.o" +"dvec\event_groups.o" +"dvec\list.o" +"dvec\queue.o" +"dvec\stream_buffer.o" +"dvec\tasks.o" +"dvec\timers.o" +"dvec\cmsis_os2.o" +"dvec\heap_4.o" +"dvec\port.o" +"dvec\buzzer_pwm.o" +"dvec\delay.o" +"dvec\dwt.o" +"dvec\gpio_1.o" +"dvec\i2c_1.o" +"dvec\led_pwm.o" +"dvec\pwm.o" +"dvec\spi_1.o" +"dvec\time.o" +"dvec\uart.o" +"dvec\bmi088.o" +"dvec\ist8310.o" +"dvec\ps2.o" +"dvec\spl06.o" +"dvec\ahrs.o" +"dvec\filter.o" +"dvec\fixed_height.o" +"dvec\pid.o" +"dvec\user_math.o" +"dvec\config.o" +"dvec\easy_control.o" +"dvec\atti_esti.o" +"dvec\height_cal.o" +"dvec\init.o" +"dvec\main_control.o" +"dvec\ps2_1.o" +"dvec\test1.o" +"dvec\user_task.o" +--strict --scatter "DveC\DveC.sct" +--summary_stderr --info summarysizes --map --load_addr_map_info --xref --callgraph --symbols +--info sizes --info totals --info unused --info veneers +--list "DveC.map" -o DveC\DveC.axf \ No newline at end of file diff --git a/MDK-ARM/DveC/DveC.map b/MDK-ARM/DveC/DveC.map new file mode 100644 index 0000000..2fae21c --- /dev/null +++ b/MDK-ARM/DveC/DveC.map @@ -0,0 +1,6880 @@ +Component: ARM Compiler 6.16 Tool: armlink [5dfeaa00] + +============================================================================== + +Section Cross References + + startup_stm32f407xx.o(STACK) refers (Special) to heapauxi.o(.text) for __use_two_region_memory + startup_stm32f407xx.o(HEAP) refers (Special) to heapauxi.o(.text) for __use_two_region_memory + startup_stm32f407xx.o(RESET) refers (Special) to heapauxi.o(.text) for __use_two_region_memory + startup_stm32f407xx.o(RESET) refers to startup_stm32f407xx.o(STACK) for __initial_sp + startup_stm32f407xx.o(RESET) refers to startup_stm32f407xx.o(.text) for Reset_Handler + startup_stm32f407xx.o(RESET) refers to stm32f4xx_it.o(.text.NMI_Handler) for NMI_Handler + startup_stm32f407xx.o(RESET) refers to stm32f4xx_it.o(.text.HardFault_Handler) for HardFault_Handler + startup_stm32f407xx.o(RESET) refers to stm32f4xx_it.o(.text.MemManage_Handler) for MemManage_Handler + startup_stm32f407xx.o(RESET) refers to stm32f4xx_it.o(.text.BusFault_Handler) for BusFault_Handler + startup_stm32f407xx.o(RESET) refers to stm32f4xx_it.o(.text.UsageFault_Handler) for UsageFault_Handler + startup_stm32f407xx.o(RESET) refers to port.o(.text.SVC_Handler) for SVC_Handler + startup_stm32f407xx.o(RESET) refers to stm32f4xx_it.o(.text.DebugMon_Handler) for DebugMon_Handler + startup_stm32f407xx.o(RESET) refers to port.o(.text.PendSV_Handler) for PendSV_Handler + startup_stm32f407xx.o(RESET) refers to stm32f4xx_it.o(.text.SysTick_Handler) for SysTick_Handler + startup_stm32f407xx.o(RESET) refers to stm32f4xx_it.o(.text.EXTI3_IRQHandler) for EXTI3_IRQHandler + startup_stm32f407xx.o(RESET) refers to stm32f4xx_it.o(.text.EXTI4_IRQHandler) for EXTI4_IRQHandler + startup_stm32f407xx.o(RESET) refers to stm32f4xx_it.o(.text.DMA1_Stream2_IRQHandler) for DMA1_Stream2_IRQHandler + startup_stm32f407xx.o(RESET) refers to stm32f4xx_it.o(.text.EXTI9_5_IRQHandler) for EXTI9_5_IRQHandler + startup_stm32f407xx.o(RESET) refers to stm32f4xx_it.o(.text.DMA2_Stream1_IRQHandler) for DMA2_Stream1_IRQHandler + startup_stm32f407xx.o(RESET) refers to stm32f4xx_it.o(.text.DMA2_Stream2_IRQHandler) for DMA2_Stream2_IRQHandler + startup_stm32f407xx.o(RESET) refers to stm32f4xx_it.o(.text.DMA2_Stream3_IRQHandler) for DMA2_Stream3_IRQHandler + startup_stm32f407xx.o(RESET) refers to stm32f4xx_it.o(.text.USART6_IRQHandler) for USART6_IRQHandler + startup_stm32f407xx.o(.text) refers (Special) to heapauxi.o(.text) for __use_two_region_memory + startup_stm32f407xx.o(.text) refers to system_stm32f4xx.o(.text.SystemInit) for SystemInit + startup_stm32f407xx.o(.text) refers to __main.o(!!!main) for __main + startup_stm32f407xx.o(.text) refers to startup_stm32f407xx.o(HEAP) for Heap_Mem + startup_stm32f407xx.o(.text) refers to startup_stm32f407xx.o(STACK) for Stack_Mem + main.o(.text.main) refers to stm32f4xx_hal.o(.text.HAL_Init) for HAL_Init + main.o(.text.main) refers to main.o(.text.SystemClock_Config) for SystemClock_Config + main.o(.text.main) refers to gpio.o(.text.MX_GPIO_Init) for MX_GPIO_Init + main.o(.text.main) refers to dma.o(.text.MX_DMA_Init) for MX_DMA_Init + main.o(.text.main) refers to i2c.o(.text.MX_I2C2_Init) for MX_I2C2_Init + main.o(.text.main) refers to i2c.o(.text.MX_I2C3_Init) for MX_I2C3_Init + main.o(.text.main) refers to tim.o(.text.MX_TIM1_Init) for MX_TIM1_Init + main.o(.text.main) refers to tim.o(.text.MX_TIM4_Init) for MX_TIM4_Init + main.o(.text.main) refers to tim.o(.text.MX_TIM5_Init) for MX_TIM5_Init + main.o(.text.main) refers to tim.o(.text.MX_TIM10_Init) for MX_TIM10_Init + main.o(.text.main) refers to spi.o(.text.MX_SPI1_Init) for MX_SPI1_Init + main.o(.text.main) refers to usart.o(.text.MX_USART6_UART_Init) for MX_USART6_UART_Init + main.o(.text.main) refers to cmsis_os2.o(.text.osKernelInitialize) for osKernelInitialize + main.o(.text.main) refers to freertos.o(.text.MX_FREERTOS_Init) for MX_FREERTOS_Init + main.o(.text.main) refers to cmsis_os2.o(.text.osKernelStart) for osKernelStart + main.o(.ARM.exidx.text.main) refers to main.o(.text.main) for [Anonymous Symbol] + main.o(.text.SystemClock_Config) refers to rt_memclr_w.o(.text) for __aeabi_memclr4 + main.o(.text.SystemClock_Config) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_OscConfig) for HAL_RCC_OscConfig + main.o(.text.SystemClock_Config) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_ClockConfig) for HAL_RCC_ClockConfig + main.o(.text.SystemClock_Config) refers to main.o(.text.Error_Handler) for Error_Handler + main.o(.ARM.exidx.text.SystemClock_Config) refers to main.o(.text.SystemClock_Config) for [Anonymous Symbol] + main.o(.ARM.exidx.text.Error_Handler) refers to main.o(.text.Error_Handler) for [Anonymous Symbol] + gpio.o(.text.MX_GPIO_Init) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_WritePin) for HAL_GPIO_WritePin + gpio.o(.text.MX_GPIO_Init) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_Init) for HAL_GPIO_Init + gpio.o(.text.MX_GPIO_Init) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SetPriority) for HAL_NVIC_SetPriority + gpio.o(.text.MX_GPIO_Init) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_EnableIRQ) for HAL_NVIC_EnableIRQ + gpio.o(.ARM.exidx.text.MX_GPIO_Init) refers to gpio.o(.text.MX_GPIO_Init) for [Anonymous Symbol] + freertos.o(.text.MX_FREERTOS_Init) refers to freertos.o(.text.StartDefaultTask) for StartDefaultTask + freertos.o(.text.MX_FREERTOS_Init) refers to freertos.o(.rodata.defaultTask_attributes) for defaultTask_attributes + freertos.o(.text.MX_FREERTOS_Init) refers to cmsis_os2.o(.text.osThreadNew) for osThreadNew + freertos.o(.text.MX_FREERTOS_Init) refers to freertos.o(.bss.defaultTaskHandle) for defaultTaskHandle + freertos.o(.ARM.exidx.text.MX_FREERTOS_Init) refers to freertos.o(.text.MX_FREERTOS_Init) for [Anonymous Symbol] + freertos.o(.text.StartDefaultTask) refers to cmsis_os2.o(.text.osDelay) for osDelay + freertos.o(.ARM.exidx.text.StartDefaultTask) refers to freertos.o(.text.StartDefaultTask) for [Anonymous Symbol] + freertos.o(.rodata.defaultTask_attributes) refers to freertos.o(.rodata.str1.1) for [Anonymous Symbol] + dma.o(.text.MX_DMA_Init) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SetPriority) for HAL_NVIC_SetPriority + dma.o(.text.MX_DMA_Init) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_EnableIRQ) for HAL_NVIC_EnableIRQ + dma.o(.ARM.exidx.text.MX_DMA_Init) refers to dma.o(.text.MX_DMA_Init) for [Anonymous Symbol] + i2c.o(.text.MX_I2C2_Init) refers to i2c.o(.bss.hi2c2) for hi2c2 + i2c.o(.text.MX_I2C2_Init) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Init) for HAL_I2C_Init + i2c.o(.text.MX_I2C2_Init) refers to main.o(.text.Error_Handler) for Error_Handler + i2c.o(.ARM.exidx.text.MX_I2C2_Init) refers to i2c.o(.text.MX_I2C2_Init) for [Anonymous Symbol] + i2c.o(.text.MX_I2C3_Init) refers to i2c.o(.bss.hi2c3) for hi2c3 + i2c.o(.text.MX_I2C3_Init) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Init) for HAL_I2C_Init + i2c.o(.text.MX_I2C3_Init) refers to main.o(.text.Error_Handler) for Error_Handler + i2c.o(.ARM.exidx.text.MX_I2C3_Init) refers to i2c.o(.text.MX_I2C3_Init) for [Anonymous Symbol] + i2c.o(.text.HAL_I2C_MspInit) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_Init) for HAL_GPIO_Init + i2c.o(.text.HAL_I2C_MspInit) refers to i2c.o(.bss.hdma_i2c3_rx) for hdma_i2c3_rx + i2c.o(.text.HAL_I2C_MspInit) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Init) for HAL_DMA_Init + i2c.o(.text.HAL_I2C_MspInit) refers to main.o(.text.Error_Handler) for Error_Handler + i2c.o(.ARM.exidx.text.HAL_I2C_MspInit) refers to i2c.o(.text.HAL_I2C_MspInit) for [Anonymous Symbol] + i2c.o(.text.HAL_I2C_MspDeInit) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_DeInit) for HAL_GPIO_DeInit + i2c.o(.text.HAL_I2C_MspDeInit) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_DeInit) for HAL_DMA_DeInit + i2c.o(.ARM.exidx.text.HAL_I2C_MspDeInit) refers to i2c.o(.text.HAL_I2C_MspDeInit) for [Anonymous Symbol] + spi.o(.text.MX_SPI1_Init) refers to spi.o(.bss.hspi1) for hspi1 + spi.o(.text.MX_SPI1_Init) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_Init) for HAL_SPI_Init + spi.o(.text.MX_SPI1_Init) refers to main.o(.text.Error_Handler) for Error_Handler + spi.o(.ARM.exidx.text.MX_SPI1_Init) refers to spi.o(.text.MX_SPI1_Init) for [Anonymous Symbol] + spi.o(.text.HAL_SPI_MspInit) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_Init) for HAL_GPIO_Init + spi.o(.text.HAL_SPI_MspInit) refers to spi.o(.bss.hdma_spi1_rx) for hdma_spi1_rx + spi.o(.text.HAL_SPI_MspInit) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Init) for HAL_DMA_Init + spi.o(.text.HAL_SPI_MspInit) refers to main.o(.text.Error_Handler) for Error_Handler + spi.o(.text.HAL_SPI_MspInit) refers to spi.o(.bss.hdma_spi1_tx) for hdma_spi1_tx + spi.o(.ARM.exidx.text.HAL_SPI_MspInit) refers to spi.o(.text.HAL_SPI_MspInit) for [Anonymous Symbol] + spi.o(.text.HAL_SPI_MspDeInit) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_DeInit) for HAL_GPIO_DeInit + spi.o(.text.HAL_SPI_MspDeInit) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_DeInit) for HAL_DMA_DeInit + spi.o(.ARM.exidx.text.HAL_SPI_MspDeInit) refers to spi.o(.text.HAL_SPI_MspDeInit) for [Anonymous Symbol] + tim.o(.text.MX_TIM1_Init) refers to tim.o(.bss.htim1) for htim1 + tim.o(.text.MX_TIM1_Init) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Init) for HAL_TIM_PWM_Init + tim.o(.text.MX_TIM1_Init) refers to main.o(.text.Error_Handler) for Error_Handler + tim.o(.text.MX_TIM1_Init) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_MasterConfigSynchronization) for HAL_TIMEx_MasterConfigSynchronization + tim.o(.text.MX_TIM1_Init) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_ConfigChannel) for HAL_TIM_PWM_ConfigChannel + tim.o(.text.MX_TIM1_Init) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_ConfigBreakDeadTime) for HAL_TIMEx_ConfigBreakDeadTime + tim.o(.text.MX_TIM1_Init) refers to tim.o(.text.HAL_TIM_MspPostInit) for HAL_TIM_MspPostInit + tim.o(.ARM.exidx.text.MX_TIM1_Init) refers to tim.o(.text.MX_TIM1_Init) for [Anonymous Symbol] + tim.o(.text.HAL_TIM_MspPostInit) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_Init) for HAL_GPIO_Init + tim.o(.ARM.exidx.text.HAL_TIM_MspPostInit) refers to tim.o(.text.HAL_TIM_MspPostInit) for [Anonymous Symbol] + tim.o(.text.MX_TIM4_Init) refers to tim.o(.bss.htim4) for htim4 + tim.o(.text.MX_TIM4_Init) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Init) for HAL_TIM_PWM_Init + tim.o(.text.MX_TIM4_Init) refers to main.o(.text.Error_Handler) for Error_Handler + tim.o(.text.MX_TIM4_Init) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_MasterConfigSynchronization) for HAL_TIMEx_MasterConfigSynchronization + tim.o(.text.MX_TIM4_Init) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_ConfigChannel) for HAL_TIM_PWM_ConfigChannel + tim.o(.text.MX_TIM4_Init) refers to tim.o(.text.HAL_TIM_MspPostInit) for HAL_TIM_MspPostInit + tim.o(.ARM.exidx.text.MX_TIM4_Init) refers to tim.o(.text.MX_TIM4_Init) for [Anonymous Symbol] + tim.o(.text.MX_TIM5_Init) refers to tim.o(.bss.htim5) for htim5 + tim.o(.text.MX_TIM5_Init) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Init) for HAL_TIM_PWM_Init + tim.o(.text.MX_TIM5_Init) refers to main.o(.text.Error_Handler) for Error_Handler + tim.o(.text.MX_TIM5_Init) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_MasterConfigSynchronization) for HAL_TIMEx_MasterConfigSynchronization + tim.o(.text.MX_TIM5_Init) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_ConfigChannel) for HAL_TIM_PWM_ConfigChannel + tim.o(.text.MX_TIM5_Init) refers to tim.o(.text.HAL_TIM_MspPostInit) for HAL_TIM_MspPostInit + tim.o(.ARM.exidx.text.MX_TIM5_Init) refers to tim.o(.text.MX_TIM5_Init) for [Anonymous Symbol] + tim.o(.text.MX_TIM10_Init) refers to tim.o(.bss.htim10) for htim10 + tim.o(.text.MX_TIM10_Init) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Init) for HAL_TIM_Base_Init + tim.o(.text.MX_TIM10_Init) refers to main.o(.text.Error_Handler) for Error_Handler + tim.o(.text.MX_TIM10_Init) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Init) for HAL_TIM_PWM_Init + tim.o(.text.MX_TIM10_Init) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_ConfigChannel) for HAL_TIM_PWM_ConfigChannel + tim.o(.text.MX_TIM10_Init) refers to tim.o(.text.HAL_TIM_MspPostInit) for HAL_TIM_MspPostInit + tim.o(.ARM.exidx.text.MX_TIM10_Init) refers to tim.o(.text.MX_TIM10_Init) for [Anonymous Symbol] + tim.o(.ARM.exidx.text.HAL_TIM_PWM_MspInit) refers to tim.o(.text.HAL_TIM_PWM_MspInit) for [Anonymous Symbol] + tim.o(.ARM.exidx.text.HAL_TIM_Base_MspInit) refers to tim.o(.text.HAL_TIM_Base_MspInit) for [Anonymous Symbol] + tim.o(.ARM.exidx.text.HAL_TIM_PWM_MspDeInit) refers to tim.o(.text.HAL_TIM_PWM_MspDeInit) for [Anonymous Symbol] + tim.o(.ARM.exidx.text.HAL_TIM_Base_MspDeInit) refers to tim.o(.text.HAL_TIM_Base_MspDeInit) for [Anonymous Symbol] + usart.o(.text.MX_USART6_UART_Init) refers to usart.o(.bss.huart6) for huart6 + usart.o(.text.MX_USART6_UART_Init) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_Init) for HAL_UART_Init + usart.o(.text.MX_USART6_UART_Init) refers to main.o(.text.Error_Handler) for Error_Handler + usart.o(.ARM.exidx.text.MX_USART6_UART_Init) refers to usart.o(.text.MX_USART6_UART_Init) for [Anonymous Symbol] + usart.o(.text.HAL_UART_MspInit) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_Init) for HAL_GPIO_Init + usart.o(.text.HAL_UART_MspInit) refers to usart.o(.bss.hdma_usart6_rx) for hdma_usart6_rx + usart.o(.text.HAL_UART_MspInit) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Init) for HAL_DMA_Init + usart.o(.text.HAL_UART_MspInit) refers to main.o(.text.Error_Handler) for Error_Handler + usart.o(.text.HAL_UART_MspInit) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SetPriority) for HAL_NVIC_SetPriority + usart.o(.text.HAL_UART_MspInit) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_EnableIRQ) for HAL_NVIC_EnableIRQ + usart.o(.ARM.exidx.text.HAL_UART_MspInit) refers to usart.o(.text.HAL_UART_MspInit) for [Anonymous Symbol] + usart.o(.text.HAL_UART_MspDeInit) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_DeInit) for HAL_GPIO_DeInit + usart.o(.text.HAL_UART_MspDeInit) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_DeInit) for HAL_DMA_DeInit + usart.o(.text.HAL_UART_MspDeInit) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_DisableIRQ) for HAL_NVIC_DisableIRQ + usart.o(.ARM.exidx.text.HAL_UART_MspDeInit) refers to usart.o(.text.HAL_UART_MspDeInit) for [Anonymous Symbol] + stm32f4xx_it.o(.ARM.exidx.text.NMI_Handler) refers to stm32f4xx_it.o(.text.NMI_Handler) for [Anonymous Symbol] + stm32f4xx_it.o(.ARM.exidx.text.HardFault_Handler) refers to stm32f4xx_it.o(.text.HardFault_Handler) for [Anonymous Symbol] + stm32f4xx_it.o(.ARM.exidx.text.MemManage_Handler) refers to stm32f4xx_it.o(.text.MemManage_Handler) for [Anonymous Symbol] + stm32f4xx_it.o(.ARM.exidx.text.BusFault_Handler) refers to stm32f4xx_it.o(.text.BusFault_Handler) for [Anonymous Symbol] + stm32f4xx_it.o(.ARM.exidx.text.UsageFault_Handler) refers to stm32f4xx_it.o(.text.UsageFault_Handler) for [Anonymous Symbol] + stm32f4xx_it.o(.ARM.exidx.text.DebugMon_Handler) refers to stm32f4xx_it.o(.text.DebugMon_Handler) for [Anonymous Symbol] + stm32f4xx_it.o(.text.SysTick_Handler) refers to stm32f4xx_hal.o(.text.HAL_IncTick) for HAL_IncTick + stm32f4xx_it.o(.text.SysTick_Handler) refers to tasks.o(.text.xTaskGetSchedulerState) for xTaskGetSchedulerState + stm32f4xx_it.o(.text.SysTick_Handler) refers to port.o(.text.xPortSysTickHandler) for xPortSysTickHandler + stm32f4xx_it.o(.ARM.exidx.text.SysTick_Handler) refers to stm32f4xx_it.o(.text.SysTick_Handler) for [Anonymous Symbol] + stm32f4xx_it.o(.text.EXTI3_IRQHandler) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_EXTI_IRQHandler) for HAL_GPIO_EXTI_IRQHandler + stm32f4xx_it.o(.ARM.exidx.text.EXTI3_IRQHandler) refers to stm32f4xx_it.o(.text.EXTI3_IRQHandler) for [Anonymous Symbol] + stm32f4xx_it.o(.text.EXTI4_IRQHandler) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_EXTI_IRQHandler) for HAL_GPIO_EXTI_IRQHandler + stm32f4xx_it.o(.ARM.exidx.text.EXTI4_IRQHandler) refers to stm32f4xx_it.o(.text.EXTI4_IRQHandler) for [Anonymous Symbol] + stm32f4xx_it.o(.text.DMA1_Stream2_IRQHandler) refers to i2c.o(.bss.hdma_i2c3_rx) for hdma_i2c3_rx + stm32f4xx_it.o(.text.DMA1_Stream2_IRQHandler) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_IRQHandler) for HAL_DMA_IRQHandler + stm32f4xx_it.o(.ARM.exidx.text.DMA1_Stream2_IRQHandler) refers to stm32f4xx_it.o(.text.DMA1_Stream2_IRQHandler) for [Anonymous Symbol] + stm32f4xx_it.o(.text.EXTI9_5_IRQHandler) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_EXTI_IRQHandler) for HAL_GPIO_EXTI_IRQHandler + stm32f4xx_it.o(.ARM.exidx.text.EXTI9_5_IRQHandler) refers to stm32f4xx_it.o(.text.EXTI9_5_IRQHandler) for [Anonymous Symbol] + stm32f4xx_it.o(.text.DMA2_Stream1_IRQHandler) refers to usart.o(.bss.hdma_usart6_rx) for hdma_usart6_rx + stm32f4xx_it.o(.text.DMA2_Stream1_IRQHandler) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_IRQHandler) for HAL_DMA_IRQHandler + stm32f4xx_it.o(.ARM.exidx.text.DMA2_Stream1_IRQHandler) refers to stm32f4xx_it.o(.text.DMA2_Stream1_IRQHandler) for [Anonymous Symbol] + stm32f4xx_it.o(.text.DMA2_Stream2_IRQHandler) refers to spi.o(.bss.hdma_spi1_rx) for hdma_spi1_rx + stm32f4xx_it.o(.text.DMA2_Stream2_IRQHandler) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_IRQHandler) for HAL_DMA_IRQHandler + stm32f4xx_it.o(.ARM.exidx.text.DMA2_Stream2_IRQHandler) refers to stm32f4xx_it.o(.text.DMA2_Stream2_IRQHandler) for [Anonymous Symbol] + stm32f4xx_it.o(.text.DMA2_Stream3_IRQHandler) refers to spi.o(.bss.hdma_spi1_tx) for hdma_spi1_tx + stm32f4xx_it.o(.text.DMA2_Stream3_IRQHandler) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_IRQHandler) for HAL_DMA_IRQHandler + stm32f4xx_it.o(.ARM.exidx.text.DMA2_Stream3_IRQHandler) refers to stm32f4xx_it.o(.text.DMA2_Stream3_IRQHandler) for [Anonymous Symbol] + stm32f4xx_it.o(.text.USART6_IRQHandler) refers to usart.o(.bss.huart6) for huart6 + stm32f4xx_it.o(.text.USART6_IRQHandler) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_IRQHandler) for HAL_UART_IRQHandler + stm32f4xx_it.o(.ARM.exidx.text.USART6_IRQHandler) refers to stm32f4xx_it.o(.text.USART6_IRQHandler) for [Anonymous Symbol] + stm32f4xx_hal_msp.o(.text.HAL_MspInit) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SetPriority) for HAL_NVIC_SetPriority + stm32f4xx_hal_msp.o(.ARM.exidx.text.HAL_MspInit) refers to stm32f4xx_hal_msp.o(.text.HAL_MspInit) for [Anonymous Symbol] + stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_DeInit) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_DeInit) for [Anonymous Symbol] + stm32f4xx_hal_rcc.o(.text.HAL_RCC_OscConfig) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_OscConfig) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_OscConfig) for [Anonymous Symbol] + stm32f4xx_hal_rcc.o(.text.HAL_RCC_ClockConfig) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetSysClockFreq) for HAL_RCC_GetSysClockFreq + stm32f4xx_hal_rcc.o(.text.HAL_RCC_ClockConfig) refers to system_stm32f4xx.o(.rodata.AHBPrescTable) for AHBPrescTable + stm32f4xx_hal_rcc.o(.text.HAL_RCC_ClockConfig) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_rcc.o(.text.HAL_RCC_ClockConfig) refers to stm32f4xx_hal.o(.data.uwTickPrio) for uwTickPrio + stm32f4xx_hal_rcc.o(.text.HAL_RCC_ClockConfig) refers to stm32f4xx_hal.o(.text.HAL_InitTick) for HAL_InitTick + stm32f4xx_hal_rcc.o(.text.HAL_RCC_ClockConfig) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_ClockConfig) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_ClockConfig) for [Anonymous Symbol] + stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetSysClockFreq) refers to lludivv7m.o(.text) for __aeabi_uldivmod + stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_GetSysClockFreq) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetSysClockFreq) for [Anonymous Symbol] + stm32f4xx_hal_rcc.o(.text.HAL_RCC_MCOConfig) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_Init) for HAL_GPIO_Init + stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_MCOConfig) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_MCOConfig) for [Anonymous Symbol] + stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_EnableCSS) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_EnableCSS) for [Anonymous Symbol] + stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_DisableCSS) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_DisableCSS) for [Anonymous Symbol] + stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetHCLKFreq) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_GetHCLKFreq) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetHCLKFreq) for [Anonymous Symbol] + stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetPCLK1Freq) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetHCLKFreq) for HAL_RCC_GetHCLKFreq + stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetPCLK1Freq) refers to system_stm32f4xx.o(.rodata.APBPrescTable) for APBPrescTable + stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_GetPCLK1Freq) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetPCLK1Freq) for [Anonymous Symbol] + stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetPCLK2Freq) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetHCLKFreq) for HAL_RCC_GetHCLKFreq + stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetPCLK2Freq) refers to system_stm32f4xx.o(.rodata.APBPrescTable) for APBPrescTable + stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_GetPCLK2Freq) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetPCLK2Freq) for [Anonymous Symbol] + stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_GetOscConfig) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetOscConfig) for [Anonymous Symbol] + stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_GetClockConfig) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetClockConfig) for [Anonymous Symbol] + stm32f4xx_hal_rcc.o(.text.HAL_RCC_NMI_IRQHandler) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_CSSCallback) for HAL_RCC_CSSCallback + stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_NMI_IRQHandler) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_NMI_IRQHandler) for [Anonymous Symbol] + stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_CSSCallback) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_CSSCallback) for [Anonymous Symbol] + stm32f4xx_hal_rcc_ex.o(.text.HAL_RCCEx_PeriphCLKConfig) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_rcc_ex.o(.ARM.exidx.text.HAL_RCCEx_PeriphCLKConfig) refers to stm32f4xx_hal_rcc_ex.o(.text.HAL_RCCEx_PeriphCLKConfig) for [Anonymous Symbol] + stm32f4xx_hal_rcc_ex.o(.ARM.exidx.text.HAL_RCCEx_GetPeriphCLKConfig) refers to stm32f4xx_hal_rcc_ex.o(.text.HAL_RCCEx_GetPeriphCLKConfig) for [Anonymous Symbol] + stm32f4xx_hal_rcc_ex.o(.ARM.exidx.text.HAL_RCCEx_GetPeriphCLKFreq) refers to stm32f4xx_hal_rcc_ex.o(.text.HAL_RCCEx_GetPeriphCLKFreq) for [Anonymous Symbol] + stm32f4xx_hal_rcc_ex.o(.text.HAL_RCCEx_EnablePLLI2S) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_rcc_ex.o(.ARM.exidx.text.HAL_RCCEx_EnablePLLI2S) refers to stm32f4xx_hal_rcc_ex.o(.text.HAL_RCCEx_EnablePLLI2S) for [Anonymous Symbol] + stm32f4xx_hal_rcc_ex.o(.text.HAL_RCCEx_DisablePLLI2S) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_rcc_ex.o(.ARM.exidx.text.HAL_RCCEx_DisablePLLI2S) refers to stm32f4xx_hal_rcc_ex.o(.text.HAL_RCCEx_DisablePLLI2S) for [Anonymous Symbol] + stm32f4xx_hal_rcc_ex.o(.text.HAL_RCC_DeInit) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_rcc_ex.o(.text.HAL_RCC_DeInit) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_rcc_ex.o(.text.HAL_RCC_DeInit) refers to stm32f4xx_hal.o(.data.uwTickPrio) for uwTickPrio + stm32f4xx_hal_rcc_ex.o(.text.HAL_RCC_DeInit) refers to stm32f4xx_hal.o(.text.HAL_InitTick) for HAL_InitTick + stm32f4xx_hal_rcc_ex.o(.ARM.exidx.text.HAL_RCC_DeInit) refers to stm32f4xx_hal_rcc_ex.o(.text.HAL_RCC_DeInit) for [Anonymous Symbol] + stm32f4xx_hal_flash.o(.text.HAL_FLASH_Program) refers to stm32f4xx_hal_flash.o(.data.pFlash) for pFlash + stm32f4xx_hal_flash.o(.text.HAL_FLASH_Program) refers to stm32f4xx_hal_flash.o(.text.FLASH_WaitForLastOperation) for FLASH_WaitForLastOperation + stm32f4xx_hal_flash.o(.text.HAL_FLASH_Program) refers to stm32f4xx_hal_flash.o(.text.FLASH_Program_Byte) for FLASH_Program_Byte + stm32f4xx_hal_flash.o(.text.HAL_FLASH_Program) refers to stm32f4xx_hal_flash.o(.text.FLASH_Program_Word) for FLASH_Program_Word + stm32f4xx_hal_flash.o(.text.HAL_FLASH_Program) refers to stm32f4xx_hal_flash.o(.text.FLASH_Program_HalfWord) for FLASH_Program_HalfWord + stm32f4xx_hal_flash.o(.text.HAL_FLASH_Program) refers to stm32f4xx_hal_flash.o(.text.FLASH_Program_DoubleWord) for FLASH_Program_DoubleWord + stm32f4xx_hal_flash.o(.ARM.exidx.text.HAL_FLASH_Program) refers to stm32f4xx_hal_flash.o(.text.HAL_FLASH_Program) for [Anonymous Symbol] + stm32f4xx_hal_flash.o(.text.FLASH_WaitForLastOperation) refers to stm32f4xx_hal_flash.o(.data.pFlash) for pFlash + stm32f4xx_hal_flash.o(.text.FLASH_WaitForLastOperation) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_flash.o(.text.FLASH_WaitForLastOperation) refers to stm32f4xx_hal_flash.o(.text.FLASH_SetErrorCode) for FLASH_SetErrorCode + stm32f4xx_hal_flash.o(.ARM.exidx.text.FLASH_WaitForLastOperation) refers to stm32f4xx_hal_flash.o(.text.FLASH_WaitForLastOperation) for [Anonymous Symbol] + stm32f4xx_hal_flash.o(.ARM.exidx.text.FLASH_Program_Byte) refers to stm32f4xx_hal_flash.o(.text.FLASH_Program_Byte) for [Anonymous Symbol] + stm32f4xx_hal_flash.o(.ARM.exidx.text.FLASH_Program_HalfWord) refers to stm32f4xx_hal_flash.o(.text.FLASH_Program_HalfWord) for [Anonymous Symbol] + stm32f4xx_hal_flash.o(.ARM.exidx.text.FLASH_Program_Word) refers to stm32f4xx_hal_flash.o(.text.FLASH_Program_Word) for [Anonymous Symbol] + stm32f4xx_hal_flash.o(.ARM.exidx.text.FLASH_Program_DoubleWord) refers to stm32f4xx_hal_flash.o(.text.FLASH_Program_DoubleWord) for [Anonymous Symbol] + stm32f4xx_hal_flash.o(.text.HAL_FLASH_Program_IT) refers to stm32f4xx_hal_flash.o(.data.pFlash) for pFlash + stm32f4xx_hal_flash.o(.text.HAL_FLASH_Program_IT) refers to stm32f4xx_hal_flash.o(.text.FLASH_Program_Byte) for FLASH_Program_Byte + stm32f4xx_hal_flash.o(.text.HAL_FLASH_Program_IT) refers to stm32f4xx_hal_flash.o(.text.FLASH_Program_Word) for FLASH_Program_Word + stm32f4xx_hal_flash.o(.text.HAL_FLASH_Program_IT) refers to stm32f4xx_hal_flash.o(.text.FLASH_Program_HalfWord) for FLASH_Program_HalfWord + stm32f4xx_hal_flash.o(.text.HAL_FLASH_Program_IT) refers to stm32f4xx_hal_flash.o(.text.FLASH_Program_DoubleWord) for FLASH_Program_DoubleWord + stm32f4xx_hal_flash.o(.ARM.exidx.text.HAL_FLASH_Program_IT) refers to stm32f4xx_hal_flash.o(.text.HAL_FLASH_Program_IT) for [Anonymous Symbol] + stm32f4xx_hal_flash.o(.text.HAL_FLASH_IRQHandler) refers to stm32f4xx_hal_flash.o(.data.pFlash) for pFlash + stm32f4xx_hal_flash.o(.text.HAL_FLASH_IRQHandler) refers to stm32f4xx_hal_flash.o(.text.FLASH_SetErrorCode) for FLASH_SetErrorCode + stm32f4xx_hal_flash.o(.text.HAL_FLASH_IRQHandler) refers to stm32f4xx_hal_flash.o(.text.HAL_FLASH_OperationErrorCallback) for HAL_FLASH_OperationErrorCallback + stm32f4xx_hal_flash.o(.text.HAL_FLASH_IRQHandler) refers to stm32f4xx_hal_flash.o(.text.HAL_FLASH_EndOfOperationCallback) for HAL_FLASH_EndOfOperationCallback + stm32f4xx_hal_flash.o(.text.HAL_FLASH_IRQHandler) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_Erase_Sector) for FLASH_Erase_Sector + stm32f4xx_hal_flash.o(.text.HAL_FLASH_IRQHandler) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_FlushCaches) for FLASH_FlushCaches + stm32f4xx_hal_flash.o(.ARM.exidx.text.HAL_FLASH_IRQHandler) refers to stm32f4xx_hal_flash.o(.text.HAL_FLASH_IRQHandler) for [Anonymous Symbol] + stm32f4xx_hal_flash.o(.text.FLASH_SetErrorCode) refers to stm32f4xx_hal_flash.o(.data.pFlash) for pFlash + stm32f4xx_hal_flash.o(.ARM.exidx.text.FLASH_SetErrorCode) refers to stm32f4xx_hal_flash.o(.text.FLASH_SetErrorCode) for [Anonymous Symbol] + stm32f4xx_hal_flash.o(.ARM.exidx.text.HAL_FLASH_OperationErrorCallback) refers to stm32f4xx_hal_flash.o(.text.HAL_FLASH_OperationErrorCallback) for [Anonymous Symbol] + stm32f4xx_hal_flash.o(.ARM.exidx.text.HAL_FLASH_EndOfOperationCallback) refers to stm32f4xx_hal_flash.o(.text.HAL_FLASH_EndOfOperationCallback) for [Anonymous Symbol] + stm32f4xx_hal_flash.o(.ARM.exidx.text.HAL_FLASH_Unlock) refers to stm32f4xx_hal_flash.o(.text.HAL_FLASH_Unlock) for [Anonymous Symbol] + stm32f4xx_hal_flash.o(.ARM.exidx.text.HAL_FLASH_Lock) refers to stm32f4xx_hal_flash.o(.text.HAL_FLASH_Lock) for [Anonymous Symbol] + stm32f4xx_hal_flash.o(.ARM.exidx.text.HAL_FLASH_OB_Unlock) refers to stm32f4xx_hal_flash.o(.text.HAL_FLASH_OB_Unlock) for [Anonymous Symbol] + stm32f4xx_hal_flash.o(.ARM.exidx.text.HAL_FLASH_OB_Lock) refers to stm32f4xx_hal_flash.o(.text.HAL_FLASH_OB_Lock) for [Anonymous Symbol] + stm32f4xx_hal_flash.o(.text.HAL_FLASH_OB_Launch) refers to stm32f4xx_hal_flash.o(.text.FLASH_WaitForLastOperation) for FLASH_WaitForLastOperation + stm32f4xx_hal_flash.o(.ARM.exidx.text.HAL_FLASH_OB_Launch) refers to stm32f4xx_hal_flash.o(.text.HAL_FLASH_OB_Launch) for [Anonymous Symbol] + stm32f4xx_hal_flash.o(.text.HAL_FLASH_GetError) refers to stm32f4xx_hal_flash.o(.data.pFlash) for pFlash + stm32f4xx_hal_flash.o(.ARM.exidx.text.HAL_FLASH_GetError) refers to stm32f4xx_hal_flash.o(.text.HAL_FLASH_GetError) for [Anonymous Symbol] + stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_Erase) refers to stm32f4xx_hal_flash.o(.data.pFlash) for pFlash + stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_Erase) refers to stm32f4xx_hal_flash.o(.text.FLASH_WaitForLastOperation) for FLASH_WaitForLastOperation + stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_Erase) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_MassErase) for FLASH_MassErase + stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_Erase) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_Erase_Sector) for FLASH_Erase_Sector + stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_Erase) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_FlushCaches) for FLASH_FlushCaches + stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.HAL_FLASHEx_Erase) refers to stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_Erase) for [Anonymous Symbol] + stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_MassErase) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_MassErase) for [Anonymous Symbol] + stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_Erase_Sector) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_Erase_Sector) for [Anonymous Symbol] + stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_FlushCaches) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_FlushCaches) for [Anonymous Symbol] + stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_Erase_IT) refers to stm32f4xx_hal_flash.o(.data.pFlash) for pFlash + stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_Erase_IT) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_MassErase) for FLASH_MassErase + stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_Erase_IT) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_Erase_Sector) for FLASH_Erase_Sector + stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.HAL_FLASHEx_Erase_IT) refers to stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_Erase_IT) for [Anonymous Symbol] + stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_OBProgram) refers to stm32f4xx_hal_flash.o(.data.pFlash) for pFlash + stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_OBProgram) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_EnableWRP) for FLASH_OB_EnableWRP + stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_OBProgram) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_DisableWRP) for FLASH_OB_DisableWRP + stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_OBProgram) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_RDP_LevelConfig) for FLASH_OB_RDP_LevelConfig + stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_OBProgram) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_UserConfig) for FLASH_OB_UserConfig + stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_OBProgram) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_BOR_LevelConfig) for FLASH_OB_BOR_LevelConfig + stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.HAL_FLASHEx_OBProgram) refers to stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_OBProgram) for [Anonymous Symbol] + stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_EnableWRP) refers to stm32f4xx_hal_flash.o(.text.FLASH_WaitForLastOperation) for FLASH_WaitForLastOperation + stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_OB_EnableWRP) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_EnableWRP) for [Anonymous Symbol] + stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_DisableWRP) refers to stm32f4xx_hal_flash.o(.text.FLASH_WaitForLastOperation) for FLASH_WaitForLastOperation + stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_OB_DisableWRP) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_DisableWRP) for [Anonymous Symbol] + stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_RDP_LevelConfig) refers to stm32f4xx_hal_flash.o(.text.FLASH_WaitForLastOperation) for FLASH_WaitForLastOperation + stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_OB_RDP_LevelConfig) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_RDP_LevelConfig) for [Anonymous Symbol] + stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_UserConfig) refers to stm32f4xx_hal_flash.o(.text.FLASH_WaitForLastOperation) for FLASH_WaitForLastOperation + stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_OB_UserConfig) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_UserConfig) for [Anonymous Symbol] + stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_OB_BOR_LevelConfig) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_BOR_LevelConfig) for [Anonymous Symbol] + stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_OBGetConfig) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_GetWRP) for FLASH_OB_GetWRP + stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_OBGetConfig) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_GetRDP) for FLASH_OB_GetRDP + stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_OBGetConfig) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_GetUser) for FLASH_OB_GetUser + stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_OBGetConfig) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_GetBOR) for FLASH_OB_GetBOR + stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.HAL_FLASHEx_OBGetConfig) refers to stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_OBGetConfig) for [Anonymous Symbol] + stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_OB_GetWRP) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_GetWRP) for [Anonymous Symbol] + stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_OB_GetRDP) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_GetRDP) for [Anonymous Symbol] + stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_OB_GetUser) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_GetUser) for [Anonymous Symbol] + stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_OB_GetBOR) refers to stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_GetBOR) for [Anonymous Symbol] + stm32f4xx_hal_gpio.o(.ARM.exidx.text.HAL_GPIO_Init) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_Init) for [Anonymous Symbol] + stm32f4xx_hal_gpio.o(.ARM.exidx.text.HAL_GPIO_DeInit) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_DeInit) for [Anonymous Symbol] + stm32f4xx_hal_gpio.o(.ARM.exidx.text.HAL_GPIO_ReadPin) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_ReadPin) for [Anonymous Symbol] + stm32f4xx_hal_gpio.o(.ARM.exidx.text.HAL_GPIO_WritePin) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_WritePin) for [Anonymous Symbol] + stm32f4xx_hal_gpio.o(.ARM.exidx.text.HAL_GPIO_TogglePin) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_TogglePin) for [Anonymous Symbol] + stm32f4xx_hal_gpio.o(.ARM.exidx.text.HAL_GPIO_LockPin) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_LockPin) for [Anonymous Symbol] + stm32f4xx_hal_gpio.o(.text.HAL_GPIO_EXTI_IRQHandler) refers to gpio_1.o(.text.HAL_GPIO_EXTI_Callback) for HAL_GPIO_EXTI_Callback + stm32f4xx_hal_gpio.o(.ARM.exidx.text.HAL_GPIO_EXTI_IRQHandler) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_EXTI_IRQHandler) for [Anonymous Symbol] + stm32f4xx_hal_gpio.o(.ARM.exidx.text.HAL_GPIO_EXTI_Callback) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_EXTI_Callback) for [Anonymous Symbol] + stm32f4xx_hal_dma_ex.o(.text.HAL_DMAEx_MultiBufferStart) refers to stm32f4xx_hal_dma_ex.o(.text.DMA_MultiBufferSetConfig) for DMA_MultiBufferSetConfig + stm32f4xx_hal_dma_ex.o(.ARM.exidx.text.HAL_DMAEx_MultiBufferStart) refers to stm32f4xx_hal_dma_ex.o(.text.HAL_DMAEx_MultiBufferStart) for [Anonymous Symbol] + stm32f4xx_hal_dma_ex.o(.ARM.exidx.text.DMA_MultiBufferSetConfig) refers to stm32f4xx_hal_dma_ex.o(.text.DMA_MultiBufferSetConfig) for [Anonymous Symbol] + stm32f4xx_hal_dma_ex.o(.text.HAL_DMAEx_MultiBufferStart_IT) refers to stm32f4xx_hal_dma_ex.o(.text.DMA_MultiBufferSetConfig) for DMA_MultiBufferSetConfig + stm32f4xx_hal_dma_ex.o(.ARM.exidx.text.HAL_DMAEx_MultiBufferStart_IT) refers to stm32f4xx_hal_dma_ex.o(.text.HAL_DMAEx_MultiBufferStart_IT) for [Anonymous Symbol] + stm32f4xx_hal_dma_ex.o(.ARM.exidx.text.HAL_DMAEx_ChangeMemory) refers to stm32f4xx_hal_dma_ex.o(.text.HAL_DMAEx_ChangeMemory) for [Anonymous Symbol] + stm32f4xx_hal_dma.o(.text.HAL_DMA_Init) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_dma.o(.text.HAL_DMA_Init) refers to stm32f4xx_hal_dma.o(.text.DMA_CheckFifoParam) for DMA_CheckFifoParam + stm32f4xx_hal_dma.o(.text.HAL_DMA_Init) refers to stm32f4xx_hal_dma.o(.text.DMA_CalcBaseAndBitshift) for DMA_CalcBaseAndBitshift + stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_Init) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Init) for [Anonymous Symbol] + stm32f4xx_hal_dma.o(.ARM.exidx.text.DMA_CheckFifoParam) refers to stm32f4xx_hal_dma.o(.text.DMA_CheckFifoParam) for [Anonymous Symbol] + stm32f4xx_hal_dma.o(.ARM.exidx.text.DMA_CalcBaseAndBitshift) refers to stm32f4xx_hal_dma.o(.text.DMA_CalcBaseAndBitshift) for [Anonymous Symbol] + stm32f4xx_hal_dma.o(.text.HAL_DMA_DeInit) refers to stm32f4xx_hal_dma.o(.text.DMA_CalcBaseAndBitshift) for DMA_CalcBaseAndBitshift + stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_DeInit) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_DeInit) for [Anonymous Symbol] + stm32f4xx_hal_dma.o(.text.HAL_DMA_Start) refers to stm32f4xx_hal_dma.o(.text.DMA_SetConfig) for DMA_SetConfig + stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_Start) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start) for [Anonymous Symbol] + stm32f4xx_hal_dma.o(.ARM.exidx.text.DMA_SetConfig) refers to stm32f4xx_hal_dma.o(.text.DMA_SetConfig) for [Anonymous Symbol] + stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) refers to stm32f4xx_hal_dma.o(.text.DMA_SetConfig) for DMA_SetConfig + stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_Start_IT) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for [Anonymous Symbol] + stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_Abort) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort) for [Anonymous Symbol] + stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_Abort_IT) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for [Anonymous Symbol] + stm32f4xx_hal_dma.o(.text.HAL_DMA_PollForTransfer) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_dma.o(.text.HAL_DMA_PollForTransfer) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort) for HAL_DMA_Abort + stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_PollForTransfer) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_PollForTransfer) for [Anonymous Symbol] + stm32f4xx_hal_dma.o(.text.HAL_DMA_IRQHandler) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_IRQHandler) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_IRQHandler) for [Anonymous Symbol] + stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_RegisterCallback) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_RegisterCallback) for [Anonymous Symbol] + stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_UnRegisterCallback) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_UnRegisterCallback) for [Anonymous Symbol] + stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_GetState) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_GetState) for [Anonymous Symbol] + stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_GetError) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_GetError) for [Anonymous Symbol] + stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_DeInit) refers to stm32f4xx_hal_pwr.o(.text.HAL_PWR_DeInit) for [Anonymous Symbol] + stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_EnableBkUpAccess) refers to stm32f4xx_hal_pwr.o(.text.HAL_PWR_EnableBkUpAccess) for [Anonymous Symbol] + stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_DisableBkUpAccess) refers to stm32f4xx_hal_pwr.o(.text.HAL_PWR_DisableBkUpAccess) for [Anonymous Symbol] + stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_ConfigPVD) refers to stm32f4xx_hal_pwr.o(.text.HAL_PWR_ConfigPVD) for [Anonymous Symbol] + stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_EnablePVD) refers to stm32f4xx_hal_pwr.o(.text.HAL_PWR_EnablePVD) for [Anonymous Symbol] + stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_DisablePVD) refers to stm32f4xx_hal_pwr.o(.text.HAL_PWR_DisablePVD) for [Anonymous Symbol] + stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_EnableWakeUpPin) refers to stm32f4xx_hal_pwr.o(.text.HAL_PWR_EnableWakeUpPin) for [Anonymous Symbol] + stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_DisableWakeUpPin) refers to stm32f4xx_hal_pwr.o(.text.HAL_PWR_DisableWakeUpPin) for [Anonymous Symbol] + stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_EnterSLEEPMode) refers to stm32f4xx_hal_pwr.o(.text.HAL_PWR_EnterSLEEPMode) for [Anonymous Symbol] + stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_EnterSTOPMode) refers to stm32f4xx_hal_pwr.o(.text.HAL_PWR_EnterSTOPMode) for [Anonymous Symbol] + stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_EnterSTANDBYMode) refers to stm32f4xx_hal_pwr.o(.text.HAL_PWR_EnterSTANDBYMode) for [Anonymous Symbol] + stm32f4xx_hal_pwr.o(.text.HAL_PWR_PVD_IRQHandler) refers to stm32f4xx_hal_pwr.o(.text.HAL_PWR_PVDCallback) for HAL_PWR_PVDCallback + stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_PVD_IRQHandler) refers to stm32f4xx_hal_pwr.o(.text.HAL_PWR_PVD_IRQHandler) for [Anonymous Symbol] + stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_PVDCallback) refers to stm32f4xx_hal_pwr.o(.text.HAL_PWR_PVDCallback) for [Anonymous Symbol] + stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_EnableSleepOnExit) refers to stm32f4xx_hal_pwr.o(.text.HAL_PWR_EnableSleepOnExit) for [Anonymous Symbol] + stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_DisableSleepOnExit) refers to stm32f4xx_hal_pwr.o(.text.HAL_PWR_DisableSleepOnExit) for [Anonymous Symbol] + stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_EnableSEVOnPend) refers to stm32f4xx_hal_pwr.o(.text.HAL_PWR_EnableSEVOnPend) for [Anonymous Symbol] + stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_DisableSEVOnPend) refers to stm32f4xx_hal_pwr.o(.text.HAL_PWR_DisableSEVOnPend) for [Anonymous Symbol] + stm32f4xx_hal_pwr_ex.o(.text.HAL_PWREx_EnableBkUpReg) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_pwr_ex.o(.ARM.exidx.text.HAL_PWREx_EnableBkUpReg) refers to stm32f4xx_hal_pwr_ex.o(.text.HAL_PWREx_EnableBkUpReg) for [Anonymous Symbol] + stm32f4xx_hal_pwr_ex.o(.text.HAL_PWREx_DisableBkUpReg) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_pwr_ex.o(.ARM.exidx.text.HAL_PWREx_DisableBkUpReg) refers to stm32f4xx_hal_pwr_ex.o(.text.HAL_PWREx_DisableBkUpReg) for [Anonymous Symbol] + stm32f4xx_hal_pwr_ex.o(.ARM.exidx.text.HAL_PWREx_EnableFlashPowerDown) refers to stm32f4xx_hal_pwr_ex.o(.text.HAL_PWREx_EnableFlashPowerDown) for [Anonymous Symbol] + stm32f4xx_hal_pwr_ex.o(.ARM.exidx.text.HAL_PWREx_DisableFlashPowerDown) refers to stm32f4xx_hal_pwr_ex.o(.text.HAL_PWREx_DisableFlashPowerDown) for [Anonymous Symbol] + stm32f4xx_hal_pwr_ex.o(.ARM.exidx.text.HAL_PWREx_GetVoltageRange) refers to stm32f4xx_hal_pwr_ex.o(.text.HAL_PWREx_GetVoltageRange) for [Anonymous Symbol] + stm32f4xx_hal_pwr_ex.o(.text.HAL_PWREx_ControlVoltageScaling) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_pwr_ex.o(.ARM.exidx.text.HAL_PWREx_ControlVoltageScaling) refers to stm32f4xx_hal_pwr_ex.o(.text.HAL_PWREx_ControlVoltageScaling) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SetPriorityGrouping) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_SetPriorityGrouping) for __NVIC_SetPriorityGrouping + stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_NVIC_SetPriorityGrouping) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SetPriorityGrouping) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.ARM.exidx.text.__NVIC_SetPriorityGrouping) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_SetPriorityGrouping) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SetPriority) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_GetPriorityGrouping) for __NVIC_GetPriorityGrouping + stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SetPriority) refers to stm32f4xx_hal_cortex.o(.text.NVIC_EncodePriority) for NVIC_EncodePriority + stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SetPriority) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_SetPriority) for __NVIC_SetPriority + stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_NVIC_SetPriority) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SetPriority) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.ARM.exidx.text.__NVIC_GetPriorityGrouping) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_GetPriorityGrouping) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.ARM.exidx.text.__NVIC_SetPriority) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_SetPriority) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.ARM.exidx.text.NVIC_EncodePriority) refers to stm32f4xx_hal_cortex.o(.text.NVIC_EncodePriority) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.text.HAL_NVIC_EnableIRQ) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_EnableIRQ) for __NVIC_EnableIRQ + stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_NVIC_EnableIRQ) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_EnableIRQ) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.ARM.exidx.text.__NVIC_EnableIRQ) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_EnableIRQ) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.text.HAL_NVIC_DisableIRQ) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_DisableIRQ) for __NVIC_DisableIRQ + stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_NVIC_DisableIRQ) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_DisableIRQ) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.ARM.exidx.text.__NVIC_DisableIRQ) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_DisableIRQ) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SystemReset) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_SystemReset) for __NVIC_SystemReset + stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_NVIC_SystemReset) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SystemReset) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.ARM.exidx.text.__NVIC_SystemReset) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_SystemReset) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.text.HAL_SYSTICK_Config) refers to stm32f4xx_hal_cortex.o(.text.SysTick_Config) for SysTick_Config + stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_SYSTICK_Config) refers to stm32f4xx_hal_cortex.o(.text.HAL_SYSTICK_Config) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.text.SysTick_Config) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_SetPriority) for __NVIC_SetPriority + stm32f4xx_hal_cortex.o(.ARM.exidx.text.SysTick_Config) refers to stm32f4xx_hal_cortex.o(.text.SysTick_Config) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_MPU_Disable) refers to stm32f4xx_hal_cortex.o(.text.HAL_MPU_Disable) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_MPU_Enable) refers to stm32f4xx_hal_cortex.o(.text.HAL_MPU_Enable) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_MPU_EnableRegion) refers to stm32f4xx_hal_cortex.o(.text.HAL_MPU_EnableRegion) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_MPU_DisableRegion) refers to stm32f4xx_hal_cortex.o(.text.HAL_MPU_DisableRegion) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_MPU_ConfigRegion) refers to stm32f4xx_hal_cortex.o(.text.HAL_MPU_ConfigRegion) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_CORTEX_ClearEvent) refers to stm32f4xx_hal_cortex.o(.text.HAL_CORTEX_ClearEvent) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.text.HAL_NVIC_GetPriorityGrouping) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_GetPriorityGrouping) for __NVIC_GetPriorityGrouping + stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_NVIC_GetPriorityGrouping) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_GetPriorityGrouping) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.text.HAL_NVIC_GetPriority) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_GetPriority) for __NVIC_GetPriority + stm32f4xx_hal_cortex.o(.text.HAL_NVIC_GetPriority) refers to stm32f4xx_hal_cortex.o(.text.NVIC_DecodePriority) for NVIC_DecodePriority + stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_NVIC_GetPriority) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_GetPriority) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.ARM.exidx.text.NVIC_DecodePriority) refers to stm32f4xx_hal_cortex.o(.text.NVIC_DecodePriority) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.ARM.exidx.text.__NVIC_GetPriority) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_GetPriority) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SetPendingIRQ) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_SetPendingIRQ) for __NVIC_SetPendingIRQ + stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_NVIC_SetPendingIRQ) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SetPendingIRQ) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.ARM.exidx.text.__NVIC_SetPendingIRQ) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_SetPendingIRQ) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.text.HAL_NVIC_GetPendingIRQ) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_GetPendingIRQ) for __NVIC_GetPendingIRQ + stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_NVIC_GetPendingIRQ) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_GetPendingIRQ) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.ARM.exidx.text.__NVIC_GetPendingIRQ) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_GetPendingIRQ) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.text.HAL_NVIC_ClearPendingIRQ) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_ClearPendingIRQ) for __NVIC_ClearPendingIRQ + stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_NVIC_ClearPendingIRQ) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_ClearPendingIRQ) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.ARM.exidx.text.__NVIC_ClearPendingIRQ) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_ClearPendingIRQ) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.text.HAL_NVIC_GetActive) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_GetActive) for __NVIC_GetActive + stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_NVIC_GetActive) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_GetActive) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.ARM.exidx.text.__NVIC_GetActive) refers to stm32f4xx_hal_cortex.o(.text.__NVIC_GetActive) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_SYSTICK_CLKSourceConfig) refers to stm32f4xx_hal_cortex.o(.text.HAL_SYSTICK_CLKSourceConfig) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.text.HAL_SYSTICK_IRQHandler) refers to stm32f4xx_hal_cortex.o(.text.HAL_SYSTICK_Callback) for HAL_SYSTICK_Callback + stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_SYSTICK_IRQHandler) refers to stm32f4xx_hal_cortex.o(.text.HAL_SYSTICK_IRQHandler) for [Anonymous Symbol] + stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_SYSTICK_Callback) refers to stm32f4xx_hal_cortex.o(.text.HAL_SYSTICK_Callback) for [Anonymous Symbol] + stm32f4xx_hal.o(.text.HAL_Init) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SetPriorityGrouping) for HAL_NVIC_SetPriorityGrouping + stm32f4xx_hal.o(.text.HAL_Init) refers to stm32f4xx_hal.o(.text.HAL_InitTick) for HAL_InitTick + stm32f4xx_hal.o(.text.HAL_Init) refers to stm32f4xx_hal_msp.o(.text.HAL_MspInit) for HAL_MspInit + stm32f4xx_hal.o(.ARM.exidx.text.HAL_Init) refers to stm32f4xx_hal.o(.text.HAL_Init) for [Anonymous Symbol] + stm32f4xx_hal.o(.text.HAL_InitTick) refers to stm32f4xx_hal.o(.data.uwTickFreq) for uwTickFreq + stm32f4xx_hal.o(.text.HAL_InitTick) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal.o(.text.HAL_InitTick) refers to stm32f4xx_hal_cortex.o(.text.HAL_SYSTICK_Config) for HAL_SYSTICK_Config + stm32f4xx_hal.o(.text.HAL_InitTick) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SetPriority) for HAL_NVIC_SetPriority + stm32f4xx_hal.o(.text.HAL_InitTick) refers to stm32f4xx_hal.o(.data.uwTickPrio) for uwTickPrio + stm32f4xx_hal.o(.ARM.exidx.text.HAL_InitTick) refers to stm32f4xx_hal.o(.text.HAL_InitTick) for [Anonymous Symbol] + stm32f4xx_hal.o(.ARM.exidx.text.HAL_MspInit) refers to stm32f4xx_hal.o(.text.HAL_MspInit) for [Anonymous Symbol] + stm32f4xx_hal.o(.text.HAL_DeInit) refers to stm32f4xx_hal.o(.text.HAL_MspDeInit) for HAL_MspDeInit + stm32f4xx_hal.o(.ARM.exidx.text.HAL_DeInit) refers to stm32f4xx_hal.o(.text.HAL_DeInit) for [Anonymous Symbol] + stm32f4xx_hal.o(.ARM.exidx.text.HAL_MspDeInit) refers to stm32f4xx_hal.o(.text.HAL_MspDeInit) for [Anonymous Symbol] + stm32f4xx_hal.o(.text.HAL_IncTick) refers to stm32f4xx_hal.o(.data.uwTickFreq) for uwTickFreq + stm32f4xx_hal.o(.text.HAL_IncTick) refers to stm32f4xx_hal.o(.bss.uwTick) for uwTick + stm32f4xx_hal.o(.ARM.exidx.text.HAL_IncTick) refers to stm32f4xx_hal.o(.text.HAL_IncTick) for [Anonymous Symbol] + stm32f4xx_hal.o(.text.HAL_GetTick) refers to stm32f4xx_hal.o(.bss.uwTick) for uwTick + stm32f4xx_hal.o(.ARM.exidx.text.HAL_GetTick) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for [Anonymous Symbol] + stm32f4xx_hal.o(.text.HAL_GetTickPrio) refers to stm32f4xx_hal.o(.data.uwTickPrio) for uwTickPrio + stm32f4xx_hal.o(.ARM.exidx.text.HAL_GetTickPrio) refers to stm32f4xx_hal.o(.text.HAL_GetTickPrio) for [Anonymous Symbol] + stm32f4xx_hal.o(.text.HAL_SetTickFreq) refers to stm32f4xx_hal.o(.data.uwTickFreq) for uwTickFreq + stm32f4xx_hal.o(.text.HAL_SetTickFreq) refers to stm32f4xx_hal.o(.data.uwTickPrio) for uwTickPrio + stm32f4xx_hal.o(.text.HAL_SetTickFreq) refers to stm32f4xx_hal.o(.text.HAL_InitTick) for HAL_InitTick + stm32f4xx_hal.o(.ARM.exidx.text.HAL_SetTickFreq) refers to stm32f4xx_hal.o(.text.HAL_SetTickFreq) for [Anonymous Symbol] + stm32f4xx_hal.o(.text.HAL_GetTickFreq) refers to stm32f4xx_hal.o(.data.uwTickFreq) for uwTickFreq + stm32f4xx_hal.o(.ARM.exidx.text.HAL_GetTickFreq) refers to stm32f4xx_hal.o(.text.HAL_GetTickFreq) for [Anonymous Symbol] + stm32f4xx_hal.o(.text.HAL_Delay) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal.o(.text.HAL_Delay) refers to stm32f4xx_hal.o(.data.uwTickFreq) for uwTickFreq + stm32f4xx_hal.o(.ARM.exidx.text.HAL_Delay) refers to stm32f4xx_hal.o(.text.HAL_Delay) for [Anonymous Symbol] + stm32f4xx_hal.o(.ARM.exidx.text.HAL_SuspendTick) refers to stm32f4xx_hal.o(.text.HAL_SuspendTick) for [Anonymous Symbol] + stm32f4xx_hal.o(.ARM.exidx.text.HAL_ResumeTick) refers to stm32f4xx_hal.o(.text.HAL_ResumeTick) for [Anonymous Symbol] + stm32f4xx_hal.o(.ARM.exidx.text.HAL_GetHalVersion) refers to stm32f4xx_hal.o(.text.HAL_GetHalVersion) for [Anonymous Symbol] + stm32f4xx_hal.o(.ARM.exidx.text.HAL_GetREVID) refers to stm32f4xx_hal.o(.text.HAL_GetREVID) for [Anonymous Symbol] + stm32f4xx_hal.o(.ARM.exidx.text.HAL_GetDEVID) refers to stm32f4xx_hal.o(.text.HAL_GetDEVID) for [Anonymous Symbol] + stm32f4xx_hal.o(.ARM.exidx.text.HAL_DBGMCU_EnableDBGSleepMode) refers to stm32f4xx_hal.o(.text.HAL_DBGMCU_EnableDBGSleepMode) for [Anonymous Symbol] + stm32f4xx_hal.o(.ARM.exidx.text.HAL_DBGMCU_DisableDBGSleepMode) refers to stm32f4xx_hal.o(.text.HAL_DBGMCU_DisableDBGSleepMode) for [Anonymous Symbol] + stm32f4xx_hal.o(.ARM.exidx.text.HAL_DBGMCU_EnableDBGStopMode) refers to stm32f4xx_hal.o(.text.HAL_DBGMCU_EnableDBGStopMode) for [Anonymous Symbol] + stm32f4xx_hal.o(.ARM.exidx.text.HAL_DBGMCU_DisableDBGStopMode) refers to stm32f4xx_hal.o(.text.HAL_DBGMCU_DisableDBGStopMode) for [Anonymous Symbol] + stm32f4xx_hal.o(.ARM.exidx.text.HAL_DBGMCU_EnableDBGStandbyMode) refers to stm32f4xx_hal.o(.text.HAL_DBGMCU_EnableDBGStandbyMode) for [Anonymous Symbol] + stm32f4xx_hal.o(.ARM.exidx.text.HAL_DBGMCU_DisableDBGStandbyMode) refers to stm32f4xx_hal.o(.text.HAL_DBGMCU_DisableDBGStandbyMode) for [Anonymous Symbol] + stm32f4xx_hal.o(.ARM.exidx.text.HAL_EnableCompensationCell) refers to stm32f4xx_hal.o(.text.HAL_EnableCompensationCell) for [Anonymous Symbol] + stm32f4xx_hal.o(.ARM.exidx.text.HAL_DisableCompensationCell) refers to stm32f4xx_hal.o(.text.HAL_DisableCompensationCell) for [Anonymous Symbol] + stm32f4xx_hal.o(.ARM.exidx.text.HAL_GetUIDw0) refers to stm32f4xx_hal.o(.text.HAL_GetUIDw0) for [Anonymous Symbol] + stm32f4xx_hal.o(.ARM.exidx.text.HAL_GetUIDw1) refers to stm32f4xx_hal.o(.text.HAL_GetUIDw1) for [Anonymous Symbol] + stm32f4xx_hal.o(.ARM.exidx.text.HAL_GetUIDw2) refers to stm32f4xx_hal.o(.text.HAL_GetUIDw2) for [Anonymous Symbol] + stm32f4xx_hal_exti.o(.ARM.exidx.text.HAL_EXTI_SetConfigLine) refers to stm32f4xx_hal_exti.o(.text.HAL_EXTI_SetConfigLine) for [Anonymous Symbol] + stm32f4xx_hal_exti.o(.ARM.exidx.text.HAL_EXTI_GetConfigLine) refers to stm32f4xx_hal_exti.o(.text.HAL_EXTI_GetConfigLine) for [Anonymous Symbol] + stm32f4xx_hal_exti.o(.ARM.exidx.text.HAL_EXTI_ClearConfigLine) refers to stm32f4xx_hal_exti.o(.text.HAL_EXTI_ClearConfigLine) for [Anonymous Symbol] + stm32f4xx_hal_exti.o(.ARM.exidx.text.HAL_EXTI_RegisterCallback) refers to stm32f4xx_hal_exti.o(.text.HAL_EXTI_RegisterCallback) for [Anonymous Symbol] + stm32f4xx_hal_exti.o(.ARM.exidx.text.HAL_EXTI_GetHandle) refers to stm32f4xx_hal_exti.o(.text.HAL_EXTI_GetHandle) for [Anonymous Symbol] + stm32f4xx_hal_exti.o(.ARM.exidx.text.HAL_EXTI_IRQHandler) refers to stm32f4xx_hal_exti.o(.text.HAL_EXTI_IRQHandler) for [Anonymous Symbol] + stm32f4xx_hal_exti.o(.ARM.exidx.text.HAL_EXTI_GetPending) refers to stm32f4xx_hal_exti.o(.text.HAL_EXTI_GetPending) for [Anonymous Symbol] + stm32f4xx_hal_exti.o(.ARM.exidx.text.HAL_EXTI_ClearPending) refers to stm32f4xx_hal_exti.o(.text.HAL_EXTI_ClearPending) for [Anonymous Symbol] + stm32f4xx_hal_exti.o(.ARM.exidx.text.HAL_EXTI_GenerateSWI) refers to stm32f4xx_hal_exti.o(.text.HAL_EXTI_GenerateSWI) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Init) refers to i2c.o(.text.HAL_I2C_MspInit) for HAL_I2C_MspInit + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Init) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetPCLK1Freq) for HAL_RCC_GetPCLK1Freq + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Init) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Init) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_MspInit) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_MspInit) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_DeInit) refers to i2c.o(.text.HAL_I2C_MspDeInit) for HAL_I2C_MspDeInit + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_DeInit) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_DeInit) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_MspDeInit) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_MspDeInit) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Transmit) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Transmit) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnFlagUntilTimeout) for I2C_WaitOnFlagUntilTimeout + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Transmit) refers to stm32f4xx_hal_i2c.o(.text.I2C_MasterRequestWrite) for I2C_MasterRequestWrite + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Transmit) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnBTFFlagUntilTimeout) for I2C_WaitOnBTFFlagUntilTimeout + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Transmit) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnTXEFlagUntilTimeout) for I2C_WaitOnTXEFlagUntilTimeout + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Master_Transmit) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Transmit) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_WaitOnFlagUntilTimeout) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_WaitOnFlagUntilTimeout) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnFlagUntilTimeout) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_MasterRequestWrite) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnFlagUntilTimeout) for I2C_WaitOnFlagUntilTimeout + stm32f4xx_hal_i2c.o(.text.I2C_MasterRequestWrite) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnMasterAddressFlagUntilTimeout) for I2C_WaitOnMasterAddressFlagUntilTimeout + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_MasterRequestWrite) refers to stm32f4xx_hal_i2c.o(.text.I2C_MasterRequestWrite) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_WaitOnTXEFlagUntilTimeout) refers to stm32f4xx_hal_i2c.o(.text.I2C_IsAcknowledgeFailed) for I2C_IsAcknowledgeFailed + stm32f4xx_hal_i2c.o(.text.I2C_WaitOnTXEFlagUntilTimeout) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_WaitOnTXEFlagUntilTimeout) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnTXEFlagUntilTimeout) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_WaitOnBTFFlagUntilTimeout) refers to stm32f4xx_hal_i2c.o(.text.I2C_IsAcknowledgeFailed) for I2C_IsAcknowledgeFailed + stm32f4xx_hal_i2c.o(.text.I2C_WaitOnBTFFlagUntilTimeout) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_WaitOnBTFFlagUntilTimeout) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnBTFFlagUntilTimeout) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Receive) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Receive) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnFlagUntilTimeout) for I2C_WaitOnFlagUntilTimeout + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Receive) refers to stm32f4xx_hal_i2c.o(.text.I2C_MasterRequestRead) for I2C_MasterRequestRead + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Receive) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnRXNEFlagUntilTimeout) for I2C_WaitOnRXNEFlagUntilTimeout + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Master_Receive) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Receive) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_MasterRequestRead) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnFlagUntilTimeout) for I2C_WaitOnFlagUntilTimeout + stm32f4xx_hal_i2c.o(.text.I2C_MasterRequestRead) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnMasterAddressFlagUntilTimeout) for I2C_WaitOnMasterAddressFlagUntilTimeout + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_MasterRequestRead) refers to stm32f4xx_hal_i2c.o(.text.I2C_MasterRequestRead) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_WaitOnRXNEFlagUntilTimeout) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_WaitOnRXNEFlagUntilTimeout) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnRXNEFlagUntilTimeout) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Transmit) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Transmit) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnFlagUntilTimeout) for I2C_WaitOnFlagUntilTimeout + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Transmit) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnTXEFlagUntilTimeout) for I2C_WaitOnTXEFlagUntilTimeout + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Slave_Transmit) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Transmit) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Receive) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Receive) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnFlagUntilTimeout) for I2C_WaitOnFlagUntilTimeout + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Receive) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnRXNEFlagUntilTimeout) for I2C_WaitOnRXNEFlagUntilTimeout + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Receive) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnSTOPFlagUntilTimeout) for I2C_WaitOnSTOPFlagUntilTimeout + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Slave_Receive) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Receive) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_WaitOnSTOPFlagUntilTimeout) refers to stm32f4xx_hal_i2c.o(.text.I2C_IsAcknowledgeFailed) for I2C_IsAcknowledgeFailed + stm32f4xx_hal_i2c.o(.text.I2C_WaitOnSTOPFlagUntilTimeout) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_WaitOnSTOPFlagUntilTimeout) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnSTOPFlagUntilTimeout) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Transmit_IT) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Master_Transmit_IT) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Transmit_IT) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Receive_IT) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Master_Receive_IT) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Receive_IT) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Slave_Transmit_IT) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Transmit_IT) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Slave_Receive_IT) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Receive_IT) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Transmit_DMA) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Transmit_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAError) for I2C_DMAError + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Transmit_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAXferCplt) for I2C_DMAXferCplt + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Transmit_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Master_Transmit_DMA) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Transmit_DMA) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_DMAXferCplt) refers to i2c_1.o(.text.HAL_I2C_SlaveTxCpltCallback) for HAL_I2C_SlaveTxCpltCallback + stm32f4xx_hal_i2c.o(.text.I2C_DMAXferCplt) refers to i2c_1.o(.text.HAL_I2C_SlaveRxCpltCallback) for HAL_I2C_SlaveRxCpltCallback + stm32f4xx_hal_i2c.o(.text.I2C_DMAXferCplt) refers to i2c_1.o(.text.HAL_I2C_ErrorCallback) for HAL_I2C_ErrorCallback + stm32f4xx_hal_i2c.o(.text.I2C_DMAXferCplt) refers to i2c_1.o(.text.HAL_I2C_MemRxCpltCallback) for HAL_I2C_MemRxCpltCallback + stm32f4xx_hal_i2c.o(.text.I2C_DMAXferCplt) refers to i2c_1.o(.text.HAL_I2C_MasterRxCpltCallback) for HAL_I2C_MasterRxCpltCallback + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_DMAXferCplt) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAXferCplt) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_DMAError) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_GetError) for HAL_DMA_GetError + stm32f4xx_hal_i2c.o(.text.I2C_DMAError) refers to i2c_1.o(.text.HAL_I2C_ErrorCallback) for HAL_I2C_ErrorCallback + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_DMAError) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAError) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Receive_DMA) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Receive_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAXferCplt) for I2C_DMAXferCplt + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Receive_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAError) for I2C_DMAError + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Receive_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Master_Receive_DMA) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Receive_DMA) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Transmit_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAXferCplt) for I2C_DMAXferCplt + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Transmit_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAError) for I2C_DMAError + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Transmit_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Slave_Transmit_DMA) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Transmit_DMA) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Receive_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAXferCplt) for I2C_DMAXferCplt + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Receive_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAError) for I2C_DMAError + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Receive_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Slave_Receive_DMA) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Receive_DMA) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Write) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Write) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnFlagUntilTimeout) for I2C_WaitOnFlagUntilTimeout + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Write) refers to stm32f4xx_hal_i2c.o(.text.I2C_RequestMemoryWrite) for I2C_RequestMemoryWrite + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Write) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnTXEFlagUntilTimeout) for I2C_WaitOnTXEFlagUntilTimeout + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Write) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnBTFFlagUntilTimeout) for I2C_WaitOnBTFFlagUntilTimeout + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Mem_Write) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Write) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_RequestMemoryWrite) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnFlagUntilTimeout) for I2C_WaitOnFlagUntilTimeout + stm32f4xx_hal_i2c.o(.text.I2C_RequestMemoryWrite) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnMasterAddressFlagUntilTimeout) for I2C_WaitOnMasterAddressFlagUntilTimeout + stm32f4xx_hal_i2c.o(.text.I2C_RequestMemoryWrite) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnTXEFlagUntilTimeout) for I2C_WaitOnTXEFlagUntilTimeout + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_RequestMemoryWrite) refers to stm32f4xx_hal_i2c.o(.text.I2C_RequestMemoryWrite) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Read) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Read) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnFlagUntilTimeout) for I2C_WaitOnFlagUntilTimeout + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Read) refers to stm32f4xx_hal_i2c.o(.text.I2C_RequestMemoryRead) for I2C_RequestMemoryRead + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Read) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnRXNEFlagUntilTimeout) for I2C_WaitOnRXNEFlagUntilTimeout + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Mem_Read) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Read) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_RequestMemoryRead) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnFlagUntilTimeout) for I2C_WaitOnFlagUntilTimeout + stm32f4xx_hal_i2c.o(.text.I2C_RequestMemoryRead) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnMasterAddressFlagUntilTimeout) for I2C_WaitOnMasterAddressFlagUntilTimeout + stm32f4xx_hal_i2c.o(.text.I2C_RequestMemoryRead) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnTXEFlagUntilTimeout) for I2C_WaitOnTXEFlagUntilTimeout + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_RequestMemoryRead) refers to stm32f4xx_hal_i2c.o(.text.I2C_RequestMemoryRead) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Write_IT) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Mem_Write_IT) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Write_IT) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Read_IT) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Mem_Read_IT) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Read_IT) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Write_DMA) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Write_DMA) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Write_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAXferCplt) for I2C_DMAXferCplt + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Write_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAError) for I2C_DMAError + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Write_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Write_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_RequestMemoryWrite) for I2C_RequestMemoryWrite + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Write_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for HAL_DMA_Abort_IT + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Mem_Write_DMA) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Write_DMA) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Read_DMA) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Read_DMA) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Read_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAXferCplt) for I2C_DMAXferCplt + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Read_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAError) for I2C_DMAError + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Read_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Read_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_RequestMemoryRead) for I2C_RequestMemoryRead + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Read_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for HAL_DMA_Abort_IT + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Mem_Read_DMA) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Read_DMA) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_IsDeviceReady) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_i2c.o(.text.HAL_I2C_IsDeviceReady) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnFlagUntilTimeout) for I2C_WaitOnFlagUntilTimeout + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_IsDeviceReady) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_IsDeviceReady) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Seq_Transmit_IT) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Master_Seq_Transmit_IT) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Seq_Transmit_IT) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Seq_Transmit_DMA) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Seq_Transmit_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAError) for I2C_DMAError + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Seq_Transmit_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAXferCplt) for I2C_DMAXferCplt + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Seq_Transmit_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Master_Seq_Transmit_DMA) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Seq_Transmit_DMA) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Seq_Receive_IT) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Master_Seq_Receive_IT) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Seq_Receive_IT) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Seq_Receive_DMA) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Seq_Receive_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAXferCplt) for I2C_DMAXferCplt + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Seq_Receive_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAError) for I2C_DMAError + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Seq_Receive_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Master_Seq_Receive_DMA) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Seq_Receive_DMA) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Slave_Seq_Transmit_IT) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Seq_Transmit_IT) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Seq_Transmit_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAAbort) for I2C_DMAAbort + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Seq_Transmit_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for HAL_DMA_Abort_IT + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Seq_Transmit_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAXferCplt) for I2C_DMAXferCplt + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Seq_Transmit_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAError) for I2C_DMAError + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Seq_Transmit_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Slave_Seq_Transmit_DMA) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Seq_Transmit_DMA) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_DMAAbort) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_i2c.o(.text.I2C_DMAAbort) refers to i2c_1.o(.text.HAL_I2C_AbortCpltCallback) for HAL_I2C_AbortCpltCallback + stm32f4xx_hal_i2c.o(.text.I2C_DMAAbort) refers to i2c_1.o(.text.HAL_I2C_ErrorCallback) for HAL_I2C_ErrorCallback + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_DMAAbort) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAAbort) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Slave_Seq_Receive_IT) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Seq_Receive_IT) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Seq_Receive_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAAbort) for I2C_DMAAbort + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Seq_Receive_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for HAL_DMA_Abort_IT + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Seq_Receive_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAXferCplt) for I2C_DMAXferCplt + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Seq_Receive_DMA) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAError) for I2C_DMAError + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Seq_Receive_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Slave_Seq_Receive_DMA) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Seq_Receive_DMA) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_EnableListen_IT) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_EnableListen_IT) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_DisableListen_IT) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_DisableListen_IT) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Abort_IT) refers to stm32f4xx_hal_i2c.o(.text.I2C_ITError) for I2C_ITError + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Master_Abort_IT) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Abort_IT) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_ITError) refers to i2c_1.o(.text.HAL_I2C_AbortCpltCallback) for HAL_I2C_AbortCpltCallback + stm32f4xx_hal_i2c.o(.text.I2C_ITError) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAAbort) for I2C_DMAAbort + stm32f4xx_hal_i2c.o(.text.I2C_ITError) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for HAL_DMA_Abort_IT + stm32f4xx_hal_i2c.o(.text.I2C_ITError) refers to i2c_1.o(.text.HAL_I2C_ErrorCallback) for HAL_I2C_ErrorCallback + stm32f4xx_hal_i2c.o(.text.I2C_ITError) refers to i2c_1.o(.text.HAL_I2C_ListenCpltCallback) for HAL_I2C_ListenCpltCallback + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_ITError) refers to stm32f4xx_hal_i2c.o(.text.I2C_ITError) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_EV_IRQHandler) refers to stm32f4xx_hal_i2c.o(.text.I2C_SlaveTransmit_TXE) for I2C_SlaveTransmit_TXE + stm32f4xx_hal_i2c.o(.text.HAL_I2C_EV_IRQHandler) refers to stm32f4xx_hal_i2c.o(.text.I2C_MasterReceive_RXNE) for I2C_MasterReceive_RXNE + stm32f4xx_hal_i2c.o(.text.HAL_I2C_EV_IRQHandler) refers to stm32f4xx_hal_i2c.o(.text.I2C_ConvertOtherXferOptions) for I2C_ConvertOtherXferOptions + stm32f4xx_hal_i2c.o(.text.HAL_I2C_EV_IRQHandler) refers to stm32f4xx_hal_i2c.o(.text.I2C_Master_SB) for I2C_Master_SB + stm32f4xx_hal_i2c.o(.text.HAL_I2C_EV_IRQHandler) refers to stm32f4xx_hal_i2c.o(.text.I2C_Slave_ADDR) for I2C_Slave_ADDR + stm32f4xx_hal_i2c.o(.text.HAL_I2C_EV_IRQHandler) refers to stm32f4xx_hal_i2c.o(.text.I2C_Slave_STOPF) for I2C_Slave_STOPF + stm32f4xx_hal_i2c.o(.text.HAL_I2C_EV_IRQHandler) refers to stm32f4xx_hal_i2c.o(.text.I2C_Master_ADD10) for I2C_Master_ADD10 + stm32f4xx_hal_i2c.o(.text.HAL_I2C_EV_IRQHandler) refers to stm32f4xx_hal_i2c.o(.text.I2C_Master_ADDR) for I2C_Master_ADDR + stm32f4xx_hal_i2c.o(.text.HAL_I2C_EV_IRQHandler) refers to stm32f4xx_hal_i2c.o(.text.I2C_MasterTransmit_TXE) for I2C_MasterTransmit_TXE + stm32f4xx_hal_i2c.o(.text.HAL_I2C_EV_IRQHandler) refers to stm32f4xx_hal_i2c.o(.text.I2C_SlaveReceive_RXNE) for I2C_SlaveReceive_RXNE + stm32f4xx_hal_i2c.o(.text.HAL_I2C_EV_IRQHandler) refers to stm32f4xx_hal_i2c.o(.text.I2C_SlaveTransmit_BTF) for I2C_SlaveTransmit_BTF + stm32f4xx_hal_i2c.o(.text.HAL_I2C_EV_IRQHandler) refers to stm32f4xx_hal_i2c.o(.text.I2C_SlaveReceive_BTF) for I2C_SlaveReceive_BTF + stm32f4xx_hal_i2c.o(.text.HAL_I2C_EV_IRQHandler) refers to stm32f4xx_hal_i2c.o(.text.I2C_MasterReceive_BTF) for I2C_MasterReceive_BTF + stm32f4xx_hal_i2c.o(.text.HAL_I2C_EV_IRQHandler) refers to stm32f4xx_hal_i2c.o(.text.I2C_MasterTransmit_BTF) for I2C_MasterTransmit_BTF + stm32f4xx_hal_i2c.o(.text.HAL_I2C_EV_IRQHandler) refers to stm32f4xx_hal_i2c.o(.text.I2C_MemoryTransmit_TXE_BTF) for I2C_MemoryTransmit_TXE_BTF + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_EV_IRQHandler) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_EV_IRQHandler) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_ConvertOtherXferOptions) refers to stm32f4xx_hal_i2c.o(.text.I2C_ConvertOtherXferOptions) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_Master_SB) refers to stm32f4xx_hal_i2c.o(.text.I2C_Master_SB) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_Master_ADD10) refers to stm32f4xx_hal_i2c.o(.text.I2C_Master_ADD10) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_Master_ADDR) refers to stm32f4xx_hal_i2c.o(.text.I2C_Master_ADDR) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_MasterTransmit_TXE) refers to i2c_1.o(.text.HAL_I2C_MemTxCpltCallback) for HAL_I2C_MemTxCpltCallback + stm32f4xx_hal_i2c.o(.text.I2C_MasterTransmit_TXE) refers to stm32f4xx_hal_i2c.o(.text.I2C_MemoryTransmit_TXE_BTF) for I2C_MemoryTransmit_TXE_BTF + stm32f4xx_hal_i2c.o(.text.I2C_MasterTransmit_TXE) refers to i2c_1.o(.text.HAL_I2C_MasterTxCpltCallback) for HAL_I2C_MasterTxCpltCallback + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_MasterTransmit_TXE) refers to stm32f4xx_hal_i2c.o(.text.I2C_MasterTransmit_TXE) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_MasterTransmit_BTF) refers to i2c_1.o(.text.HAL_I2C_MemTxCpltCallback) for HAL_I2C_MemTxCpltCallback + stm32f4xx_hal_i2c.o(.text.I2C_MasterTransmit_BTF) refers to i2c_1.o(.text.HAL_I2C_MasterTxCpltCallback) for HAL_I2C_MasterTxCpltCallback + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_MasterTransmit_BTF) refers to stm32f4xx_hal_i2c.o(.text.I2C_MasterTransmit_BTF) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_MemoryTransmit_TXE_BTF) refers to stm32f4xx_hal_i2c.o(.text.I2C_Flush_DR) for I2C_Flush_DR + stm32f4xx_hal_i2c.o(.text.I2C_MemoryTransmit_TXE_BTF) refers to i2c_1.o(.text.HAL_I2C_MemTxCpltCallback) for HAL_I2C_MemTxCpltCallback + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_MemoryTransmit_TXE_BTF) refers to stm32f4xx_hal_i2c.o(.text.I2C_MemoryTransmit_TXE_BTF) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_MasterReceive_RXNE) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnSTOPRequestThroughIT) for I2C_WaitOnSTOPRequestThroughIT + stm32f4xx_hal_i2c.o(.text.I2C_MasterReceive_RXNE) refers to i2c_1.o(.text.HAL_I2C_ErrorCallback) for HAL_I2C_ErrorCallback + stm32f4xx_hal_i2c.o(.text.I2C_MasterReceive_RXNE) refers to i2c_1.o(.text.HAL_I2C_MemRxCpltCallback) for HAL_I2C_MemRxCpltCallback + stm32f4xx_hal_i2c.o(.text.I2C_MasterReceive_RXNE) refers to i2c_1.o(.text.HAL_I2C_MasterRxCpltCallback) for HAL_I2C_MasterRxCpltCallback + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_MasterReceive_RXNE) refers to stm32f4xx_hal_i2c.o(.text.I2C_MasterReceive_RXNE) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_MasterReceive_BTF) refers to i2c_1.o(.text.HAL_I2C_MemRxCpltCallback) for HAL_I2C_MemRxCpltCallback + stm32f4xx_hal_i2c.o(.text.I2C_MasterReceive_BTF) refers to i2c_1.o(.text.HAL_I2C_MasterRxCpltCallback) for HAL_I2C_MasterRxCpltCallback + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_MasterReceive_BTF) refers to stm32f4xx_hal_i2c.o(.text.I2C_MasterReceive_BTF) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_Slave_ADDR) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_AddrCallback) for HAL_I2C_AddrCallback + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_Slave_ADDR) refers to stm32f4xx_hal_i2c.o(.text.I2C_Slave_ADDR) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_Slave_STOPF) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_GetState) for HAL_DMA_GetState + stm32f4xx_hal_i2c.o(.text.I2C_Slave_STOPF) refers to stm32f4xx_hal_i2c.o(.text.I2C_DMAAbort) for I2C_DMAAbort + stm32f4xx_hal_i2c.o(.text.I2C_Slave_STOPF) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for HAL_DMA_Abort_IT + stm32f4xx_hal_i2c.o(.text.I2C_Slave_STOPF) refers to stm32f4xx_hal_i2c.o(.text.I2C_ITError) for I2C_ITError + stm32f4xx_hal_i2c.o(.text.I2C_Slave_STOPF) refers to i2c_1.o(.text.HAL_I2C_SlaveRxCpltCallback) for HAL_I2C_SlaveRxCpltCallback + stm32f4xx_hal_i2c.o(.text.I2C_Slave_STOPF) refers to i2c_1.o(.text.HAL_I2C_ListenCpltCallback) for HAL_I2C_ListenCpltCallback + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_Slave_STOPF) refers to stm32f4xx_hal_i2c.o(.text.I2C_Slave_STOPF) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_SlaveTransmit_TXE) refers to i2c_1.o(.text.HAL_I2C_SlaveTxCpltCallback) for HAL_I2C_SlaveTxCpltCallback + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_SlaveTransmit_TXE) refers to stm32f4xx_hal_i2c.o(.text.I2C_SlaveTransmit_TXE) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_SlaveTransmit_BTF) refers to stm32f4xx_hal_i2c.o(.text.I2C_SlaveTransmit_BTF) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_SlaveReceive_RXNE) refers to i2c_1.o(.text.HAL_I2C_SlaveRxCpltCallback) for HAL_I2C_SlaveRxCpltCallback + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_SlaveReceive_RXNE) refers to stm32f4xx_hal_i2c.o(.text.I2C_SlaveReceive_RXNE) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_SlaveReceive_BTF) refers to stm32f4xx_hal_i2c.o(.text.I2C_SlaveReceive_BTF) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.HAL_I2C_ER_IRQHandler) refers to stm32f4xx_hal_i2c.o(.text.I2C_ITError) for I2C_ITError + stm32f4xx_hal_i2c.o(.text.HAL_I2C_ER_IRQHandler) refers to stm32f4xx_hal_i2c.o(.text.I2C_Slave_AF) for I2C_Slave_AF + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_ER_IRQHandler) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_ER_IRQHandler) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_Slave_AF) refers to i2c_1.o(.text.HAL_I2C_ListenCpltCallback) for HAL_I2C_ListenCpltCallback + stm32f4xx_hal_i2c.o(.text.I2C_Slave_AF) refers to stm32f4xx_hal_i2c.o(.text.I2C_Flush_DR) for I2C_Flush_DR + stm32f4xx_hal_i2c.o(.text.I2C_Slave_AF) refers to i2c_1.o(.text.HAL_I2C_SlaveTxCpltCallback) for HAL_I2C_SlaveTxCpltCallback + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_Slave_AF) refers to stm32f4xx_hal_i2c.o(.text.I2C_Slave_AF) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_MasterTxCpltCallback) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_MasterTxCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_MasterRxCpltCallback) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_MasterRxCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_SlaveTxCpltCallback) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_SlaveTxCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_SlaveRxCpltCallback) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_SlaveRxCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_AddrCallback) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_AddrCallback) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_ListenCpltCallback) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_ListenCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_MemTxCpltCallback) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_MemTxCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_MemRxCpltCallback) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_MemRxCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_ErrorCallback) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_ErrorCallback) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_AbortCpltCallback) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_AbortCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_GetState) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_GetState) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_GetMode) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_GetMode) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_GetError) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_GetError) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_Flush_DR) refers to stm32f4xx_hal_i2c.o(.text.I2C_Flush_DR) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_WaitOnSTOPRequestThroughIT) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_WaitOnSTOPRequestThroughIT) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnSTOPRequestThroughIT) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.text.I2C_WaitOnMasterAddressFlagUntilTimeout) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_WaitOnMasterAddressFlagUntilTimeout) refers to stm32f4xx_hal_i2c.o(.text.I2C_WaitOnMasterAddressFlagUntilTimeout) for [Anonymous Symbol] + stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_IsAcknowledgeFailed) refers to stm32f4xx_hal_i2c.o(.text.I2C_IsAcknowledgeFailed) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.HAL_SPI_Init) refers to spi.o(.text.HAL_SPI_MspInit) for HAL_SPI_MspInit + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_Init) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_Init) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_MspInit) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_MspInit) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.HAL_SPI_DeInit) refers to spi.o(.text.HAL_SPI_MspDeInit) for HAL_SPI_MspDeInit + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_DeInit) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_DeInit) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_MspDeInit) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_MspDeInit) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.HAL_SPI_Transmit) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_spi.o(.text.HAL_SPI_Transmit) refers to stm32f4xx_hal_spi.o(.text.SPI_EndRxTxTransaction) for SPI_EndRxTxTransaction + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_Transmit) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_Transmit) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_EndRxTxTransaction) refers to stm32f4xx_hal_spi.o(.text.SPI_WaitFlagStateUntilTimeout) for SPI_WaitFlagStateUntilTimeout + stm32f4xx_hal_spi.o(.text.SPI_EndRxTxTransaction) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_EndRxTxTransaction) refers to stm32f4xx_hal_spi.o(.text.SPI_EndRxTxTransaction) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.HAL_SPI_Receive) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_spi.o(.text.HAL_SPI_Receive) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_TransmitReceive) for HAL_SPI_TransmitReceive + stm32f4xx_hal_spi.o(.text.HAL_SPI_Receive) refers to stm32f4xx_hal_spi.o(.text.SPI_EndRxTransaction) for SPI_EndRxTransaction + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_Receive) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_Receive) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.HAL_SPI_TransmitReceive) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_spi.o(.text.HAL_SPI_TransmitReceive) refers to stm32f4xx_hal_spi.o(.text.SPI_EndRxTxTransaction) for SPI_EndRxTxTransaction + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_TransmitReceive) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_TransmitReceive) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_EndRxTransaction) refers to stm32f4xx_hal_spi.o(.text.SPI_WaitFlagStateUntilTimeout) for SPI_WaitFlagStateUntilTimeout + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_EndRxTransaction) refers to stm32f4xx_hal_spi.o(.text.SPI_EndRxTransaction) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.HAL_SPI_Transmit_IT) refers to stm32f4xx_hal_spi.o(.text.SPI_TxISR_16BIT) for SPI_TxISR_16BIT + stm32f4xx_hal_spi.o(.text.HAL_SPI_Transmit_IT) refers to stm32f4xx_hal_spi.o(.text.SPI_TxISR_8BIT) for SPI_TxISR_8BIT + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_Transmit_IT) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_Transmit_IT) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_TxISR_16BIT) refers to stm32f4xx_hal_spi.o(.text.SPI_CloseTx_ISR) for SPI_CloseTx_ISR + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_TxISR_16BIT) refers to stm32f4xx_hal_spi.o(.text.SPI_TxISR_16BIT) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_TxISR_8BIT) refers to stm32f4xx_hal_spi.o(.text.SPI_CloseTx_ISR) for SPI_CloseTx_ISR + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_TxISR_8BIT) refers to stm32f4xx_hal_spi.o(.text.SPI_TxISR_8BIT) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.HAL_SPI_Receive_IT) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_TransmitReceive_IT) for HAL_SPI_TransmitReceive_IT + stm32f4xx_hal_spi.o(.text.HAL_SPI_Receive_IT) refers to stm32f4xx_hal_spi.o(.text.SPI_RxISR_16BIT) for SPI_RxISR_16BIT + stm32f4xx_hal_spi.o(.text.HAL_SPI_Receive_IT) refers to stm32f4xx_hal_spi.o(.text.SPI_RxISR_8BIT) for SPI_RxISR_8BIT + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_Receive_IT) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_Receive_IT) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.HAL_SPI_TransmitReceive_IT) refers to stm32f4xx_hal_spi.o(.text.SPI_2linesRxISR_8BIT) for SPI_2linesRxISR_8BIT + stm32f4xx_hal_spi.o(.text.HAL_SPI_TransmitReceive_IT) refers to stm32f4xx_hal_spi.o(.text.SPI_2linesRxISR_16BIT) for SPI_2linesRxISR_16BIT + stm32f4xx_hal_spi.o(.text.HAL_SPI_TransmitReceive_IT) refers to stm32f4xx_hal_spi.o(.text.SPI_2linesTxISR_16BIT) for SPI_2linesTxISR_16BIT + stm32f4xx_hal_spi.o(.text.HAL_SPI_TransmitReceive_IT) refers to stm32f4xx_hal_spi.o(.text.SPI_2linesTxISR_8BIT) for SPI_2linesTxISR_8BIT + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_TransmitReceive_IT) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_TransmitReceive_IT) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_RxISR_16BIT) refers to stm32f4xx_hal_spi.o(.text.SPI_CloseRx_ISR) for SPI_CloseRx_ISR + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_RxISR_16BIT) refers to stm32f4xx_hal_spi.o(.text.SPI_RxISR_16BIT) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_RxISR_8BIT) refers to stm32f4xx_hal_spi.o(.text.SPI_CloseRx_ISR) for SPI_CloseRx_ISR + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_RxISR_8BIT) refers to stm32f4xx_hal_spi.o(.text.SPI_RxISR_8BIT) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_2linesRxISR_16BIT) refers to stm32f4xx_hal_spi.o(.text.SPI_CloseRxTx_ISR) for SPI_CloseRxTx_ISR + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_2linesRxISR_16BIT) refers to stm32f4xx_hal_spi.o(.text.SPI_2linesRxISR_16BIT) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_2linesTxISR_16BIT) refers to stm32f4xx_hal_spi.o(.text.SPI_CloseRxTx_ISR) for SPI_CloseRxTx_ISR + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_2linesTxISR_16BIT) refers to stm32f4xx_hal_spi.o(.text.SPI_2linesTxISR_16BIT) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_2linesRxISR_8BIT) refers to stm32f4xx_hal_spi.o(.text.SPI_CloseRxTx_ISR) for SPI_CloseRxTx_ISR + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_2linesRxISR_8BIT) refers to stm32f4xx_hal_spi.o(.text.SPI_2linesRxISR_8BIT) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_2linesTxISR_8BIT) refers to stm32f4xx_hal_spi.o(.text.SPI_CloseRxTx_ISR) for SPI_CloseRxTx_ISR + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_2linesTxISR_8BIT) refers to stm32f4xx_hal_spi.o(.text.SPI_2linesTxISR_8BIT) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.HAL_SPI_Transmit_DMA) refers to stm32f4xx_hal_spi.o(.text.SPI_DMAHalfTransmitCplt) for SPI_DMAHalfTransmitCplt + stm32f4xx_hal_spi.o(.text.HAL_SPI_Transmit_DMA) refers to stm32f4xx_hal_spi.o(.text.SPI_DMATransmitCplt) for SPI_DMATransmitCplt + stm32f4xx_hal_spi.o(.text.HAL_SPI_Transmit_DMA) refers to stm32f4xx_hal_spi.o(.text.SPI_DMAError) for SPI_DMAError + stm32f4xx_hal_spi.o(.text.HAL_SPI_Transmit_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_Transmit_DMA) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_Transmit_DMA) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_DMAHalfTransmitCplt) refers to spi_1.o(.text.HAL_SPI_TxHalfCpltCallback) for HAL_SPI_TxHalfCpltCallback + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_DMAHalfTransmitCplt) refers to stm32f4xx_hal_spi.o(.text.SPI_DMAHalfTransmitCplt) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_DMATransmitCplt) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_spi.o(.text.SPI_DMATransmitCplt) refers to stm32f4xx_hal_spi.o(.text.SPI_EndRxTxTransaction) for SPI_EndRxTxTransaction + stm32f4xx_hal_spi.o(.text.SPI_DMATransmitCplt) refers to spi_1.o(.text.HAL_SPI_ErrorCallback) for HAL_SPI_ErrorCallback + stm32f4xx_hal_spi.o(.text.SPI_DMATransmitCplt) refers to spi_1.o(.text.HAL_SPI_TxCpltCallback) for HAL_SPI_TxCpltCallback + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_DMATransmitCplt) refers to stm32f4xx_hal_spi.o(.text.SPI_DMATransmitCplt) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_DMAError) refers to spi_1.o(.text.HAL_SPI_ErrorCallback) for HAL_SPI_ErrorCallback + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_DMAError) refers to stm32f4xx_hal_spi.o(.text.SPI_DMAError) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.HAL_SPI_Receive_DMA) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_TransmitReceive_DMA) for HAL_SPI_TransmitReceive_DMA + stm32f4xx_hal_spi.o(.text.HAL_SPI_Receive_DMA) refers to stm32f4xx_hal_spi.o(.text.SPI_DMAHalfReceiveCplt) for SPI_DMAHalfReceiveCplt + stm32f4xx_hal_spi.o(.text.HAL_SPI_Receive_DMA) refers to stm32f4xx_hal_spi.o(.text.SPI_DMAReceiveCplt) for SPI_DMAReceiveCplt + stm32f4xx_hal_spi.o(.text.HAL_SPI_Receive_DMA) refers to stm32f4xx_hal_spi.o(.text.SPI_DMAError) for SPI_DMAError + stm32f4xx_hal_spi.o(.text.HAL_SPI_Receive_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_Receive_DMA) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_Receive_DMA) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.HAL_SPI_TransmitReceive_DMA) refers to stm32f4xx_hal_spi.o(.text.SPI_DMAHalfReceiveCplt) for SPI_DMAHalfReceiveCplt + stm32f4xx_hal_spi.o(.text.HAL_SPI_TransmitReceive_DMA) refers to stm32f4xx_hal_spi.o(.text.SPI_DMAHalfTransmitReceiveCplt) for SPI_DMAHalfTransmitReceiveCplt + stm32f4xx_hal_spi.o(.text.HAL_SPI_TransmitReceive_DMA) refers to stm32f4xx_hal_spi.o(.text.SPI_DMAReceiveCplt) for SPI_DMAReceiveCplt + stm32f4xx_hal_spi.o(.text.HAL_SPI_TransmitReceive_DMA) refers to stm32f4xx_hal_spi.o(.text.SPI_DMATransmitReceiveCplt) for SPI_DMATransmitReceiveCplt + stm32f4xx_hal_spi.o(.text.HAL_SPI_TransmitReceive_DMA) refers to stm32f4xx_hal_spi.o(.text.SPI_DMAError) for SPI_DMAError + stm32f4xx_hal_spi.o(.text.HAL_SPI_TransmitReceive_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_TransmitReceive_DMA) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_TransmitReceive_DMA) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_DMAHalfReceiveCplt) refers to spi_1.o(.text.HAL_SPI_RxHalfCpltCallback) for HAL_SPI_RxHalfCpltCallback + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_DMAHalfReceiveCplt) refers to stm32f4xx_hal_spi.o(.text.SPI_DMAHalfReceiveCplt) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_DMAReceiveCplt) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_spi.o(.text.SPI_DMAReceiveCplt) refers to stm32f4xx_hal_spi.o(.text.SPI_EndRxTransaction) for SPI_EndRxTransaction + stm32f4xx_hal_spi.o(.text.SPI_DMAReceiveCplt) refers to spi_1.o(.text.HAL_SPI_ErrorCallback) for HAL_SPI_ErrorCallback + stm32f4xx_hal_spi.o(.text.SPI_DMAReceiveCplt) refers to spi_1.o(.text.HAL_SPI_RxCpltCallback) for HAL_SPI_RxCpltCallback + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_DMAReceiveCplt) refers to stm32f4xx_hal_spi.o(.text.SPI_DMAReceiveCplt) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_DMAHalfTransmitReceiveCplt) refers to spi_1.o(.text.HAL_SPI_TxRxHalfCpltCallback) for HAL_SPI_TxRxHalfCpltCallback + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_DMAHalfTransmitReceiveCplt) refers to stm32f4xx_hal_spi.o(.text.SPI_DMAHalfTransmitReceiveCplt) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_DMATransmitReceiveCplt) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_spi.o(.text.SPI_DMATransmitReceiveCplt) refers to stm32f4xx_hal_spi.o(.text.SPI_EndRxTxTransaction) for SPI_EndRxTxTransaction + stm32f4xx_hal_spi.o(.text.SPI_DMATransmitReceiveCplt) refers to spi_1.o(.text.HAL_SPI_ErrorCallback) for HAL_SPI_ErrorCallback + stm32f4xx_hal_spi.o(.text.SPI_DMATransmitReceiveCplt) refers to spi_1.o(.text.HAL_SPI_TxRxCpltCallback) for HAL_SPI_TxRxCpltCallback + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_DMATransmitReceiveCplt) refers to stm32f4xx_hal_spi.o(.text.SPI_DMATransmitReceiveCplt) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.HAL_SPI_Abort) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_spi.o(.text.HAL_SPI_Abort) refers to stm32f4xx_hal_spi.o(.text.SPI_AbortTx_ISR) for SPI_AbortTx_ISR + stm32f4xx_hal_spi.o(.text.HAL_SPI_Abort) refers to stm32f4xx_hal_spi.o(.text.SPI_AbortRx_ISR) for SPI_AbortRx_ISR + stm32f4xx_hal_spi.o(.text.HAL_SPI_Abort) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort) for HAL_DMA_Abort + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_Abort) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_Abort) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_AbortTx_ISR) refers to stm32f4xx_hal_spi.o(.text.SPI_AbortTx_ISR) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_AbortRx_ISR) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_AbortRx_ISR) refers to stm32f4xx_hal_spi.o(.text.SPI_AbortRx_ISR) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.HAL_SPI_Abort_IT) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_spi.o(.text.HAL_SPI_Abort_IT) refers to stm32f4xx_hal_spi.o(.text.SPI_AbortTx_ISR) for SPI_AbortTx_ISR + stm32f4xx_hal_spi.o(.text.HAL_SPI_Abort_IT) refers to stm32f4xx_hal_spi.o(.text.SPI_AbortRx_ISR) for SPI_AbortRx_ISR + stm32f4xx_hal_spi.o(.text.HAL_SPI_Abort_IT) refers to stm32f4xx_hal_spi.o(.text.SPI_DMATxAbortCallback) for SPI_DMATxAbortCallback + stm32f4xx_hal_spi.o(.text.HAL_SPI_Abort_IT) refers to stm32f4xx_hal_spi.o(.text.SPI_DMARxAbortCallback) for SPI_DMARxAbortCallback + stm32f4xx_hal_spi.o(.text.HAL_SPI_Abort_IT) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for HAL_DMA_Abort_IT + stm32f4xx_hal_spi.o(.text.HAL_SPI_Abort_IT) refers to spi_1.o(.text.HAL_SPI_AbortCpltCallback) for HAL_SPI_AbortCpltCallback + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_Abort_IT) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_Abort_IT) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_DMATxAbortCallback) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_spi.o(.text.SPI_DMATxAbortCallback) refers to spi_1.o(.text.HAL_SPI_AbortCpltCallback) for HAL_SPI_AbortCpltCallback + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_DMATxAbortCallback) refers to stm32f4xx_hal_spi.o(.text.SPI_DMATxAbortCallback) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_DMARxAbortCallback) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_spi.o(.text.SPI_DMARxAbortCallback) refers to stm32f4xx_hal_spi.o(.text.SPI_EndRxTxTransaction) for SPI_EndRxTxTransaction + stm32f4xx_hal_spi.o(.text.SPI_DMARxAbortCallback) refers to spi_1.o(.text.HAL_SPI_AbortCpltCallback) for HAL_SPI_AbortCpltCallback + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_DMARxAbortCallback) refers to stm32f4xx_hal_spi.o(.text.SPI_DMARxAbortCallback) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_AbortCpltCallback) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_AbortCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_DMAPause) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_DMAPause) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_DMAResume) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_DMAResume) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.HAL_SPI_DMAStop) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort) for HAL_DMA_Abort + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_DMAStop) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_DMAStop) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.HAL_SPI_IRQHandler) refers to stm32f4xx_hal_spi.o(.text.SPI_DMAAbortOnError) for SPI_DMAAbortOnError + stm32f4xx_hal_spi.o(.text.HAL_SPI_IRQHandler) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for HAL_DMA_Abort_IT + stm32f4xx_hal_spi.o(.text.HAL_SPI_IRQHandler) refers to spi_1.o(.text.HAL_SPI_ErrorCallback) for HAL_SPI_ErrorCallback + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_IRQHandler) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_IRQHandler) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_DMAAbortOnError) refers to spi_1.o(.text.HAL_SPI_ErrorCallback) for HAL_SPI_ErrorCallback + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_DMAAbortOnError) refers to stm32f4xx_hal_spi.o(.text.SPI_DMAAbortOnError) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_ErrorCallback) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_ErrorCallback) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_TxCpltCallback) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_TxCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_RxCpltCallback) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_RxCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_TxRxCpltCallback) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_TxRxCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_TxHalfCpltCallback) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_TxHalfCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_RxHalfCpltCallback) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_RxHalfCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_TxRxHalfCpltCallback) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_TxRxHalfCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_GetState) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_GetState) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_GetError) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_GetError) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_CloseRxTx_ISR) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_spi.o(.text.SPI_CloseRxTx_ISR) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_spi.o(.text.SPI_CloseRxTx_ISR) refers to stm32f4xx_hal_spi.o(.text.SPI_EndRxTxTransaction) for SPI_EndRxTxTransaction + stm32f4xx_hal_spi.o(.text.SPI_CloseRxTx_ISR) refers to spi_1.o(.text.HAL_SPI_ErrorCallback) for HAL_SPI_ErrorCallback + stm32f4xx_hal_spi.o(.text.SPI_CloseRxTx_ISR) refers to spi_1.o(.text.HAL_SPI_RxCpltCallback) for HAL_SPI_RxCpltCallback + stm32f4xx_hal_spi.o(.text.SPI_CloseRxTx_ISR) refers to spi_1.o(.text.HAL_SPI_TxRxCpltCallback) for HAL_SPI_TxRxCpltCallback + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_CloseRxTx_ISR) refers to stm32f4xx_hal_spi.o(.text.SPI_CloseRxTx_ISR) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_CloseRx_ISR) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_spi.o(.text.SPI_CloseRx_ISR) refers to stm32f4xx_hal_spi.o(.text.SPI_EndRxTransaction) for SPI_EndRxTransaction + stm32f4xx_hal_spi.o(.text.SPI_CloseRx_ISR) refers to spi_1.o(.text.HAL_SPI_ErrorCallback) for HAL_SPI_ErrorCallback + stm32f4xx_hal_spi.o(.text.SPI_CloseRx_ISR) refers to spi_1.o(.text.HAL_SPI_RxCpltCallback) for HAL_SPI_RxCpltCallback + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_CloseRx_ISR) refers to stm32f4xx_hal_spi.o(.text.SPI_CloseRx_ISR) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_CloseTx_ISR) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_spi.o(.text.SPI_CloseTx_ISR) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_spi.o(.text.SPI_CloseTx_ISR) refers to stm32f4xx_hal_spi.o(.text.SPI_EndRxTxTransaction) for SPI_EndRxTxTransaction + stm32f4xx_hal_spi.o(.text.SPI_CloseTx_ISR) refers to spi_1.o(.text.HAL_SPI_ErrorCallback) for HAL_SPI_ErrorCallback + stm32f4xx_hal_spi.o(.text.SPI_CloseTx_ISR) refers to spi_1.o(.text.HAL_SPI_TxCpltCallback) for HAL_SPI_TxCpltCallback + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_CloseTx_ISR) refers to stm32f4xx_hal_spi.o(.text.SPI_CloseTx_ISR) for [Anonymous Symbol] + stm32f4xx_hal_spi.o(.text.SPI_WaitFlagStateUntilTimeout) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_spi.o(.text.SPI_WaitFlagStateUntilTimeout) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_WaitFlagStateUntilTimeout) refers to stm32f4xx_hal_spi.o(.text.SPI_WaitFlagStateUntilTimeout) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Init) refers to tim.o(.text.HAL_TIM_Base_MspInit) for HAL_TIM_Base_MspInit + stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Init) refers to stm32f4xx_hal_tim.o(.text.TIM_Base_SetConfig) for TIM_Base_SetConfig + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Base_Init) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Init) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Base_MspInit) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_MspInit) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_Base_SetConfig) refers to stm32f4xx_hal_tim.o(.text.TIM_Base_SetConfig) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_DeInit) refers to tim.o(.text.HAL_TIM_Base_MspDeInit) for HAL_TIM_Base_MspDeInit + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Base_DeInit) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_DeInit) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Base_MspDeInit) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_MspDeInit) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Base_Start) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Start) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Base_Stop) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Stop) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Base_Start_IT) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Start_IT) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Base_Stop_IT) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Stop_IT) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_DMAPeriodElapsedCplt) for TIM_DMAPeriodElapsedCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_DMAPeriodElapsedHalfCplt) for TIM_DMAPeriodElapsedHalfCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_DMAError) for TIM_DMAError + stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Start_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Base_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Start_DMA) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.TIM_DMAPeriodElapsedCplt) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PeriodElapsedCallback) for HAL_TIM_PeriodElapsedCallback + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_DMAPeriodElapsedCplt) refers to stm32f4xx_hal_tim.o(.text.TIM_DMAPeriodElapsedCplt) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.TIM_DMAPeriodElapsedHalfCplt) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PeriodElapsedHalfCpltCallback) for HAL_TIM_PeriodElapsedHalfCpltCallback + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_DMAPeriodElapsedHalfCplt) refers to stm32f4xx_hal_tim.o(.text.TIM_DMAPeriodElapsedHalfCplt) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.TIM_DMAError) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_ErrorCallback) for HAL_TIM_ErrorCallback + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_DMAError) refers to stm32f4xx_hal_tim.o(.text.TIM_DMAError) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Stop_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for HAL_DMA_Abort_IT + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Base_Stop_DMA) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Stop_DMA) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Init) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_MspInit) for HAL_TIM_OC_MspInit + stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Init) refers to stm32f4xx_hal_tim.o(.text.TIM_Base_SetConfig) for TIM_Base_SetConfig + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_Init) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Init) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_MspInit) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_MspInit) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_DeInit) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_MspDeInit) for HAL_TIM_OC_MspDeInit + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_DeInit) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_DeInit) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_MspDeInit) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_MspDeInit) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Start) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_Start) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Start) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_CCxChannelCmd) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Stop) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_Stop) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Stop) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Start_IT) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_Start_IT) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Start_IT) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Stop_IT) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_Stop_IT) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Stop_IT) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_DMADelayPulseCplt) for TIM_DMADelayPulseCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_DMADelayPulseHalfCplt) for TIM_DMADelayPulseHalfCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_DMAError) for TIM_DMAError + stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Start_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Start_DMA) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.TIM_DMADelayPulseCplt) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_PulseFinishedCallback) for HAL_TIM_PWM_PulseFinishedCallback + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_DMADelayPulseCplt) refers to stm32f4xx_hal_tim.o(.text.TIM_DMADelayPulseCplt) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.TIM_DMADelayPulseHalfCplt) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_PulseFinishedHalfCpltCallback) for HAL_TIM_PWM_PulseFinishedHalfCpltCallback + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_DMADelayPulseHalfCplt) refers to stm32f4xx_hal_tim.o(.text.TIM_DMADelayPulseHalfCplt) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Stop_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for HAL_DMA_Abort_IT + stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Stop_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_Stop_DMA) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Stop_DMA) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Init) refers to tim.o(.text.HAL_TIM_PWM_MspInit) for HAL_TIM_PWM_MspInit + stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Init) refers to stm32f4xx_hal_tim.o(.text.TIM_Base_SetConfig) for TIM_Base_SetConfig + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_Init) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Init) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_MspInit) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_MspInit) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_DeInit) refers to tim.o(.text.HAL_TIM_PWM_MspDeInit) for HAL_TIM_PWM_MspDeInit + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_DeInit) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_DeInit) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_MspDeInit) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_MspDeInit) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Start) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_Start) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Start) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Stop) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_Stop) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Stop) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Start_IT) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_Start_IT) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Start_IT) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Stop_IT) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_Stop_IT) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Stop_IT) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_DMADelayPulseCplt) for TIM_DMADelayPulseCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_DMADelayPulseHalfCplt) for TIM_DMADelayPulseHalfCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_DMAError) for TIM_DMAError + stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Start_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Start_DMA) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Stop_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for HAL_DMA_Abort_IT + stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Stop_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_Stop_DMA) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Stop_DMA) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Init) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_MspInit) for HAL_TIM_IC_MspInit + stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Init) refers to stm32f4xx_hal_tim.o(.text.TIM_Base_SetConfig) for TIM_Base_SetConfig + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_Init) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Init) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_MspInit) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_MspInit) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_DeInit) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_MspDeInit) for HAL_TIM_IC_MspDeInit + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_DeInit) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_DeInit) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_MspDeInit) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_MspDeInit) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Start) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_Start) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Start) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Stop) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_Stop) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Stop) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Start_IT) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_Start_IT) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Start_IT) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Stop_IT) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_Stop_IT) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Stop_IT) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_DMACaptureCplt) for TIM_DMACaptureCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_DMACaptureHalfCplt) for TIM_DMACaptureHalfCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_DMAError) for TIM_DMAError + stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Start_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Start_DMA) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.TIM_DMACaptureCplt) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_CaptureCallback) for HAL_TIM_IC_CaptureCallback + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_DMACaptureCplt) refers to stm32f4xx_hal_tim.o(.text.TIM_DMACaptureCplt) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.TIM_DMACaptureHalfCplt) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_CaptureHalfCpltCallback) for HAL_TIM_IC_CaptureHalfCpltCallback + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_DMACaptureHalfCplt) refers to stm32f4xx_hal_tim.o(.text.TIM_DMACaptureHalfCplt) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Stop_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Stop_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for HAL_DMA_Abort_IT + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_Stop_DMA) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Stop_DMA) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_Init) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_MspInit) for HAL_TIM_OnePulse_MspInit + stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_Init) refers to stm32f4xx_hal_tim.o(.text.TIM_Base_SetConfig) for TIM_Base_SetConfig + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OnePulse_Init) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_Init) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OnePulse_MspInit) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_MspInit) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_DeInit) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_MspDeInit) for HAL_TIM_OnePulse_MspDeInit + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OnePulse_DeInit) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_DeInit) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OnePulse_MspDeInit) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_MspDeInit) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_Start) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OnePulse_Start) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_Start) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_Stop) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OnePulse_Stop) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_Stop) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_Start_IT) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OnePulse_Start_IT) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_Start_IT) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_Stop_IT) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OnePulse_Stop_IT) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_Stop_IT) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Init) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_MspInit) for HAL_TIM_Encoder_MspInit + stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Init) refers to stm32f4xx_hal_tim.o(.text.TIM_Base_SetConfig) for TIM_Base_SetConfig + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Encoder_Init) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Init) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Encoder_MspInit) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_MspInit) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_DeInit) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_MspDeInit) for HAL_TIM_Encoder_MspDeInit + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Encoder_DeInit) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_DeInit) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Encoder_MspDeInit) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_MspDeInit) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Start) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Encoder_Start) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Start) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Stop) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Encoder_Stop) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Stop) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Start_IT) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Encoder_Start_IT) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Start_IT) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Stop_IT) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Encoder_Stop_IT) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Stop_IT) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_DMACaptureCplt) for TIM_DMACaptureCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_DMACaptureHalfCplt) for TIM_DMACaptureHalfCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_DMAError) for TIM_DMAError + stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Start_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Encoder_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Start_DMA) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Stop_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Stop_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for HAL_DMA_Abort_IT + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Encoder_Stop_DMA) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Stop_DMA) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_IRQHandler) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_TriggerCallback) for HAL_TIM_TriggerCallback + stm32f4xx_hal_tim.o(.text.HAL_TIM_IRQHandler) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_CommutCallback) for HAL_TIMEx_CommutCallback + stm32f4xx_hal_tim.o(.text.HAL_TIM_IRQHandler) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_CaptureCallback) for HAL_TIM_IC_CaptureCallback + stm32f4xx_hal_tim.o(.text.HAL_TIM_IRQHandler) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_DelayElapsedCallback) for HAL_TIM_OC_DelayElapsedCallback + stm32f4xx_hal_tim.o(.text.HAL_TIM_IRQHandler) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_PulseFinishedCallback) for HAL_TIM_PWM_PulseFinishedCallback + stm32f4xx_hal_tim.o(.text.HAL_TIM_IRQHandler) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PeriodElapsedCallback) for HAL_TIM_PeriodElapsedCallback + stm32f4xx_hal_tim.o(.text.HAL_TIM_IRQHandler) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_BreakCallback) for HAL_TIMEx_BreakCallback + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IRQHandler) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_IRQHandler) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_CaptureCallback) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_CaptureCallback) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_DelayElapsedCallback) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_DelayElapsedCallback) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_PulseFinishedCallback) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_PulseFinishedCallback) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PeriodElapsedCallback) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PeriodElapsedCallback) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_TriggerCallback) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_TriggerCallback) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_ConfigChannel) refers to stm32f4xx_hal_tim.o(.text.TIM_OC1_SetConfig) for TIM_OC1_SetConfig + stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_ConfigChannel) refers to stm32f4xx_hal_tim.o(.text.TIM_OC2_SetConfig) for TIM_OC2_SetConfig + stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_ConfigChannel) refers to stm32f4xx_hal_tim.o(.text.TIM_OC3_SetConfig) for TIM_OC3_SetConfig + stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_ConfigChannel) refers to stm32f4xx_hal_tim.o(.text.TIM_OC4_SetConfig) for TIM_OC4_SetConfig + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_ConfigChannel) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_ConfigChannel) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_OC1_SetConfig) refers to stm32f4xx_hal_tim.o(.text.TIM_OC1_SetConfig) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_OC2_SetConfig) refers to stm32f4xx_hal_tim.o(.text.TIM_OC2_SetConfig) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_OC3_SetConfig) refers to stm32f4xx_hal_tim.o(.text.TIM_OC3_SetConfig) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_OC4_SetConfig) refers to stm32f4xx_hal_tim.o(.text.TIM_OC4_SetConfig) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_ConfigChannel) refers to stm32f4xx_hal_tim.o(.text.TIM_TI1_SetConfig) for TIM_TI1_SetConfig + stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_ConfigChannel) refers to stm32f4xx_hal_tim.o(.text.TIM_TI2_SetConfig) for TIM_TI2_SetConfig + stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_ConfigChannel) refers to stm32f4xx_hal_tim.o(.text.TIM_TI3_SetConfig) for TIM_TI3_SetConfig + stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_ConfigChannel) refers to stm32f4xx_hal_tim.o(.text.TIM_TI4_SetConfig) for TIM_TI4_SetConfig + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_ConfigChannel) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_ConfigChannel) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_TI1_SetConfig) refers to stm32f4xx_hal_tim.o(.text.TIM_TI1_SetConfig) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_TI2_SetConfig) refers to stm32f4xx_hal_tim.o(.text.TIM_TI2_SetConfig) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_TI3_SetConfig) refers to stm32f4xx_hal_tim.o(.text.TIM_TI3_SetConfig) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_TI4_SetConfig) refers to stm32f4xx_hal_tim.o(.text.TIM_TI4_SetConfig) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_ConfigChannel) refers to stm32f4xx_hal_tim.o(.text.TIM_OC1_SetConfig) for TIM_OC1_SetConfig + stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_ConfigChannel) refers to stm32f4xx_hal_tim.o(.text.TIM_OC2_SetConfig) for TIM_OC2_SetConfig + stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_ConfigChannel) refers to stm32f4xx_hal_tim.o(.text.TIM_OC3_SetConfig) for TIM_OC3_SetConfig + stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_ConfigChannel) refers to stm32f4xx_hal_tim.o(.text.TIM_OC4_SetConfig) for TIM_OC4_SetConfig + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_ConfigChannel) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_ConfigChannel) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_ConfigChannel) refers to stm32f4xx_hal_tim.o(.text.TIM_OC1_SetConfig) for TIM_OC1_SetConfig + stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_ConfigChannel) refers to stm32f4xx_hal_tim.o(.text.TIM_OC2_SetConfig) for TIM_OC2_SetConfig + stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_ConfigChannel) refers to stm32f4xx_hal_tim.o(.text.TIM_TI1_SetConfig) for TIM_TI1_SetConfig + stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_ConfigChannel) refers to stm32f4xx_hal_tim.o(.text.TIM_TI2_SetConfig) for TIM_TI2_SetConfig + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OnePulse_ConfigChannel) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_ConfigChannel) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_WriteStart) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiWriteStart) for HAL_TIM_DMABurst_MultiWriteStart + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_DMABurst_WriteStart) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_WriteStart) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiWriteStart) refers to stm32f4xx_hal_tim.o(.text.TIM_DMADelayPulseCplt) for TIM_DMADelayPulseCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiWriteStart) refers to stm32f4xx_hal_tim.o(.text.TIM_DMADelayPulseHalfCplt) for TIM_DMADelayPulseHalfCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiWriteStart) refers to stm32f4xx_hal_tim.o(.text.TIM_DMAError) for TIM_DMAError + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiWriteStart) refers to stm32f4xx_hal_tim.o(.text.TIM_DMATriggerCplt) for TIM_DMATriggerCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiWriteStart) refers to stm32f4xx_hal_tim.o(.text.TIM_DMATriggerHalfCplt) for TIM_DMATriggerHalfCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiWriteStart) refers to stm32f4xx_hal_tim.o(.text.TIM_DMAPeriodElapsedCplt) for TIM_DMAPeriodElapsedCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiWriteStart) refers to stm32f4xx_hal_tim.o(.text.TIM_DMAPeriodElapsedHalfCplt) for TIM_DMAPeriodElapsedHalfCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiWriteStart) refers to stm32f4xx_hal_tim_ex.o(.text.TIMEx_DMACommutationCplt) for TIMEx_DMACommutationCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiWriteStart) refers to stm32f4xx_hal_tim_ex.o(.text.TIMEx_DMACommutationHalfCplt) for TIMEx_DMACommutationHalfCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiWriteStart) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_DMABurst_MultiWriteStart) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiWriteStart) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.TIM_DMATriggerCplt) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_TriggerCallback) for HAL_TIM_TriggerCallback + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_DMATriggerCplt) refers to stm32f4xx_hal_tim.o(.text.TIM_DMATriggerCplt) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.TIM_DMATriggerHalfCplt) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_TriggerHalfCpltCallback) for HAL_TIM_TriggerHalfCpltCallback + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_DMATriggerHalfCplt) refers to stm32f4xx_hal_tim.o(.text.TIM_DMATriggerHalfCplt) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_WriteStop) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for HAL_DMA_Abort_IT + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_DMABurst_WriteStop) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_WriteStop) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_ReadStart) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiReadStart) for HAL_TIM_DMABurst_MultiReadStart + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_DMABurst_ReadStart) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_ReadStart) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiReadStart) refers to stm32f4xx_hal_tim.o(.text.TIM_DMACaptureCplt) for TIM_DMACaptureCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiReadStart) refers to stm32f4xx_hal_tim.o(.text.TIM_DMACaptureHalfCplt) for TIM_DMACaptureHalfCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiReadStart) refers to stm32f4xx_hal_tim.o(.text.TIM_DMAError) for TIM_DMAError + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiReadStart) refers to stm32f4xx_hal_tim.o(.text.TIM_DMATriggerCplt) for TIM_DMATriggerCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiReadStart) refers to stm32f4xx_hal_tim.o(.text.TIM_DMATriggerHalfCplt) for TIM_DMATriggerHalfCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiReadStart) refers to stm32f4xx_hal_tim.o(.text.TIM_DMAPeriodElapsedCplt) for TIM_DMAPeriodElapsedCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiReadStart) refers to stm32f4xx_hal_tim.o(.text.TIM_DMAPeriodElapsedHalfCplt) for TIM_DMAPeriodElapsedHalfCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiReadStart) refers to stm32f4xx_hal_tim_ex.o(.text.TIMEx_DMACommutationCplt) for TIMEx_DMACommutationCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiReadStart) refers to stm32f4xx_hal_tim_ex.o(.text.TIMEx_DMACommutationHalfCplt) for TIMEx_DMACommutationHalfCplt + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiReadStart) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_DMABurst_MultiReadStart) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiReadStart) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_ReadStop) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for HAL_DMA_Abort_IT + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_DMABurst_ReadStop) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_ReadStop) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_GenerateEvent) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_GenerateEvent) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_ConfigOCrefClear) refers to stm32f4xx_hal_tim.o(.text.TIM_ETR_SetConfig) for TIM_ETR_SetConfig + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_ConfigOCrefClear) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_ConfigOCrefClear) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_ETR_SetConfig) refers to stm32f4xx_hal_tim.o(.text.TIM_ETR_SetConfig) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_ConfigClockSource) refers to stm32f4xx_hal_tim.o(.text.TIM_TI1_ConfigInputStage) for TIM_TI1_ConfigInputStage + stm32f4xx_hal_tim.o(.text.HAL_TIM_ConfigClockSource) refers to stm32f4xx_hal_tim.o(.text.TIM_ETR_SetConfig) for TIM_ETR_SetConfig + stm32f4xx_hal_tim.o(.text.HAL_TIM_ConfigClockSource) refers to stm32f4xx_hal_tim.o(.text.TIM_TI2_ConfigInputStage) for TIM_TI2_ConfigInputStage + stm32f4xx_hal_tim.o(.text.HAL_TIM_ConfigClockSource) refers to stm32f4xx_hal_tim.o(.text.TIM_ITRx_SetConfig) for TIM_ITRx_SetConfig + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_ConfigClockSource) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_ConfigClockSource) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_TI1_ConfigInputStage) refers to stm32f4xx_hal_tim.o(.text.TIM_TI1_ConfigInputStage) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_ITRx_SetConfig) refers to stm32f4xx_hal_tim.o(.text.TIM_ITRx_SetConfig) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_TI2_ConfigInputStage) refers to stm32f4xx_hal_tim.o(.text.TIM_TI2_ConfigInputStage) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_ConfigTI1Input) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_ConfigTI1Input) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_SlaveConfigSynchro) refers to stm32f4xx_hal_tim.o(.text.TIM_SlaveTimer_SetConfig) for TIM_SlaveTimer_SetConfig + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_SlaveConfigSynchro) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_SlaveConfigSynchro) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.TIM_SlaveTimer_SetConfig) refers to stm32f4xx_hal_tim.o(.text.TIM_TI1_ConfigInputStage) for TIM_TI1_ConfigInputStage + stm32f4xx_hal_tim.o(.text.TIM_SlaveTimer_SetConfig) refers to stm32f4xx_hal_tim.o(.text.TIM_TI2_ConfigInputStage) for TIM_TI2_ConfigInputStage + stm32f4xx_hal_tim.o(.text.TIM_SlaveTimer_SetConfig) refers to stm32f4xx_hal_tim.o(.text.TIM_ETR_SetConfig) for TIM_ETR_SetConfig + stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_SlaveTimer_SetConfig) refers to stm32f4xx_hal_tim.o(.text.TIM_SlaveTimer_SetConfig) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.text.HAL_TIM_SlaveConfigSynchro_IT) refers to stm32f4xx_hal_tim.o(.text.TIM_SlaveTimer_SetConfig) for TIM_SlaveTimer_SetConfig + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_SlaveConfigSynchro_IT) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_SlaveConfigSynchro_IT) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_ReadCapturedValue) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_ReadCapturedValue) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PeriodElapsedHalfCpltCallback) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PeriodElapsedHalfCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_CaptureHalfCpltCallback) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_CaptureHalfCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_PulseFinishedHalfCpltCallback) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_PulseFinishedHalfCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_TriggerHalfCpltCallback) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_TriggerHalfCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_ErrorCallback) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_ErrorCallback) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Base_GetState) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_GetState) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_GetState) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_GetState) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_GetState) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_GetState) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_GetState) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_GetState) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OnePulse_GetState) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_GetState) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Encoder_GetState) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_GetState) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_GetActiveChannel) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_GetActiveChannel) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_GetChannelState) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_GetChannelState) for [Anonymous Symbol] + stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_DMABurstState) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurstState) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Init) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_MspInit) for HAL_TIMEx_HallSensor_MspInit + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Init) refers to stm32f4xx_hal_tim.o(.text.TIM_Base_SetConfig) for TIM_Base_SetConfig + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Init) refers to stm32f4xx_hal_tim.o(.text.TIM_TI1_SetConfig) for TIM_TI1_SetConfig + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Init) refers to stm32f4xx_hal_tim.o(.text.TIM_OC2_SetConfig) for TIM_OC2_SetConfig + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_HallSensor_Init) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Init) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_HallSensor_MspInit) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_MspInit) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_DeInit) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_MspDeInit) for HAL_TIMEx_HallSensor_MspDeInit + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_HallSensor_DeInit) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_DeInit) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_HallSensor_MspDeInit) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_MspDeInit) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Start) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_HallSensor_Start) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Start) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Stop) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_HallSensor_Stop) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Stop) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Start_IT) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_HallSensor_Start_IT) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Start_IT) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Stop_IT) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_HallSensor_Stop_IT) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Stop_IT) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_DMACaptureCplt) for TIM_DMACaptureCplt + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_DMACaptureHalfCplt) for TIM_DMACaptureHalfCplt + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_DMAError) for TIM_DMAError + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Start_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_HallSensor_Start_DMA) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Start_DMA) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Stop_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Stop_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for HAL_DMA_Abort_IT + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_HallSensor_Stop_DMA) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Stop_DMA) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Start) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_CCxNChannelCmd) for TIM_CCxNChannelCmd + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_OCN_Start) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Start) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.TIM_CCxNChannelCmd) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_CCxNChannelCmd) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Stop) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_CCxNChannelCmd) for TIM_CCxNChannelCmd + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_OCN_Stop) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Stop) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Start_IT) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_CCxNChannelCmd) for TIM_CCxNChannelCmd + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_OCN_Start_IT) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Start_IT) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Stop_IT) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_CCxNChannelCmd) for TIM_CCxNChannelCmd + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_OCN_Stop_IT) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Stop_IT) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Start_DMA) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_DMADelayPulseNCplt) for TIM_DMADelayPulseNCplt + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_DMADelayPulseHalfCplt) for TIM_DMADelayPulseHalfCplt + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Start_DMA) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_DMAErrorCCxN) for TIM_DMAErrorCCxN + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Start_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Start_DMA) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_CCxNChannelCmd) for TIM_CCxNChannelCmd + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_OCN_Start_DMA) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Start_DMA) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.TIM_DMADelayPulseNCplt) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_PulseFinishedCallback) for HAL_TIM_PWM_PulseFinishedCallback + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.TIM_DMADelayPulseNCplt) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_DMADelayPulseNCplt) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.TIM_DMAErrorCCxN) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_ErrorCallback) for HAL_TIM_ErrorCallback + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.TIM_DMAErrorCCxN) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_DMAErrorCCxN) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Stop_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for HAL_DMA_Abort_IT + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Stop_DMA) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_CCxNChannelCmd) for TIM_CCxNChannelCmd + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_OCN_Stop_DMA) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Stop_DMA) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Start) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_CCxNChannelCmd) for TIM_CCxNChannelCmd + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_PWMN_Start) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Start) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Stop) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_CCxNChannelCmd) for TIM_CCxNChannelCmd + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_PWMN_Stop) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Stop) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Start_IT) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_CCxNChannelCmd) for TIM_CCxNChannelCmd + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_PWMN_Start_IT) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Start_IT) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Stop_IT) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_CCxNChannelCmd) for TIM_CCxNChannelCmd + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_PWMN_Stop_IT) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Stop_IT) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Start_DMA) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_DMADelayPulseNCplt) for TIM_DMADelayPulseNCplt + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Start_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_DMADelayPulseHalfCplt) for TIM_DMADelayPulseHalfCplt + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Start_DMA) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_DMAErrorCCxN) for TIM_DMAErrorCCxN + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Start_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Start_DMA) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_CCxNChannelCmd) for TIM_CCxNChannelCmd + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_PWMN_Start_DMA) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Start_DMA) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Stop_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for HAL_DMA_Abort_IT + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Stop_DMA) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_CCxNChannelCmd) for TIM_CCxNChannelCmd + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_PWMN_Stop_DMA) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Stop_DMA) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OnePulseN_Start) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_CCxNChannelCmd) for TIM_CCxNChannelCmd + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OnePulseN_Start) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_OnePulseN_Start) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OnePulseN_Start) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OnePulseN_Stop) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_CCxNChannelCmd) for TIM_CCxNChannelCmd + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OnePulseN_Stop) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_OnePulseN_Stop) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OnePulseN_Stop) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OnePulseN_Start_IT) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_CCxNChannelCmd) for TIM_CCxNChannelCmd + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OnePulseN_Start_IT) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_OnePulseN_Start_IT) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OnePulseN_Start_IT) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OnePulseN_Stop_IT) refers to stm32f4xx_hal_tim_ex.o(.text.TIM_CCxNChannelCmd) for TIM_CCxNChannelCmd + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OnePulseN_Stop_IT) refers to stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd) for TIM_CCxChannelCmd + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_OnePulseN_Stop_IT) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OnePulseN_Stop_IT) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_ConfigCommutEvent) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_ConfigCommutEvent) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_ConfigCommutEvent_IT) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_ConfigCommutEvent_IT) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_ConfigCommutEvent_DMA) refers to stm32f4xx_hal_tim_ex.o(.text.TIMEx_DMACommutationCplt) for TIMEx_DMACommutationCplt + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_ConfigCommutEvent_DMA) refers to stm32f4xx_hal_tim_ex.o(.text.TIMEx_DMACommutationHalfCplt) for TIMEx_DMACommutationHalfCplt + stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_ConfigCommutEvent_DMA) refers to stm32f4xx_hal_tim.o(.text.TIM_DMAError) for TIM_DMAError + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_ConfigCommutEvent_DMA) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_ConfigCommutEvent_DMA) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.TIMEx_DMACommutationCplt) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_CommutCallback) for HAL_TIMEx_CommutCallback + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.TIMEx_DMACommutationCplt) refers to stm32f4xx_hal_tim_ex.o(.text.TIMEx_DMACommutationCplt) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.text.TIMEx_DMACommutationHalfCplt) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_CommutHalfCpltCallback) for HAL_TIMEx_CommutHalfCpltCallback + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.TIMEx_DMACommutationHalfCplt) refers to stm32f4xx_hal_tim_ex.o(.text.TIMEx_DMACommutationHalfCplt) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_MasterConfigSynchronization) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_MasterConfigSynchronization) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_ConfigBreakDeadTime) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_ConfigBreakDeadTime) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_RemapConfig) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_RemapConfig) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_CommutCallback) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_CommutCallback) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_CommutHalfCpltCallback) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_CommutHalfCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_BreakCallback) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_BreakCallback) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_HallSensor_GetState) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_GetState) for [Anonymous Symbol] + stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_GetChannelNState) refers to stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_GetChannelNState) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.HAL_UART_Init) refers to usart.o(.text.HAL_UART_MspInit) for HAL_UART_MspInit + stm32f4xx_hal_uart.o(.text.HAL_UART_Init) refers to stm32f4xx_hal_uart.o(.text.UART_SetConfig) for UART_SetConfig + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_Init) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_Init) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_MspInit) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_MspInit) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.UART_SetConfig) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetPCLK2Freq) for HAL_RCC_GetPCLK2Freq + stm32f4xx_hal_uart.o(.text.UART_SetConfig) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetPCLK1Freq) for HAL_RCC_GetPCLK1Freq + stm32f4xx_hal_uart.o(.text.UART_SetConfig) refers to lludivv7m.o(.text) for __aeabi_uldivmod + stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_SetConfig) refers to stm32f4xx_hal_uart.o(.text.UART_SetConfig) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.HAL_HalfDuplex_Init) refers to usart.o(.text.HAL_UART_MspInit) for HAL_UART_MspInit + stm32f4xx_hal_uart.o(.text.HAL_HalfDuplex_Init) refers to stm32f4xx_hal_uart.o(.text.UART_SetConfig) for UART_SetConfig + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_HalfDuplex_Init) refers to stm32f4xx_hal_uart.o(.text.HAL_HalfDuplex_Init) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.HAL_LIN_Init) refers to usart.o(.text.HAL_UART_MspInit) for HAL_UART_MspInit + stm32f4xx_hal_uart.o(.text.HAL_LIN_Init) refers to stm32f4xx_hal_uart.o(.text.UART_SetConfig) for UART_SetConfig + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_LIN_Init) refers to stm32f4xx_hal_uart.o(.text.HAL_LIN_Init) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.HAL_MultiProcessor_Init) refers to usart.o(.text.HAL_UART_MspInit) for HAL_UART_MspInit + stm32f4xx_hal_uart.o(.text.HAL_MultiProcessor_Init) refers to stm32f4xx_hal_uart.o(.text.UART_SetConfig) for UART_SetConfig + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_MultiProcessor_Init) refers to stm32f4xx_hal_uart.o(.text.HAL_MultiProcessor_Init) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.HAL_UART_DeInit) refers to usart.o(.text.HAL_UART_MspDeInit) for HAL_UART_MspDeInit + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_DeInit) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_DeInit) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_MspDeInit) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_MspDeInit) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.HAL_UART_Transmit) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_uart.o(.text.HAL_UART_Transmit) refers to stm32f4xx_hal_uart.o(.text.UART_WaitOnFlagUntilTimeout) for UART_WaitOnFlagUntilTimeout + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_Transmit) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_Transmit) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.UART_WaitOnFlagUntilTimeout) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_uart.o(.text.UART_WaitOnFlagUntilTimeout) refers to stm32f4xx_hal_uart.o(.text.UART_EndRxTransfer) for UART_EndRxTransfer + stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_WaitOnFlagUntilTimeout) refers to stm32f4xx_hal_uart.o(.text.UART_WaitOnFlagUntilTimeout) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.HAL_UART_Receive) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_uart.o(.text.HAL_UART_Receive) refers to stm32f4xx_hal_uart.o(.text.UART_WaitOnFlagUntilTimeout) for UART_WaitOnFlagUntilTimeout + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_Receive) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_Receive) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_Transmit_IT) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_Transmit_IT) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.HAL_UART_Receive_IT) refers to stm32f4xx_hal_uart.o(.text.UART_Start_Receive_IT) for UART_Start_Receive_IT + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_Receive_IT) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_Receive_IT) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_Start_Receive_IT) refers to stm32f4xx_hal_uart.o(.text.UART_Start_Receive_IT) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.HAL_UART_Transmit_DMA) refers to stm32f4xx_hal_uart.o(.text.UART_DMATransmitCplt) for UART_DMATransmitCplt + stm32f4xx_hal_uart.o(.text.HAL_UART_Transmit_DMA) refers to stm32f4xx_hal_uart.o(.text.UART_DMATxHalfCplt) for UART_DMATxHalfCplt + stm32f4xx_hal_uart.o(.text.HAL_UART_Transmit_DMA) refers to stm32f4xx_hal_uart.o(.text.UART_DMAError) for UART_DMAError + stm32f4xx_hal_uart.o(.text.HAL_UART_Transmit_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_Transmit_DMA) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_Transmit_DMA) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.UART_DMATransmitCplt) refers to uart.o(.text.HAL_UART_TxCpltCallback) for HAL_UART_TxCpltCallback + stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_DMATransmitCplt) refers to stm32f4xx_hal_uart.o(.text.UART_DMATransmitCplt) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.UART_DMATxHalfCplt) refers to uart.o(.text.HAL_UART_TxHalfCpltCallback) for HAL_UART_TxHalfCpltCallback + stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_DMATxHalfCplt) refers to stm32f4xx_hal_uart.o(.text.UART_DMATxHalfCplt) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.UART_DMAError) refers to stm32f4xx_hal_uart.o(.text.UART_EndTxTransfer) for UART_EndTxTransfer + stm32f4xx_hal_uart.o(.text.UART_DMAError) refers to stm32f4xx_hal_uart.o(.text.UART_EndRxTransfer) for UART_EndRxTransfer + stm32f4xx_hal_uart.o(.text.UART_DMAError) refers to uart.o(.text.HAL_UART_ErrorCallback) for HAL_UART_ErrorCallback + stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_DMAError) refers to stm32f4xx_hal_uart.o(.text.UART_DMAError) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.HAL_UART_Receive_DMA) refers to stm32f4xx_hal_uart.o(.text.UART_Start_Receive_DMA) for UART_Start_Receive_DMA + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_Receive_DMA) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_Receive_DMA) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.UART_Start_Receive_DMA) refers to stm32f4xx_hal_uart.o(.text.UART_DMAReceiveCplt) for UART_DMAReceiveCplt + stm32f4xx_hal_uart.o(.text.UART_Start_Receive_DMA) refers to stm32f4xx_hal_uart.o(.text.UART_DMARxHalfCplt) for UART_DMARxHalfCplt + stm32f4xx_hal_uart.o(.text.UART_Start_Receive_DMA) refers to stm32f4xx_hal_uart.o(.text.UART_DMAError) for UART_DMAError + stm32f4xx_hal_uart.o(.text.UART_Start_Receive_DMA) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT) for HAL_DMA_Start_IT + stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_Start_Receive_DMA) refers to stm32f4xx_hal_uart.o(.text.UART_Start_Receive_DMA) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_DMAPause) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_DMAPause) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_DMAResume) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_DMAResume) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.HAL_UART_DMAStop) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort) for HAL_DMA_Abort + stm32f4xx_hal_uart.o(.text.HAL_UART_DMAStop) refers to stm32f4xx_hal_uart.o(.text.UART_EndTxTransfer) for UART_EndTxTransfer + stm32f4xx_hal_uart.o(.text.HAL_UART_DMAStop) refers to stm32f4xx_hal_uart.o(.text.UART_EndRxTransfer) for UART_EndRxTransfer + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_DMAStop) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_DMAStop) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_EndTxTransfer) refers to stm32f4xx_hal_uart.o(.text.UART_EndTxTransfer) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_EndRxTransfer) refers to stm32f4xx_hal_uart.o(.text.UART_EndRxTransfer) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.HAL_UARTEx_ReceiveToIdle) refers to stm32f4xx_hal.o(.text.HAL_GetTick) for HAL_GetTick + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UARTEx_ReceiveToIdle) refers to stm32f4xx_hal_uart.o(.text.HAL_UARTEx_ReceiveToIdle) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.HAL_UARTEx_ReceiveToIdle_IT) refers to stm32f4xx_hal_uart.o(.text.UART_Start_Receive_IT) for UART_Start_Receive_IT + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UARTEx_ReceiveToIdle_IT) refers to stm32f4xx_hal_uart.o(.text.HAL_UARTEx_ReceiveToIdle_IT) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.HAL_UARTEx_ReceiveToIdle_DMA) refers to stm32f4xx_hal_uart.o(.text.UART_Start_Receive_DMA) for UART_Start_Receive_DMA + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UARTEx_ReceiveToIdle_DMA) refers to stm32f4xx_hal_uart.o(.text.HAL_UARTEx_ReceiveToIdle_DMA) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UARTEx_GetRxEventType) refers to stm32f4xx_hal_uart.o(.text.HAL_UARTEx_GetRxEventType) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.HAL_UART_Abort) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort) for HAL_DMA_Abort + stm32f4xx_hal_uart.o(.text.HAL_UART_Abort) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_GetError) for HAL_DMA_GetError + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_Abort) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_Abort) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.HAL_UART_AbortTransmit) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort) for HAL_DMA_Abort + stm32f4xx_hal_uart.o(.text.HAL_UART_AbortTransmit) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_GetError) for HAL_DMA_GetError + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_AbortTransmit) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_AbortTransmit) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.HAL_UART_AbortReceive) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort) for HAL_DMA_Abort + stm32f4xx_hal_uart.o(.text.HAL_UART_AbortReceive) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_GetError) for HAL_DMA_GetError + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_AbortReceive) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_AbortReceive) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.HAL_UART_Abort_IT) refers to stm32f4xx_hal_uart.o(.text.UART_DMATxAbortCallback) for UART_DMATxAbortCallback + stm32f4xx_hal_uart.o(.text.HAL_UART_Abort_IT) refers to stm32f4xx_hal_uart.o(.text.UART_DMARxAbortCallback) for UART_DMARxAbortCallback + stm32f4xx_hal_uart.o(.text.HAL_UART_Abort_IT) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for HAL_DMA_Abort_IT + stm32f4xx_hal_uart.o(.text.HAL_UART_Abort_IT) refers to uart.o(.text.HAL_UART_AbortCpltCallback) for HAL_UART_AbortCpltCallback + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_Abort_IT) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_Abort_IT) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.UART_DMATxAbortCallback) refers to uart.o(.text.HAL_UART_AbortCpltCallback) for HAL_UART_AbortCpltCallback + stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_DMATxAbortCallback) refers to stm32f4xx_hal_uart.o(.text.UART_DMATxAbortCallback) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.UART_DMARxAbortCallback) refers to uart.o(.text.HAL_UART_AbortCpltCallback) for HAL_UART_AbortCpltCallback + stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_DMARxAbortCallback) refers to stm32f4xx_hal_uart.o(.text.UART_DMARxAbortCallback) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_AbortCpltCallback) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_AbortCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.HAL_UART_AbortTransmit_IT) refers to uart.o(.text.HAL_UART_AbortTransmitCpltCallback) for HAL_UART_AbortTransmitCpltCallback + stm32f4xx_hal_uart.o(.text.HAL_UART_AbortTransmit_IT) refers to stm32f4xx_hal_uart.o(.text.UART_DMATxOnlyAbortCallback) for UART_DMATxOnlyAbortCallback + stm32f4xx_hal_uart.o(.text.HAL_UART_AbortTransmit_IT) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for HAL_DMA_Abort_IT + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_AbortTransmit_IT) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_AbortTransmit_IT) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.UART_DMATxOnlyAbortCallback) refers to uart.o(.text.HAL_UART_AbortTransmitCpltCallback) for HAL_UART_AbortTransmitCpltCallback + stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_DMATxOnlyAbortCallback) refers to stm32f4xx_hal_uart.o(.text.UART_DMATxOnlyAbortCallback) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_AbortTransmitCpltCallback) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_AbortTransmitCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.HAL_UART_AbortReceive_IT) refers to uart.o(.text.HAL_UART_AbortReceiveCpltCallback) for HAL_UART_AbortReceiveCpltCallback + stm32f4xx_hal_uart.o(.text.HAL_UART_AbortReceive_IT) refers to stm32f4xx_hal_uart.o(.text.UART_DMARxOnlyAbortCallback) for UART_DMARxOnlyAbortCallback + stm32f4xx_hal_uart.o(.text.HAL_UART_AbortReceive_IT) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for HAL_DMA_Abort_IT + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_AbortReceive_IT) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_AbortReceive_IT) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.UART_DMARxOnlyAbortCallback) refers to uart.o(.text.HAL_UART_AbortReceiveCpltCallback) for HAL_UART_AbortReceiveCpltCallback + stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_DMARxOnlyAbortCallback) refers to stm32f4xx_hal_uart.o(.text.UART_DMARxOnlyAbortCallback) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_AbortReceiveCpltCallback) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_AbortReceiveCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.HAL_UART_IRQHandler) refers to stm32f4xx_hal_uart.o(.text.UART_Receive_IT) for UART_Receive_IT + stm32f4xx_hal_uart.o(.text.HAL_UART_IRQHandler) refers to stm32f4xx_hal_uart.o(.text.UART_EndTransmit_IT) for UART_EndTransmit_IT + stm32f4xx_hal_uart.o(.text.HAL_UART_IRQHandler) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort) for HAL_DMA_Abort + stm32f4xx_hal_uart.o(.text.HAL_UART_IRQHandler) refers to stm32f4xx_hal_uart.o(.text.UART_Transmit_IT) for UART_Transmit_IT + stm32f4xx_hal_uart.o(.text.HAL_UART_IRQHandler) refers to stm32f4xx_hal_uart.o(.text.HAL_UARTEx_RxEventCallback) for HAL_UARTEx_RxEventCallback + stm32f4xx_hal_uart.o(.text.HAL_UART_IRQHandler) refers to stm32f4xx_hal_uart.o(.text.UART_EndRxTransfer) for UART_EndRxTransfer + stm32f4xx_hal_uart.o(.text.HAL_UART_IRQHandler) refers to stm32f4xx_hal_uart.o(.text.UART_DMAAbortOnError) for UART_DMAAbortOnError + stm32f4xx_hal_uart.o(.text.HAL_UART_IRQHandler) refers to stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) for HAL_DMA_Abort_IT + stm32f4xx_hal_uart.o(.text.HAL_UART_IRQHandler) refers to uart.o(.text.HAL_UART_ErrorCallback) for HAL_UART_ErrorCallback + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_IRQHandler) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_IRQHandler) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.UART_Receive_IT) refers to stm32f4xx_hal_uart.o(.text.HAL_UARTEx_RxEventCallback) for HAL_UARTEx_RxEventCallback + stm32f4xx_hal_uart.o(.text.UART_Receive_IT) refers to uart.o(.text.HAL_UART_RxCpltCallback) for HAL_UART_RxCpltCallback + stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_Receive_IT) refers to stm32f4xx_hal_uart.o(.text.UART_Receive_IT) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.UART_DMAAbortOnError) refers to uart.o(.text.HAL_UART_ErrorCallback) for HAL_UART_ErrorCallback + stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_DMAAbortOnError) refers to stm32f4xx_hal_uart.o(.text.UART_DMAAbortOnError) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_ErrorCallback) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_ErrorCallback) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UARTEx_RxEventCallback) refers to stm32f4xx_hal_uart.o(.text.HAL_UARTEx_RxEventCallback) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_Transmit_IT) refers to stm32f4xx_hal_uart.o(.text.UART_Transmit_IT) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.UART_EndTransmit_IT) refers to uart.o(.text.HAL_UART_TxCpltCallback) for HAL_UART_TxCpltCallback + stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_EndTransmit_IT) refers to stm32f4xx_hal_uart.o(.text.UART_EndTransmit_IT) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_TxCpltCallback) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_TxCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_TxHalfCpltCallback) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_TxHalfCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_RxCpltCallback) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_RxCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_RxHalfCpltCallback) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_RxHalfCpltCallback) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_LIN_SendBreak) refers to stm32f4xx_hal_uart.o(.text.HAL_LIN_SendBreak) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_MultiProcessor_EnterMuteMode) refers to stm32f4xx_hal_uart.o(.text.HAL_MultiProcessor_EnterMuteMode) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_MultiProcessor_ExitMuteMode) refers to stm32f4xx_hal_uart.o(.text.HAL_MultiProcessor_ExitMuteMode) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_HalfDuplex_EnableTransmitter) refers to stm32f4xx_hal_uart.o(.text.HAL_HalfDuplex_EnableTransmitter) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_HalfDuplex_EnableReceiver) refers to stm32f4xx_hal_uart.o(.text.HAL_HalfDuplex_EnableReceiver) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_GetState) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_GetState) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_GetError) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_GetError) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.UART_DMAReceiveCplt) refers to stm32f4xx_hal_uart.o(.text.HAL_UARTEx_RxEventCallback) for HAL_UARTEx_RxEventCallback + stm32f4xx_hal_uart.o(.text.UART_DMAReceiveCplt) refers to uart.o(.text.HAL_UART_RxCpltCallback) for HAL_UART_RxCpltCallback + stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_DMAReceiveCplt) refers to stm32f4xx_hal_uart.o(.text.UART_DMAReceiveCplt) for [Anonymous Symbol] + stm32f4xx_hal_uart.o(.text.UART_DMARxHalfCplt) refers to stm32f4xx_hal_uart.o(.text.HAL_UARTEx_RxEventCallback) for HAL_UARTEx_RxEventCallback + stm32f4xx_hal_uart.o(.text.UART_DMARxHalfCplt) refers to uart.o(.text.HAL_UART_RxHalfCpltCallback) for HAL_UART_RxHalfCpltCallback + stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_DMARxHalfCplt) refers to stm32f4xx_hal_uart.o(.text.UART_DMARxHalfCplt) for [Anonymous Symbol] + system_stm32f4xx.o(.ARM.exidx.text.SystemInit) refers to system_stm32f4xx.o(.text.SystemInit) for [Anonymous Symbol] + system_stm32f4xx.o(.text.SystemCoreClockUpdate) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + system_stm32f4xx.o(.text.SystemCoreClockUpdate) refers to system_stm32f4xx.o(.rodata.AHBPrescTable) for AHBPrescTable + system_stm32f4xx.o(.ARM.exidx.text.SystemCoreClockUpdate) refers to system_stm32f4xx.o(.text.SystemCoreClockUpdate) for [Anonymous Symbol] + event_groups.o(.text.xEventGroupCreateStatic) refers to list.o(.text.vListInitialise) for vListInitialise + event_groups.o(.ARM.exidx.text.xEventGroupCreateStatic) refers to event_groups.o(.text.xEventGroupCreateStatic) for [Anonymous Symbol] + event_groups.o(.text.xEventGroupCreate) refers to heap_4.o(.text.pvPortMalloc) for pvPortMalloc + event_groups.o(.text.xEventGroupCreate) refers to list.o(.text.vListInitialise) for vListInitialise + event_groups.o(.ARM.exidx.text.xEventGroupCreate) refers to event_groups.o(.text.xEventGroupCreate) for [Anonymous Symbol] + event_groups.o(.text.xEventGroupSync) refers to tasks.o(.text.xTaskGetSchedulerState) for xTaskGetSchedulerState + event_groups.o(.text.xEventGroupSync) refers to tasks.o(.text.vTaskSuspendAll) for vTaskSuspendAll + event_groups.o(.text.xEventGroupSync) refers to event_groups.o(.text.xEventGroupSetBits) for xEventGroupSetBits + event_groups.o(.text.xEventGroupSync) refers to tasks.o(.text.vTaskPlaceOnUnorderedEventList) for vTaskPlaceOnUnorderedEventList + event_groups.o(.text.xEventGroupSync) refers to tasks.o(.text.xTaskResumeAll) for xTaskResumeAll + event_groups.o(.text.xEventGroupSync) refers to tasks.o(.text.uxTaskResetEventItemValue) for uxTaskResetEventItemValue + event_groups.o(.text.xEventGroupSync) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + event_groups.o(.text.xEventGroupSync) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + event_groups.o(.ARM.exidx.text.xEventGroupSync) refers to event_groups.o(.text.xEventGroupSync) for [Anonymous Symbol] + event_groups.o(.text.xEventGroupSetBits) refers to tasks.o(.text.vTaskSuspendAll) for vTaskSuspendAll + event_groups.o(.text.xEventGroupSetBits) refers to tasks.o(.text.xTaskResumeAll) for xTaskResumeAll + event_groups.o(.text.xEventGroupSetBits) refers to tasks.o(.text.vTaskRemoveFromUnorderedEventList) for vTaskRemoveFromUnorderedEventList + event_groups.o(.ARM.exidx.text.xEventGroupSetBits) refers to event_groups.o(.text.xEventGroupSetBits) for [Anonymous Symbol] + event_groups.o(.text.xEventGroupWaitBits) refers to tasks.o(.text.xTaskGetSchedulerState) for xTaskGetSchedulerState + event_groups.o(.text.xEventGroupWaitBits) refers to tasks.o(.text.vTaskSuspendAll) for vTaskSuspendAll + event_groups.o(.text.xEventGroupWaitBits) refers to event_groups.o(.text.prvTestWaitCondition) for prvTestWaitCondition + event_groups.o(.text.xEventGroupWaitBits) refers to tasks.o(.text.vTaskPlaceOnUnorderedEventList) for vTaskPlaceOnUnorderedEventList + event_groups.o(.text.xEventGroupWaitBits) refers to tasks.o(.text.xTaskResumeAll) for xTaskResumeAll + event_groups.o(.text.xEventGroupWaitBits) refers to tasks.o(.text.uxTaskResetEventItemValue) for uxTaskResetEventItemValue + event_groups.o(.text.xEventGroupWaitBits) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + event_groups.o(.text.xEventGroupWaitBits) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + event_groups.o(.ARM.exidx.text.xEventGroupWaitBits) refers to event_groups.o(.text.xEventGroupWaitBits) for [Anonymous Symbol] + event_groups.o(.ARM.exidx.text.prvTestWaitCondition) refers to event_groups.o(.text.prvTestWaitCondition) for [Anonymous Symbol] + event_groups.o(.text.xEventGroupClearBits) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + event_groups.o(.text.xEventGroupClearBits) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + event_groups.o(.ARM.exidx.text.xEventGroupClearBits) refers to event_groups.o(.text.xEventGroupClearBits) for [Anonymous Symbol] + event_groups.o(.text.xEventGroupClearBitsFromISR) refers to event_groups.o(.text.vEventGroupClearBitsCallback) for vEventGroupClearBitsCallback + event_groups.o(.text.xEventGroupClearBitsFromISR) refers to timers.o(.text.xTimerPendFunctionCallFromISR) for xTimerPendFunctionCallFromISR + event_groups.o(.ARM.exidx.text.xEventGroupClearBitsFromISR) refers to event_groups.o(.text.xEventGroupClearBitsFromISR) for [Anonymous Symbol] + event_groups.o(.text.vEventGroupClearBitsCallback) refers to event_groups.o(.text.xEventGroupClearBits) for xEventGroupClearBits + event_groups.o(.ARM.exidx.text.vEventGroupClearBitsCallback) refers to event_groups.o(.text.vEventGroupClearBitsCallback) for [Anonymous Symbol] + event_groups.o(.ARM.exidx.text.xEventGroupGetBitsFromISR) refers to event_groups.o(.text.xEventGroupGetBitsFromISR) for [Anonymous Symbol] + event_groups.o(.text.vEventGroupDelete) refers to tasks.o(.text.vTaskSuspendAll) for vTaskSuspendAll + event_groups.o(.text.vEventGroupDelete) refers to tasks.o(.text.vTaskRemoveFromUnorderedEventList) for vTaskRemoveFromUnorderedEventList + event_groups.o(.text.vEventGroupDelete) refers to tasks.o(.text.xTaskResumeAll) for xTaskResumeAll + event_groups.o(.text.vEventGroupDelete) refers to heap_4.o(.text.vPortFree) for vPortFree + event_groups.o(.ARM.exidx.text.vEventGroupDelete) refers to event_groups.o(.text.vEventGroupDelete) for [Anonymous Symbol] + event_groups.o(.text.vEventGroupSetBitsCallback) refers to event_groups.o(.text.xEventGroupSetBits) for xEventGroupSetBits + event_groups.o(.ARM.exidx.text.vEventGroupSetBitsCallback) refers to event_groups.o(.text.vEventGroupSetBitsCallback) for [Anonymous Symbol] + event_groups.o(.text.xEventGroupSetBitsFromISR) refers to event_groups.o(.text.vEventGroupSetBitsCallback) for vEventGroupSetBitsCallback + event_groups.o(.text.xEventGroupSetBitsFromISR) refers to timers.o(.text.xTimerPendFunctionCallFromISR) for xTimerPendFunctionCallFromISR + event_groups.o(.ARM.exidx.text.xEventGroupSetBitsFromISR) refers to event_groups.o(.text.xEventGroupSetBitsFromISR) for [Anonymous Symbol] + event_groups.o(.ARM.exidx.text.uxEventGroupGetNumber) refers to event_groups.o(.text.uxEventGroupGetNumber) for [Anonymous Symbol] + event_groups.o(.ARM.exidx.text.vEventGroupSetNumber) refers to event_groups.o(.text.vEventGroupSetNumber) for [Anonymous Symbol] + list.o(.ARM.exidx.text.vListInitialise) refers to list.o(.text.vListInitialise) for [Anonymous Symbol] + list.o(.ARM.exidx.text.vListInitialiseItem) refers to list.o(.text.vListInitialiseItem) for [Anonymous Symbol] + list.o(.ARM.exidx.text.vListInsertEnd) refers to list.o(.text.vListInsertEnd) for [Anonymous Symbol] + list.o(.ARM.exidx.text.vListInsert) refers to list.o(.text.vListInsert) for [Anonymous Symbol] + list.o(.ARM.exidx.text.uxListRemove) refers to list.o(.text.uxListRemove) for [Anonymous Symbol] + queue.o(.text.xQueueGenericReset) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + queue.o(.text.xQueueGenericReset) refers to list.o(.text.vListInitialise) for vListInitialise + queue.o(.text.xQueueGenericReset) refers to tasks.o(.text.xTaskRemoveFromEventList) for xTaskRemoveFromEventList + queue.o(.text.xQueueGenericReset) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + queue.o(.ARM.exidx.text.xQueueGenericReset) refers to queue.o(.text.xQueueGenericReset) for [Anonymous Symbol] + queue.o(.text.xQueueGenericCreateStatic) refers to queue.o(.text.prvInitialiseNewQueue) for prvInitialiseNewQueue + queue.o(.ARM.exidx.text.xQueueGenericCreateStatic) refers to queue.o(.text.xQueueGenericCreateStatic) for [Anonymous Symbol] + queue.o(.text.prvInitialiseNewQueue) refers to queue.o(.text.xQueueGenericReset) for xQueueGenericReset + queue.o(.ARM.exidx.text.prvInitialiseNewQueue) refers to queue.o(.text.prvInitialiseNewQueue) for [Anonymous Symbol] + queue.o(.text.xQueueGenericCreate) refers to heap_4.o(.text.pvPortMalloc) for pvPortMalloc + queue.o(.text.xQueueGenericCreate) refers to queue.o(.text.prvInitialiseNewQueue) for prvInitialiseNewQueue + queue.o(.ARM.exidx.text.xQueueGenericCreate) refers to queue.o(.text.xQueueGenericCreate) for [Anonymous Symbol] + queue.o(.text.xQueueCreateMutex) refers to queue.o(.text.xQueueGenericCreate) for xQueueGenericCreate + queue.o(.text.xQueueCreateMutex) refers to queue.o(.text.prvInitialiseMutex) for prvInitialiseMutex + queue.o(.ARM.exidx.text.xQueueCreateMutex) refers to queue.o(.text.xQueueCreateMutex) for [Anonymous Symbol] + queue.o(.text.prvInitialiseMutex) refers to queue.o(.text.xQueueGenericSend) for xQueueGenericSend + queue.o(.ARM.exidx.text.prvInitialiseMutex) refers to queue.o(.text.prvInitialiseMutex) for [Anonymous Symbol] + queue.o(.text.xQueueCreateMutexStatic) refers to queue.o(.text.xQueueGenericCreateStatic) for xQueueGenericCreateStatic + queue.o(.text.xQueueCreateMutexStatic) refers to queue.o(.text.prvInitialiseMutex) for prvInitialiseMutex + queue.o(.ARM.exidx.text.xQueueCreateMutexStatic) refers to queue.o(.text.xQueueCreateMutexStatic) for [Anonymous Symbol] + queue.o(.text.xQueueGetMutexHolder) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + queue.o(.text.xQueueGetMutexHolder) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + queue.o(.ARM.exidx.text.xQueueGetMutexHolder) refers to queue.o(.text.xQueueGetMutexHolder) for [Anonymous Symbol] + queue.o(.ARM.exidx.text.xQueueGetMutexHolderFromISR) refers to queue.o(.text.xQueueGetMutexHolderFromISR) for [Anonymous Symbol] + queue.o(.text.xQueueGiveMutexRecursive) refers to tasks.o(.text.xTaskGetCurrentTaskHandle) for xTaskGetCurrentTaskHandle + queue.o(.text.xQueueGiveMutexRecursive) refers to queue.o(.text.xQueueGenericSend) for xQueueGenericSend + queue.o(.ARM.exidx.text.xQueueGiveMutexRecursive) refers to queue.o(.text.xQueueGiveMutexRecursive) for [Anonymous Symbol] + queue.o(.text.xQueueGenericSend) refers to tasks.o(.text.xTaskGetSchedulerState) for xTaskGetSchedulerState + queue.o(.text.xQueueGenericSend) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + queue.o(.text.xQueueGenericSend) refers to tasks.o(.text.vTaskInternalSetTimeOutState) for vTaskInternalSetTimeOutState + queue.o(.text.xQueueGenericSend) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + queue.o(.text.xQueueGenericSend) refers to tasks.o(.text.vTaskSuspendAll) for vTaskSuspendAll + queue.o(.text.xQueueGenericSend) refers to tasks.o(.text.xTaskCheckForTimeOut) for xTaskCheckForTimeOut + queue.o(.text.xQueueGenericSend) refers to queue.o(.text.prvIsQueueFull) for prvIsQueueFull + queue.o(.text.xQueueGenericSend) refers to tasks.o(.text.vTaskPlaceOnEventList) for vTaskPlaceOnEventList + queue.o(.text.xQueueGenericSend) refers to queue.o(.text.prvUnlockQueue) for prvUnlockQueue + queue.o(.text.xQueueGenericSend) refers to tasks.o(.text.xTaskResumeAll) for xTaskResumeAll + queue.o(.text.xQueueGenericSend) refers to queue.o(.text.prvCopyDataToQueue) for prvCopyDataToQueue + queue.o(.text.xQueueGenericSend) refers to tasks.o(.text.xTaskRemoveFromEventList) for xTaskRemoveFromEventList + queue.o(.ARM.exidx.text.xQueueGenericSend) refers to queue.o(.text.xQueueGenericSend) for [Anonymous Symbol] + queue.o(.text.xQueueTakeMutexRecursive) refers to tasks.o(.text.xTaskGetCurrentTaskHandle) for xTaskGetCurrentTaskHandle + queue.o(.text.xQueueTakeMutexRecursive) refers to queue.o(.text.xQueueSemaphoreTake) for xQueueSemaphoreTake + queue.o(.ARM.exidx.text.xQueueTakeMutexRecursive) refers to queue.o(.text.xQueueTakeMutexRecursive) for [Anonymous Symbol] + queue.o(.text.xQueueSemaphoreTake) refers to tasks.o(.text.xTaskGetSchedulerState) for xTaskGetSchedulerState + queue.o(.text.xQueueSemaphoreTake) refers to queue.o(.text.prvUnlockQueue) for prvUnlockQueue + queue.o(.text.xQueueSemaphoreTake) refers to tasks.o(.text.xTaskResumeAll) for xTaskResumeAll + queue.o(.text.xQueueSemaphoreTake) refers to queue.o(.text.prvIsQueueEmpty) for prvIsQueueEmpty + queue.o(.text.xQueueSemaphoreTake) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + queue.o(.text.xQueueSemaphoreTake) refers to tasks.o(.text.pvTaskIncrementMutexHeldCount) for pvTaskIncrementMutexHeldCount + queue.o(.text.xQueueSemaphoreTake) refers to tasks.o(.text.xTaskRemoveFromEventList) for xTaskRemoveFromEventList + queue.o(.text.xQueueSemaphoreTake) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + queue.o(.text.xQueueSemaphoreTake) refers to tasks.o(.text.vTaskInternalSetTimeOutState) for vTaskInternalSetTimeOutState + queue.o(.text.xQueueSemaphoreTake) refers to tasks.o(.text.vTaskSuspendAll) for vTaskSuspendAll + queue.o(.text.xQueueSemaphoreTake) refers to tasks.o(.text.xTaskCheckForTimeOut) for xTaskCheckForTimeOut + queue.o(.text.xQueueSemaphoreTake) refers to tasks.o(.text.xTaskPriorityInherit) for xTaskPriorityInherit + queue.o(.text.xQueueSemaphoreTake) refers to tasks.o(.text.vTaskPlaceOnEventList) for vTaskPlaceOnEventList + queue.o(.text.xQueueSemaphoreTake) refers to queue.o(.text.prvGetDisinheritPriorityAfterTimeout) for prvGetDisinheritPriorityAfterTimeout + queue.o(.text.xQueueSemaphoreTake) refers to tasks.o(.text.vTaskPriorityDisinheritAfterTimeout) for vTaskPriorityDisinheritAfterTimeout + queue.o(.ARM.exidx.text.xQueueSemaphoreTake) refers to queue.o(.text.xQueueSemaphoreTake) for [Anonymous Symbol] + queue.o(.text.xQueueCreateCountingSemaphoreStatic) refers to queue.o(.text.xQueueGenericCreateStatic) for xQueueGenericCreateStatic + queue.o(.ARM.exidx.text.xQueueCreateCountingSemaphoreStatic) refers to queue.o(.text.xQueueCreateCountingSemaphoreStatic) for [Anonymous Symbol] + queue.o(.text.xQueueCreateCountingSemaphore) refers to queue.o(.text.xQueueGenericCreate) for xQueueGenericCreate + queue.o(.ARM.exidx.text.xQueueCreateCountingSemaphore) refers to queue.o(.text.xQueueCreateCountingSemaphore) for [Anonymous Symbol] + queue.o(.text.prvCopyDataToQueue) refers to rt_memcpy_v6.o(.text) for __aeabi_memcpy + queue.o(.text.prvCopyDataToQueue) refers to tasks.o(.text.xTaskPriorityDisinherit) for xTaskPriorityDisinherit + queue.o(.ARM.exidx.text.prvCopyDataToQueue) refers to queue.o(.text.prvCopyDataToQueue) for [Anonymous Symbol] + queue.o(.text.prvIsQueueFull) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + queue.o(.text.prvIsQueueFull) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + queue.o(.ARM.exidx.text.prvIsQueueFull) refers to queue.o(.text.prvIsQueueFull) for [Anonymous Symbol] + queue.o(.text.prvUnlockQueue) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + queue.o(.text.prvUnlockQueue) refers to tasks.o(.text.xTaskRemoveFromEventList) for xTaskRemoveFromEventList + queue.o(.text.prvUnlockQueue) refers to tasks.o(.text.vTaskMissedYield) for vTaskMissedYield + queue.o(.text.prvUnlockQueue) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + queue.o(.ARM.exidx.text.prvUnlockQueue) refers to queue.o(.text.prvUnlockQueue) for [Anonymous Symbol] + queue.o(.text.xQueueGenericSendFromISR) refers to port.o(.text.vPortValidateInterruptPriority) for vPortValidateInterruptPriority + queue.o(.text.xQueueGenericSendFromISR) refers to queue.o(.text.prvCopyDataToQueue) for prvCopyDataToQueue + queue.o(.text.xQueueGenericSendFromISR) refers to tasks.o(.text.xTaskRemoveFromEventList) for xTaskRemoveFromEventList + queue.o(.ARM.exidx.text.xQueueGenericSendFromISR) refers to queue.o(.text.xQueueGenericSendFromISR) for [Anonymous Symbol] + queue.o(.text.xQueueGiveFromISR) refers to port.o(.text.vPortValidateInterruptPriority) for vPortValidateInterruptPriority + queue.o(.text.xQueueGiveFromISR) refers to tasks.o(.text.xTaskRemoveFromEventList) for xTaskRemoveFromEventList + queue.o(.ARM.exidx.text.xQueueGiveFromISR) refers to queue.o(.text.xQueueGiveFromISR) for [Anonymous Symbol] + queue.o(.text.xQueueReceive) refers to tasks.o(.text.xTaskGetSchedulerState) for xTaskGetSchedulerState + queue.o(.text.xQueueReceive) refers to queue.o(.text.prvUnlockQueue) for prvUnlockQueue + queue.o(.text.xQueueReceive) refers to tasks.o(.text.xTaskResumeAll) for xTaskResumeAll + queue.o(.text.xQueueReceive) refers to queue.o(.text.prvIsQueueEmpty) for prvIsQueueEmpty + queue.o(.text.xQueueReceive) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + queue.o(.text.xQueueReceive) refers to queue.o(.text.prvCopyDataFromQueue) for prvCopyDataFromQueue + queue.o(.text.xQueueReceive) refers to tasks.o(.text.xTaskRemoveFromEventList) for xTaskRemoveFromEventList + queue.o(.text.xQueueReceive) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + queue.o(.text.xQueueReceive) refers to tasks.o(.text.vTaskInternalSetTimeOutState) for vTaskInternalSetTimeOutState + queue.o(.text.xQueueReceive) refers to tasks.o(.text.vTaskSuspendAll) for vTaskSuspendAll + queue.o(.text.xQueueReceive) refers to tasks.o(.text.xTaskCheckForTimeOut) for xTaskCheckForTimeOut + queue.o(.text.xQueueReceive) refers to tasks.o(.text.vTaskPlaceOnEventList) for vTaskPlaceOnEventList + queue.o(.ARM.exidx.text.xQueueReceive) refers to queue.o(.text.xQueueReceive) for [Anonymous Symbol] + queue.o(.text.prvCopyDataFromQueue) refers to rt_memcpy_v6.o(.text) for __aeabi_memcpy + queue.o(.ARM.exidx.text.prvCopyDataFromQueue) refers to queue.o(.text.prvCopyDataFromQueue) for [Anonymous Symbol] + queue.o(.text.prvIsQueueEmpty) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + queue.o(.text.prvIsQueueEmpty) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + queue.o(.ARM.exidx.text.prvIsQueueEmpty) refers to queue.o(.text.prvIsQueueEmpty) for [Anonymous Symbol] + queue.o(.ARM.exidx.text.prvGetDisinheritPriorityAfterTimeout) refers to queue.o(.text.prvGetDisinheritPriorityAfterTimeout) for [Anonymous Symbol] + queue.o(.text.xQueuePeek) refers to tasks.o(.text.xTaskGetSchedulerState) for xTaskGetSchedulerState + queue.o(.text.xQueuePeek) refers to queue.o(.text.prvUnlockQueue) for prvUnlockQueue + queue.o(.text.xQueuePeek) refers to tasks.o(.text.xTaskResumeAll) for xTaskResumeAll + queue.o(.text.xQueuePeek) refers to queue.o(.text.prvIsQueueEmpty) for prvIsQueueEmpty + queue.o(.text.xQueuePeek) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + queue.o(.text.xQueuePeek) refers to queue.o(.text.prvCopyDataFromQueue) for prvCopyDataFromQueue + queue.o(.text.xQueuePeek) refers to tasks.o(.text.xTaskRemoveFromEventList) for xTaskRemoveFromEventList + queue.o(.text.xQueuePeek) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + queue.o(.text.xQueuePeek) refers to tasks.o(.text.vTaskInternalSetTimeOutState) for vTaskInternalSetTimeOutState + queue.o(.text.xQueuePeek) refers to tasks.o(.text.vTaskSuspendAll) for vTaskSuspendAll + queue.o(.text.xQueuePeek) refers to tasks.o(.text.xTaskCheckForTimeOut) for xTaskCheckForTimeOut + queue.o(.text.xQueuePeek) refers to tasks.o(.text.vTaskPlaceOnEventList) for vTaskPlaceOnEventList + queue.o(.ARM.exidx.text.xQueuePeek) refers to queue.o(.text.xQueuePeek) for [Anonymous Symbol] + queue.o(.text.xQueueReceiveFromISR) refers to port.o(.text.vPortValidateInterruptPriority) for vPortValidateInterruptPriority + queue.o(.text.xQueueReceiveFromISR) refers to queue.o(.text.prvCopyDataFromQueue) for prvCopyDataFromQueue + queue.o(.text.xQueueReceiveFromISR) refers to tasks.o(.text.xTaskRemoveFromEventList) for xTaskRemoveFromEventList + queue.o(.ARM.exidx.text.xQueueReceiveFromISR) refers to queue.o(.text.xQueueReceiveFromISR) for [Anonymous Symbol] + queue.o(.text.xQueuePeekFromISR) refers to port.o(.text.vPortValidateInterruptPriority) for vPortValidateInterruptPriority + queue.o(.text.xQueuePeekFromISR) refers to queue.o(.text.prvCopyDataFromQueue) for prvCopyDataFromQueue + queue.o(.ARM.exidx.text.xQueuePeekFromISR) refers to queue.o(.text.xQueuePeekFromISR) for [Anonymous Symbol] + queue.o(.text.uxQueueMessagesWaiting) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + queue.o(.text.uxQueueMessagesWaiting) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + queue.o(.ARM.exidx.text.uxQueueMessagesWaiting) refers to queue.o(.text.uxQueueMessagesWaiting) for [Anonymous Symbol] + queue.o(.text.uxQueueSpacesAvailable) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + queue.o(.text.uxQueueSpacesAvailable) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + queue.o(.ARM.exidx.text.uxQueueSpacesAvailable) refers to queue.o(.text.uxQueueSpacesAvailable) for [Anonymous Symbol] + queue.o(.ARM.exidx.text.uxQueueMessagesWaitingFromISR) refers to queue.o(.text.uxQueueMessagesWaitingFromISR) for [Anonymous Symbol] + queue.o(.text.vQueueDelete) refers to queue.o(.text.vQueueUnregisterQueue) for vQueueUnregisterQueue + queue.o(.text.vQueueDelete) refers to heap_4.o(.text.vPortFree) for vPortFree + queue.o(.ARM.exidx.text.vQueueDelete) refers to queue.o(.text.vQueueDelete) for [Anonymous Symbol] + queue.o(.text.vQueueUnregisterQueue) refers to queue.o(.bss.xQueueRegistry) for xQueueRegistry + queue.o(.ARM.exidx.text.vQueueUnregisterQueue) refers to queue.o(.text.vQueueUnregisterQueue) for [Anonymous Symbol] + queue.o(.ARM.exidx.text.uxQueueGetQueueNumber) refers to queue.o(.text.uxQueueGetQueueNumber) for [Anonymous Symbol] + queue.o(.ARM.exidx.text.vQueueSetQueueNumber) refers to queue.o(.text.vQueueSetQueueNumber) for [Anonymous Symbol] + queue.o(.ARM.exidx.text.ucQueueGetQueueType) refers to queue.o(.text.ucQueueGetQueueType) for [Anonymous Symbol] + queue.o(.ARM.exidx.text.xQueueIsQueueEmptyFromISR) refers to queue.o(.text.xQueueIsQueueEmptyFromISR) for [Anonymous Symbol] + queue.o(.ARM.exidx.text.xQueueIsQueueFullFromISR) refers to queue.o(.text.xQueueIsQueueFullFromISR) for [Anonymous Symbol] + queue.o(.text.vQueueAddToRegistry) refers to queue.o(.bss.xQueueRegistry) for xQueueRegistry + queue.o(.ARM.exidx.text.vQueueAddToRegistry) refers to queue.o(.text.vQueueAddToRegistry) for [Anonymous Symbol] + queue.o(.text.pcQueueGetName) refers to queue.o(.bss.xQueueRegistry) for xQueueRegistry + queue.o(.ARM.exidx.text.pcQueueGetName) refers to queue.o(.text.pcQueueGetName) for [Anonymous Symbol] + queue.o(.text.vQueueWaitForMessageRestricted) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + queue.o(.text.vQueueWaitForMessageRestricted) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + queue.o(.text.vQueueWaitForMessageRestricted) refers to tasks.o(.text.vTaskPlaceOnEventListRestricted) for vTaskPlaceOnEventListRestricted + queue.o(.text.vQueueWaitForMessageRestricted) refers to queue.o(.text.prvUnlockQueue) for prvUnlockQueue + queue.o(.ARM.exidx.text.vQueueWaitForMessageRestricted) refers to queue.o(.text.vQueueWaitForMessageRestricted) for [Anonymous Symbol] + stream_buffer.o(.text.xStreamBufferGenericCreate) refers to heap_4.o(.text.pvPortMalloc) for pvPortMalloc + stream_buffer.o(.text.xStreamBufferGenericCreate) refers to stream_buffer.o(.text.prvInitialiseNewStreamBuffer) for prvInitialiseNewStreamBuffer + stream_buffer.o(.ARM.exidx.text.xStreamBufferGenericCreate) refers to stream_buffer.o(.text.xStreamBufferGenericCreate) for [Anonymous Symbol] + stream_buffer.o(.text.prvInitialiseNewStreamBuffer) refers to aeabi_memset.o(.text) for __aeabi_memset + stream_buffer.o(.text.prvInitialiseNewStreamBuffer) refers to rt_memclr.o(.text) for __aeabi_memclr + stream_buffer.o(.ARM.exidx.text.prvInitialiseNewStreamBuffer) refers to stream_buffer.o(.text.prvInitialiseNewStreamBuffer) for [Anonymous Symbol] + stream_buffer.o(.text.xStreamBufferGenericCreateStatic) refers to stream_buffer.o(.text.prvInitialiseNewStreamBuffer) for prvInitialiseNewStreamBuffer + stream_buffer.o(.ARM.exidx.text.xStreamBufferGenericCreateStatic) refers to stream_buffer.o(.text.xStreamBufferGenericCreateStatic) for [Anonymous Symbol] + stream_buffer.o(.text.vStreamBufferDelete) refers to heap_4.o(.text.vPortFree) for vPortFree + stream_buffer.o(.text.vStreamBufferDelete) refers to rt_memclr_w.o(.text) for __aeabi_memclr4 + stream_buffer.o(.ARM.exidx.text.vStreamBufferDelete) refers to stream_buffer.o(.text.vStreamBufferDelete) for [Anonymous Symbol] + stream_buffer.o(.text.xStreamBufferReset) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + stream_buffer.o(.text.xStreamBufferReset) refers to stream_buffer.o(.text.prvInitialiseNewStreamBuffer) for prvInitialiseNewStreamBuffer + stream_buffer.o(.text.xStreamBufferReset) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + stream_buffer.o(.ARM.exidx.text.xStreamBufferReset) refers to stream_buffer.o(.text.xStreamBufferReset) for [Anonymous Symbol] + stream_buffer.o(.ARM.exidx.text.xStreamBufferSetTriggerLevel) refers to stream_buffer.o(.text.xStreamBufferSetTriggerLevel) for [Anonymous Symbol] + stream_buffer.o(.ARM.exidx.text.xStreamBufferSpacesAvailable) refers to stream_buffer.o(.text.xStreamBufferSpacesAvailable) for [Anonymous Symbol] + stream_buffer.o(.text.xStreamBufferBytesAvailable) refers to stream_buffer.o(.text.prvBytesInBuffer) for prvBytesInBuffer + stream_buffer.o(.ARM.exidx.text.xStreamBufferBytesAvailable) refers to stream_buffer.o(.text.xStreamBufferBytesAvailable) for [Anonymous Symbol] + stream_buffer.o(.ARM.exidx.text.prvBytesInBuffer) refers to stream_buffer.o(.text.prvBytesInBuffer) for [Anonymous Symbol] + stream_buffer.o(.text.xStreamBufferSend) refers to tasks.o(.text.vTaskSetTimeOutState) for vTaskSetTimeOutState + stream_buffer.o(.text.xStreamBufferSend) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + stream_buffer.o(.text.xStreamBufferSend) refers to stream_buffer.o(.text.xStreamBufferSpacesAvailable) for xStreamBufferSpacesAvailable + stream_buffer.o(.text.xStreamBufferSend) refers to tasks.o(.text.xTaskNotifyStateClear) for xTaskNotifyStateClear + stream_buffer.o(.text.xStreamBufferSend) refers to tasks.o(.text.xTaskGetCurrentTaskHandle) for xTaskGetCurrentTaskHandle + stream_buffer.o(.text.xStreamBufferSend) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + stream_buffer.o(.text.xStreamBufferSend) refers to tasks.o(.text.xTaskNotifyWait) for xTaskNotifyWait + stream_buffer.o(.text.xStreamBufferSend) refers to tasks.o(.text.xTaskCheckForTimeOut) for xTaskCheckForTimeOut + stream_buffer.o(.text.xStreamBufferSend) refers to stream_buffer.o(.text.prvWriteMessageToBuffer) for prvWriteMessageToBuffer + stream_buffer.o(.text.xStreamBufferSend) refers to stream_buffer.o(.text.prvBytesInBuffer) for prvBytesInBuffer + stream_buffer.o(.text.xStreamBufferSend) refers to tasks.o(.text.vTaskSuspendAll) for vTaskSuspendAll + stream_buffer.o(.text.xStreamBufferSend) refers to tasks.o(.text.xTaskGenericNotify) for xTaskGenericNotify + stream_buffer.o(.text.xStreamBufferSend) refers to tasks.o(.text.xTaskResumeAll) for xTaskResumeAll + stream_buffer.o(.ARM.exidx.text.xStreamBufferSend) refers to stream_buffer.o(.text.xStreamBufferSend) for [Anonymous Symbol] + stream_buffer.o(.text.prvWriteMessageToBuffer) refers to stream_buffer.o(.text.prvWriteBytesToBuffer) for prvWriteBytesToBuffer + stream_buffer.o(.ARM.exidx.text.prvWriteMessageToBuffer) refers to stream_buffer.o(.text.prvWriteMessageToBuffer) for [Anonymous Symbol] + stream_buffer.o(.text.xStreamBufferSendFromISR) refers to stream_buffer.o(.text.xStreamBufferSpacesAvailable) for xStreamBufferSpacesAvailable + stream_buffer.o(.text.xStreamBufferSendFromISR) refers to stream_buffer.o(.text.prvWriteMessageToBuffer) for prvWriteMessageToBuffer + stream_buffer.o(.text.xStreamBufferSendFromISR) refers to stream_buffer.o(.text.prvBytesInBuffer) for prvBytesInBuffer + stream_buffer.o(.text.xStreamBufferSendFromISR) refers to tasks.o(.text.xTaskGenericNotifyFromISR) for xTaskGenericNotifyFromISR + stream_buffer.o(.ARM.exidx.text.xStreamBufferSendFromISR) refers to stream_buffer.o(.text.xStreamBufferSendFromISR) for [Anonymous Symbol] + stream_buffer.o(.text.xStreamBufferReceive) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + stream_buffer.o(.text.xStreamBufferReceive) refers to stream_buffer.o(.text.prvBytesInBuffer) for prvBytesInBuffer + stream_buffer.o(.text.xStreamBufferReceive) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + stream_buffer.o(.text.xStreamBufferReceive) refers to tasks.o(.text.xTaskNotifyStateClear) for xTaskNotifyStateClear + stream_buffer.o(.text.xStreamBufferReceive) refers to tasks.o(.text.xTaskGetCurrentTaskHandle) for xTaskGetCurrentTaskHandle + stream_buffer.o(.text.xStreamBufferReceive) refers to tasks.o(.text.xTaskNotifyWait) for xTaskNotifyWait + stream_buffer.o(.text.xStreamBufferReceive) refers to stream_buffer.o(.text.prvReadMessageFromBuffer) for prvReadMessageFromBuffer + stream_buffer.o(.text.xStreamBufferReceive) refers to tasks.o(.text.vTaskSuspendAll) for vTaskSuspendAll + stream_buffer.o(.text.xStreamBufferReceive) refers to tasks.o(.text.xTaskGenericNotify) for xTaskGenericNotify + stream_buffer.o(.text.xStreamBufferReceive) refers to tasks.o(.text.xTaskResumeAll) for xTaskResumeAll + stream_buffer.o(.ARM.exidx.text.xStreamBufferReceive) refers to stream_buffer.o(.text.xStreamBufferReceive) for [Anonymous Symbol] + stream_buffer.o(.text.prvReadMessageFromBuffer) refers to stream_buffer.o(.text.prvReadBytesFromBuffer) for prvReadBytesFromBuffer + stream_buffer.o(.ARM.exidx.text.prvReadMessageFromBuffer) refers to stream_buffer.o(.text.prvReadMessageFromBuffer) for [Anonymous Symbol] + stream_buffer.o(.text.xStreamBufferNextMessageLengthBytes) refers to stream_buffer.o(.text.prvBytesInBuffer) for prvBytesInBuffer + stream_buffer.o(.text.xStreamBufferNextMessageLengthBytes) refers to stream_buffer.o(.text.prvReadBytesFromBuffer) for prvReadBytesFromBuffer + stream_buffer.o(.ARM.exidx.text.xStreamBufferNextMessageLengthBytes) refers to stream_buffer.o(.text.xStreamBufferNextMessageLengthBytes) for [Anonymous Symbol] + stream_buffer.o(.text.prvReadBytesFromBuffer) refers to rt_memcpy_v6.o(.text) for __aeabi_memcpy + stream_buffer.o(.ARM.exidx.text.prvReadBytesFromBuffer) refers to stream_buffer.o(.text.prvReadBytesFromBuffer) for [Anonymous Symbol] + stream_buffer.o(.text.xStreamBufferReceiveFromISR) refers to stream_buffer.o(.text.prvBytesInBuffer) for prvBytesInBuffer + stream_buffer.o(.text.xStreamBufferReceiveFromISR) refers to stream_buffer.o(.text.prvReadMessageFromBuffer) for prvReadMessageFromBuffer + stream_buffer.o(.text.xStreamBufferReceiveFromISR) refers to tasks.o(.text.xTaskGenericNotifyFromISR) for xTaskGenericNotifyFromISR + stream_buffer.o(.ARM.exidx.text.xStreamBufferReceiveFromISR) refers to stream_buffer.o(.text.xStreamBufferReceiveFromISR) for [Anonymous Symbol] + stream_buffer.o(.ARM.exidx.text.xStreamBufferIsEmpty) refers to stream_buffer.o(.text.xStreamBufferIsEmpty) for [Anonymous Symbol] + stream_buffer.o(.text.xStreamBufferIsFull) refers to stream_buffer.o(.text.xStreamBufferSpacesAvailable) for xStreamBufferSpacesAvailable + stream_buffer.o(.ARM.exidx.text.xStreamBufferIsFull) refers to stream_buffer.o(.text.xStreamBufferIsFull) for [Anonymous Symbol] + stream_buffer.o(.text.xStreamBufferSendCompletedFromISR) refers to tasks.o(.text.xTaskGenericNotifyFromISR) for xTaskGenericNotifyFromISR + stream_buffer.o(.ARM.exidx.text.xStreamBufferSendCompletedFromISR) refers to stream_buffer.o(.text.xStreamBufferSendCompletedFromISR) for [Anonymous Symbol] + stream_buffer.o(.text.xStreamBufferReceiveCompletedFromISR) refers to tasks.o(.text.xTaskGenericNotifyFromISR) for xTaskGenericNotifyFromISR + stream_buffer.o(.ARM.exidx.text.xStreamBufferReceiveCompletedFromISR) refers to stream_buffer.o(.text.xStreamBufferReceiveCompletedFromISR) for [Anonymous Symbol] + stream_buffer.o(.ARM.exidx.text.uxStreamBufferGetStreamBufferNumber) refers to stream_buffer.o(.text.uxStreamBufferGetStreamBufferNumber) for [Anonymous Symbol] + stream_buffer.o(.ARM.exidx.text.vStreamBufferSetStreamBufferNumber) refers to stream_buffer.o(.text.vStreamBufferSetStreamBufferNumber) for [Anonymous Symbol] + stream_buffer.o(.ARM.exidx.text.ucStreamBufferGetStreamBufferType) refers to stream_buffer.o(.text.ucStreamBufferGetStreamBufferType) for [Anonymous Symbol] + stream_buffer.o(.text.prvWriteBytesToBuffer) refers to rt_memcpy_v6.o(.text) for __aeabi_memcpy + stream_buffer.o(.ARM.exidx.text.prvWriteBytesToBuffer) refers to stream_buffer.o(.text.prvWriteBytesToBuffer) for [Anonymous Symbol] + tasks.o(.text.xTaskCreateStatic) refers to tasks.o(.text.prvInitialiseNewTask) for prvInitialiseNewTask + tasks.o(.text.xTaskCreateStatic) refers to tasks.o(.text.prvAddNewTaskToReadyList) for prvAddNewTaskToReadyList + tasks.o(.ARM.exidx.text.xTaskCreateStatic) refers to tasks.o(.text.xTaskCreateStatic) for [Anonymous Symbol] + tasks.o(.text.prvInitialiseNewTask) refers to aeabi_memset4.o(.text) for __aeabi_memset4 + tasks.o(.text.prvInitialiseNewTask) refers to list.o(.text.vListInitialiseItem) for vListInitialiseItem + tasks.o(.text.prvInitialiseNewTask) refers to port.o(.text.pxPortInitialiseStack) for pxPortInitialiseStack + tasks.o(.ARM.exidx.text.prvInitialiseNewTask) refers to tasks.o(.text.prvInitialiseNewTask) for [Anonymous Symbol] + tasks.o(.text.prvAddNewTaskToReadyList) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + tasks.o(.text.prvAddNewTaskToReadyList) refers to tasks.o(.bss.uxCurrentNumberOfTasks) for uxCurrentNumberOfTasks + tasks.o(.text.prvAddNewTaskToReadyList) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.prvAddNewTaskToReadyList) refers to tasks.o(.bss.xSchedulerRunning) for xSchedulerRunning + tasks.o(.text.prvAddNewTaskToReadyList) refers to tasks.o(.text.prvInitialiseTaskLists) for prvInitialiseTaskLists + tasks.o(.text.prvAddNewTaskToReadyList) refers to tasks.o(.bss.uxTaskNumber) for uxTaskNumber + tasks.o(.text.prvAddNewTaskToReadyList) refers to tasks.o(.bss.uxTopReadyPriority) for uxTopReadyPriority + tasks.o(.text.prvAddNewTaskToReadyList) refers to tasks.o(.bss.pxReadyTasksLists) for pxReadyTasksLists + tasks.o(.text.prvAddNewTaskToReadyList) refers to list.o(.text.vListInsertEnd) for vListInsertEnd + tasks.o(.text.prvAddNewTaskToReadyList) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + tasks.o(.ARM.exidx.text.prvAddNewTaskToReadyList) refers to tasks.o(.text.prvAddNewTaskToReadyList) for [Anonymous Symbol] + tasks.o(.text.xTaskCreate) refers to heap_4.o(.text.pvPortMalloc) for pvPortMalloc + tasks.o(.text.xTaskCreate) refers to heap_4.o(.text.vPortFree) for vPortFree + tasks.o(.text.xTaskCreate) refers to tasks.o(.text.prvInitialiseNewTask) for prvInitialiseNewTask + tasks.o(.text.xTaskCreate) refers to tasks.o(.text.prvAddNewTaskToReadyList) for prvAddNewTaskToReadyList + tasks.o(.ARM.exidx.text.xTaskCreate) refers to tasks.o(.text.xTaskCreate) for [Anonymous Symbol] + tasks.o(.text.vTaskDelete) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + tasks.o(.text.vTaskDelete) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.vTaskDelete) refers to list.o(.text.uxListRemove) for uxListRemove + tasks.o(.text.vTaskDelete) refers to tasks.o(.bss.uxTaskNumber) for uxTaskNumber + tasks.o(.text.vTaskDelete) refers to tasks.o(.bss.uxCurrentNumberOfTasks) for uxCurrentNumberOfTasks + tasks.o(.text.vTaskDelete) refers to tasks.o(.text.prvDeleteTCB) for prvDeleteTCB + tasks.o(.text.vTaskDelete) refers to tasks.o(.text.prvResetNextTaskUnblockTime) for prvResetNextTaskUnblockTime + tasks.o(.text.vTaskDelete) refers to tasks.o(.bss.xTasksWaitingTermination) for xTasksWaitingTermination + tasks.o(.text.vTaskDelete) refers to list.o(.text.vListInsertEnd) for vListInsertEnd + tasks.o(.text.vTaskDelete) refers to tasks.o(.bss.uxDeletedTasksWaitingCleanUp) for uxDeletedTasksWaitingCleanUp + tasks.o(.text.vTaskDelete) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + tasks.o(.text.vTaskDelete) refers to tasks.o(.bss.xSchedulerRunning) for xSchedulerRunning + tasks.o(.text.vTaskDelete) refers to tasks.o(.bss.uxSchedulerSuspended) for uxSchedulerSuspended + tasks.o(.ARM.exidx.text.vTaskDelete) refers to tasks.o(.text.vTaskDelete) for [Anonymous Symbol] + tasks.o(.text.prvDeleteTCB) refers to heap_4.o(.text.vPortFree) for vPortFree + tasks.o(.ARM.exidx.text.prvDeleteTCB) refers to tasks.o(.text.prvDeleteTCB) for [Anonymous Symbol] + tasks.o(.text.prvResetNextTaskUnblockTime) refers to tasks.o(.bss.pxDelayedTaskList) for pxDelayedTaskList + tasks.o(.text.prvResetNextTaskUnblockTime) refers to tasks.o(.bss.xNextTaskUnblockTime) for xNextTaskUnblockTime + tasks.o(.ARM.exidx.text.prvResetNextTaskUnblockTime) refers to tasks.o(.text.prvResetNextTaskUnblockTime) for [Anonymous Symbol] + tasks.o(.text.vTaskDelayUntil) refers to tasks.o(.bss.uxSchedulerSuspended) for uxSchedulerSuspended + tasks.o(.text.vTaskDelayUntil) refers to tasks.o(.text.vTaskSuspendAll) for vTaskSuspendAll + tasks.o(.text.vTaskDelayUntil) refers to tasks.o(.bss.xTickCount) for xTickCount + tasks.o(.text.vTaskDelayUntil) refers to tasks.o(.text.prvAddCurrentTaskToDelayedList) for prvAddCurrentTaskToDelayedList + tasks.o(.text.vTaskDelayUntil) refers to tasks.o(.text.xTaskResumeAll) for xTaskResumeAll + tasks.o(.ARM.exidx.text.vTaskDelayUntil) refers to tasks.o(.text.vTaskDelayUntil) for [Anonymous Symbol] + tasks.o(.text.vTaskSuspendAll) refers to tasks.o(.bss.uxSchedulerSuspended) for uxSchedulerSuspended + tasks.o(.ARM.exidx.text.vTaskSuspendAll) refers to tasks.o(.text.vTaskSuspendAll) for [Anonymous Symbol] + tasks.o(.text.prvAddCurrentTaskToDelayedList) refers to tasks.o(.bss.xTickCount) for xTickCount + tasks.o(.text.prvAddCurrentTaskToDelayedList) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.prvAddCurrentTaskToDelayedList) refers to list.o(.text.uxListRemove) for uxListRemove + tasks.o(.text.prvAddCurrentTaskToDelayedList) refers to tasks.o(.bss.xSuspendedTaskList) for xSuspendedTaskList + tasks.o(.text.prvAddCurrentTaskToDelayedList) refers to list.o(.text.vListInsertEnd) for vListInsertEnd + tasks.o(.text.prvAddCurrentTaskToDelayedList) refers to tasks.o(.bss.pxOverflowDelayedTaskList) for pxOverflowDelayedTaskList + tasks.o(.text.prvAddCurrentTaskToDelayedList) refers to list.o(.text.vListInsert) for vListInsert + tasks.o(.text.prvAddCurrentTaskToDelayedList) refers to tasks.o(.bss.pxDelayedTaskList) for pxDelayedTaskList + tasks.o(.text.prvAddCurrentTaskToDelayedList) refers to tasks.o(.bss.xNextTaskUnblockTime) for xNextTaskUnblockTime + tasks.o(.ARM.exidx.text.prvAddCurrentTaskToDelayedList) refers to tasks.o(.text.prvAddCurrentTaskToDelayedList) for [Anonymous Symbol] + tasks.o(.text.xTaskResumeAll) refers to tasks.o(.bss.uxSchedulerSuspended) for uxSchedulerSuspended + tasks.o(.text.xTaskResumeAll) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + tasks.o(.text.xTaskResumeAll) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + tasks.o(.text.xTaskResumeAll) refers to tasks.o(.bss.uxCurrentNumberOfTasks) for uxCurrentNumberOfTasks + tasks.o(.text.xTaskResumeAll) refers to tasks.o(.bss.xPendingReadyList) for xPendingReadyList + tasks.o(.text.xTaskResumeAll) refers to tasks.o(.bss.xYieldPending) for xYieldPending + tasks.o(.text.xTaskResumeAll) refers to tasks.o(.bss.uxTopReadyPriority) for uxTopReadyPriority + tasks.o(.text.xTaskResumeAll) refers to tasks.o(.bss.pxReadyTasksLists) for pxReadyTasksLists + tasks.o(.text.xTaskResumeAll) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.xTaskResumeAll) refers to list.o(.text.uxListRemove) for uxListRemove + tasks.o(.text.xTaskResumeAll) refers to list.o(.text.vListInsertEnd) for vListInsertEnd + tasks.o(.text.xTaskResumeAll) refers to tasks.o(.text.prvResetNextTaskUnblockTime) for prvResetNextTaskUnblockTime + tasks.o(.text.xTaskResumeAll) refers to tasks.o(.bss.xPendedTicks) for xPendedTicks + tasks.o(.text.xTaskResumeAll) refers to tasks.o(.text.xTaskIncrementTick) for xTaskIncrementTick + tasks.o(.ARM.exidx.text.xTaskResumeAll) refers to tasks.o(.text.xTaskResumeAll) for [Anonymous Symbol] + tasks.o(.text.vTaskDelay) refers to tasks.o(.bss.uxSchedulerSuspended) for uxSchedulerSuspended + tasks.o(.text.vTaskDelay) refers to tasks.o(.text.vTaskSuspendAll) for vTaskSuspendAll + tasks.o(.text.vTaskDelay) refers to tasks.o(.text.prvAddCurrentTaskToDelayedList) for prvAddCurrentTaskToDelayedList + tasks.o(.text.vTaskDelay) refers to tasks.o(.text.xTaskResumeAll) for xTaskResumeAll + tasks.o(.ARM.exidx.text.vTaskDelay) refers to tasks.o(.text.vTaskDelay) for [Anonymous Symbol] + tasks.o(.text.eTaskGetState) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.eTaskGetState) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + tasks.o(.text.eTaskGetState) refers to tasks.o(.bss.pxDelayedTaskList) for pxDelayedTaskList + tasks.o(.text.eTaskGetState) refers to tasks.o(.bss.pxOverflowDelayedTaskList) for pxOverflowDelayedTaskList + tasks.o(.text.eTaskGetState) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + tasks.o(.text.eTaskGetState) refers to tasks.o(.bss.xSuspendedTaskList) for xSuspendedTaskList + tasks.o(.text.eTaskGetState) refers to tasks.o(.bss.xTasksWaitingTermination) for xTasksWaitingTermination + tasks.o(.ARM.exidx.text.eTaskGetState) refers to tasks.o(.text.eTaskGetState) for [Anonymous Symbol] + tasks.o(.text.uxTaskPriorityGet) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + tasks.o(.text.uxTaskPriorityGet) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.uxTaskPriorityGet) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + tasks.o(.ARM.exidx.text.uxTaskPriorityGet) refers to tasks.o(.text.uxTaskPriorityGet) for [Anonymous Symbol] + tasks.o(.text.uxTaskPriorityGetFromISR) refers to port.o(.text.vPortValidateInterruptPriority) for vPortValidateInterruptPriority + tasks.o(.text.uxTaskPriorityGetFromISR) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.ARM.exidx.text.uxTaskPriorityGetFromISR) refers to tasks.o(.text.uxTaskPriorityGetFromISR) for [Anonymous Symbol] + tasks.o(.text.vTaskPrioritySet) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + tasks.o(.text.vTaskPrioritySet) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.vTaskPrioritySet) refers to tasks.o(.bss.pxReadyTasksLists) for pxReadyTasksLists + tasks.o(.text.vTaskPrioritySet) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + tasks.o(.text.vTaskPrioritySet) refers to list.o(.text.uxListRemove) for uxListRemove + tasks.o(.text.vTaskPrioritySet) refers to tasks.o(.bss.uxTopReadyPriority) for uxTopReadyPriority + tasks.o(.text.vTaskPrioritySet) refers to list.o(.text.vListInsertEnd) for vListInsertEnd + tasks.o(.ARM.exidx.text.vTaskPrioritySet) refers to tasks.o(.text.vTaskPrioritySet) for [Anonymous Symbol] + tasks.o(.text.vTaskSuspend) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + tasks.o(.text.vTaskSuspend) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.vTaskSuspend) refers to list.o(.text.uxListRemove) for uxListRemove + tasks.o(.text.vTaskSuspend) refers to tasks.o(.bss.xSuspendedTaskList) for xSuspendedTaskList + tasks.o(.text.vTaskSuspend) refers to list.o(.text.vListInsertEnd) for vListInsertEnd + tasks.o(.text.vTaskSuspend) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + tasks.o(.text.vTaskSuspend) refers to tasks.o(.bss.xSchedulerRunning) for xSchedulerRunning + tasks.o(.text.vTaskSuspend) refers to tasks.o(.text.prvResetNextTaskUnblockTime) for prvResetNextTaskUnblockTime + tasks.o(.text.vTaskSuspend) refers to tasks.o(.bss.uxSchedulerSuspended) for uxSchedulerSuspended + tasks.o(.text.vTaskSuspend) refers to tasks.o(.bss.uxCurrentNumberOfTasks) for uxCurrentNumberOfTasks + tasks.o(.text.vTaskSuspend) refers to tasks.o(.text.vTaskSwitchContext) for vTaskSwitchContext + tasks.o(.ARM.exidx.text.vTaskSuspend) refers to tasks.o(.text.vTaskSuspend) for [Anonymous Symbol] + tasks.o(.text.vTaskSwitchContext) refers to tasks.o(.bss.uxSchedulerSuspended) for uxSchedulerSuspended + tasks.o(.text.vTaskSwitchContext) refers to tasks.o(.bss.xYieldPending) for xYieldPending + tasks.o(.text.vTaskSwitchContext) refers to tasks.o(.bss.uxTopReadyPriority) for uxTopReadyPriority + tasks.o(.text.vTaskSwitchContext) refers to tasks.o(.bss.pxReadyTasksLists) for pxReadyTasksLists + tasks.o(.text.vTaskSwitchContext) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.ARM.exidx.text.vTaskSwitchContext) refers to tasks.o(.text.vTaskSwitchContext) for [Anonymous Symbol] + tasks.o(.text.vTaskResume) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.vTaskResume) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + tasks.o(.text.vTaskResume) refers to tasks.o(.text.prvTaskIsTaskSuspended) for prvTaskIsTaskSuspended + tasks.o(.text.vTaskResume) refers to list.o(.text.uxListRemove) for uxListRemove + tasks.o(.text.vTaskResume) refers to tasks.o(.bss.uxTopReadyPriority) for uxTopReadyPriority + tasks.o(.text.vTaskResume) refers to tasks.o(.bss.pxReadyTasksLists) for pxReadyTasksLists + tasks.o(.text.vTaskResume) refers to list.o(.text.vListInsertEnd) for vListInsertEnd + tasks.o(.text.vTaskResume) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + tasks.o(.ARM.exidx.text.vTaskResume) refers to tasks.o(.text.vTaskResume) for [Anonymous Symbol] + tasks.o(.text.prvTaskIsTaskSuspended) refers to tasks.o(.bss.xSuspendedTaskList) for xSuspendedTaskList + tasks.o(.ARM.exidx.text.prvTaskIsTaskSuspended) refers to tasks.o(.text.prvTaskIsTaskSuspended) for [Anonymous Symbol] + tasks.o(.text.xTaskResumeFromISR) refers to port.o(.text.vPortValidateInterruptPriority) for vPortValidateInterruptPriority + tasks.o(.text.xTaskResumeFromISR) refers to tasks.o(.text.prvTaskIsTaskSuspended) for prvTaskIsTaskSuspended + tasks.o(.text.xTaskResumeFromISR) refers to tasks.o(.bss.uxSchedulerSuspended) for uxSchedulerSuspended + tasks.o(.text.xTaskResumeFromISR) refers to tasks.o(.bss.xPendingReadyList) for xPendingReadyList + tasks.o(.text.xTaskResumeFromISR) refers to list.o(.text.vListInsertEnd) for vListInsertEnd + tasks.o(.text.xTaskResumeFromISR) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.xTaskResumeFromISR) refers to list.o(.text.uxListRemove) for uxListRemove + tasks.o(.text.xTaskResumeFromISR) refers to tasks.o(.bss.uxTopReadyPriority) for uxTopReadyPriority + tasks.o(.text.xTaskResumeFromISR) refers to tasks.o(.bss.pxReadyTasksLists) for pxReadyTasksLists + tasks.o(.ARM.exidx.text.xTaskResumeFromISR) refers to tasks.o(.text.xTaskResumeFromISR) for [Anonymous Symbol] + tasks.o(.text.vTaskStartScheduler) refers to cmsis_os2.o(.text.vApplicationGetIdleTaskMemory) for vApplicationGetIdleTaskMemory + tasks.o(.text.vTaskStartScheduler) refers to tasks.o(.text.prvIdleTask) for prvIdleTask + tasks.o(.text.vTaskStartScheduler) refers to tasks.o(.text.xTaskCreateStatic) for xTaskCreateStatic + tasks.o(.text.vTaskStartScheduler) refers to tasks.o(.bss.xIdleTaskHandle) for xIdleTaskHandle + tasks.o(.text.vTaskStartScheduler) refers to timers.o(.text.xTimerCreateTimerTask) for xTimerCreateTimerTask + tasks.o(.text.vTaskStartScheduler) refers to tasks.o(.bss.xNextTaskUnblockTime) for xNextTaskUnblockTime + tasks.o(.text.vTaskStartScheduler) refers to tasks.o(.bss.xSchedulerRunning) for xSchedulerRunning + tasks.o(.text.vTaskStartScheduler) refers to tasks.o(.bss.xTickCount) for xTickCount + tasks.o(.text.vTaskStartScheduler) refers to port.o(.text.xPortStartScheduler) for xPortStartScheduler + tasks.o(.ARM.exidx.text.vTaskStartScheduler) refers to tasks.o(.text.vTaskStartScheduler) for [Anonymous Symbol] + tasks.o(.text.prvIdleTask) refers to tasks.o(.bss.pxReadyTasksLists) for pxReadyTasksLists + tasks.o(.text.prvIdleTask) refers to tasks.o(.text.prvCheckTasksWaitingTermination) for prvCheckTasksWaitingTermination + tasks.o(.ARM.exidx.text.prvIdleTask) refers to tasks.o(.text.prvIdleTask) for [Anonymous Symbol] + tasks.o(.text.vTaskEndScheduler) refers to tasks.o(.bss.xSchedulerRunning) for xSchedulerRunning + tasks.o(.text.vTaskEndScheduler) refers to port.o(.text.vPortEndScheduler) for vPortEndScheduler + tasks.o(.ARM.exidx.text.vTaskEndScheduler) refers to tasks.o(.text.vTaskEndScheduler) for [Anonymous Symbol] + tasks.o(.text.xTaskIncrementTick) refers to tasks.o(.bss.uxSchedulerSuspended) for uxSchedulerSuspended + tasks.o(.text.xTaskIncrementTick) refers to tasks.o(.bss.xPendedTicks) for xPendedTicks + tasks.o(.text.xTaskIncrementTick) refers to tasks.o(.bss.xTickCount) for xTickCount + tasks.o(.text.xTaskIncrementTick) refers to tasks.o(.bss.pxDelayedTaskList) for pxDelayedTaskList + tasks.o(.text.xTaskIncrementTick) refers to tasks.o(.bss.pxOverflowDelayedTaskList) for pxOverflowDelayedTaskList + tasks.o(.text.xTaskIncrementTick) refers to tasks.o(.bss.xNumOfOverflows) for xNumOfOverflows + tasks.o(.text.xTaskIncrementTick) refers to tasks.o(.text.prvResetNextTaskUnblockTime) for prvResetNextTaskUnblockTime + tasks.o(.text.xTaskIncrementTick) refers to tasks.o(.bss.xNextTaskUnblockTime) for xNextTaskUnblockTime + tasks.o(.text.xTaskIncrementTick) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.xTaskIncrementTick) refers to tasks.o(.bss.pxReadyTasksLists) for pxReadyTasksLists + tasks.o(.text.xTaskIncrementTick) refers to tasks.o(.bss.uxTopReadyPriority) for uxTopReadyPriority + tasks.o(.text.xTaskIncrementTick) refers to list.o(.text.vListInsertEnd) for vListInsertEnd + tasks.o(.text.xTaskIncrementTick) refers to list.o(.text.uxListRemove) for uxListRemove + tasks.o(.text.xTaskIncrementTick) refers to tasks.o(.bss.xYieldPending) for xYieldPending + tasks.o(.ARM.exidx.text.xTaskIncrementTick) refers to tasks.o(.text.xTaskIncrementTick) for [Anonymous Symbol] + tasks.o(.text.xTaskGetTickCount) refers to tasks.o(.bss.xTickCount) for xTickCount + tasks.o(.ARM.exidx.text.xTaskGetTickCount) refers to tasks.o(.text.xTaskGetTickCount) for [Anonymous Symbol] + tasks.o(.text.xTaskGetTickCountFromISR) refers to port.o(.text.vPortValidateInterruptPriority) for vPortValidateInterruptPriority + tasks.o(.text.xTaskGetTickCountFromISR) refers to tasks.o(.bss.xTickCount) for xTickCount + tasks.o(.ARM.exidx.text.xTaskGetTickCountFromISR) refers to tasks.o(.text.xTaskGetTickCountFromISR) for [Anonymous Symbol] + tasks.o(.text.uxTaskGetNumberOfTasks) refers to tasks.o(.bss.uxCurrentNumberOfTasks) for uxCurrentNumberOfTasks + tasks.o(.ARM.exidx.text.uxTaskGetNumberOfTasks) refers to tasks.o(.text.uxTaskGetNumberOfTasks) for [Anonymous Symbol] + tasks.o(.text.pcTaskGetName) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.ARM.exidx.text.pcTaskGetName) refers to tasks.o(.text.pcTaskGetName) for [Anonymous Symbol] + tasks.o(.text.uxTaskGetSystemState) refers to tasks.o(.text.vTaskSuspendAll) for vTaskSuspendAll + tasks.o(.text.uxTaskGetSystemState) refers to tasks.o(.bss.uxCurrentNumberOfTasks) for uxCurrentNumberOfTasks + tasks.o(.text.uxTaskGetSystemState) refers to tasks.o(.bss.pxReadyTasksLists) for pxReadyTasksLists + tasks.o(.text.uxTaskGetSystemState) refers to tasks.o(.text.prvListTasksWithinSingleList) for prvListTasksWithinSingleList + tasks.o(.text.uxTaskGetSystemState) refers to tasks.o(.bss.pxDelayedTaskList) for pxDelayedTaskList + tasks.o(.text.uxTaskGetSystemState) refers to tasks.o(.bss.pxOverflowDelayedTaskList) for pxOverflowDelayedTaskList + tasks.o(.text.uxTaskGetSystemState) refers to tasks.o(.bss.xTasksWaitingTermination) for xTasksWaitingTermination + tasks.o(.text.uxTaskGetSystemState) refers to tasks.o(.bss.xSuspendedTaskList) for xSuspendedTaskList + tasks.o(.text.uxTaskGetSystemState) refers to tasks.o(.text.xTaskResumeAll) for xTaskResumeAll + tasks.o(.ARM.exidx.text.uxTaskGetSystemState) refers to tasks.o(.text.uxTaskGetSystemState) for [Anonymous Symbol] + tasks.o(.text.prvListTasksWithinSingleList) refers to tasks.o(.text.vTaskGetInfo) for vTaskGetInfo + tasks.o(.ARM.exidx.text.prvListTasksWithinSingleList) refers to tasks.o(.text.prvListTasksWithinSingleList) for [Anonymous Symbol] + tasks.o(.text.xTaskCatchUpTicks) refers to tasks.o(.bss.uxSchedulerSuspended) for uxSchedulerSuspended + tasks.o(.text.xTaskCatchUpTicks) refers to tasks.o(.text.vTaskSuspendAll) for vTaskSuspendAll + tasks.o(.text.xTaskCatchUpTicks) refers to tasks.o(.bss.xPendedTicks) for xPendedTicks + tasks.o(.text.xTaskCatchUpTicks) refers to tasks.o(.text.xTaskResumeAll) for xTaskResumeAll + tasks.o(.ARM.exidx.text.xTaskCatchUpTicks) refers to tasks.o(.text.xTaskCatchUpTicks) for [Anonymous Symbol] + tasks.o(.text.vTaskPlaceOnEventList) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.vTaskPlaceOnEventList) refers to list.o(.text.vListInsert) for vListInsert + tasks.o(.text.vTaskPlaceOnEventList) refers to tasks.o(.text.prvAddCurrentTaskToDelayedList) for prvAddCurrentTaskToDelayedList + tasks.o(.ARM.exidx.text.vTaskPlaceOnEventList) refers to tasks.o(.text.vTaskPlaceOnEventList) for [Anonymous Symbol] + tasks.o(.text.vTaskPlaceOnUnorderedEventList) refers to tasks.o(.bss.uxSchedulerSuspended) for uxSchedulerSuspended + tasks.o(.text.vTaskPlaceOnUnorderedEventList) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.vTaskPlaceOnUnorderedEventList) refers to list.o(.text.vListInsertEnd) for vListInsertEnd + tasks.o(.text.vTaskPlaceOnUnorderedEventList) refers to tasks.o(.text.prvAddCurrentTaskToDelayedList) for prvAddCurrentTaskToDelayedList + tasks.o(.ARM.exidx.text.vTaskPlaceOnUnorderedEventList) refers to tasks.o(.text.vTaskPlaceOnUnorderedEventList) for [Anonymous Symbol] + tasks.o(.text.vTaskPlaceOnEventListRestricted) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.vTaskPlaceOnEventListRestricted) refers to list.o(.text.vListInsertEnd) for vListInsertEnd + tasks.o(.text.vTaskPlaceOnEventListRestricted) refers to tasks.o(.text.prvAddCurrentTaskToDelayedList) for prvAddCurrentTaskToDelayedList + tasks.o(.ARM.exidx.text.vTaskPlaceOnEventListRestricted) refers to tasks.o(.text.vTaskPlaceOnEventListRestricted) for [Anonymous Symbol] + tasks.o(.text.xTaskRemoveFromEventList) refers to list.o(.text.uxListRemove) for uxListRemove + tasks.o(.text.xTaskRemoveFromEventList) refers to tasks.o(.bss.uxSchedulerSuspended) for uxSchedulerSuspended + tasks.o(.text.xTaskRemoveFromEventList) refers to tasks.o(.bss.xPendingReadyList) for xPendingReadyList + tasks.o(.text.xTaskRemoveFromEventList) refers to tasks.o(.bss.uxTopReadyPriority) for uxTopReadyPriority + tasks.o(.text.xTaskRemoveFromEventList) refers to tasks.o(.bss.pxReadyTasksLists) for pxReadyTasksLists + tasks.o(.text.xTaskRemoveFromEventList) refers to list.o(.text.vListInsertEnd) for vListInsertEnd + tasks.o(.text.xTaskRemoveFromEventList) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.xTaskRemoveFromEventList) refers to tasks.o(.bss.xYieldPending) for xYieldPending + tasks.o(.ARM.exidx.text.xTaskRemoveFromEventList) refers to tasks.o(.text.xTaskRemoveFromEventList) for [Anonymous Symbol] + tasks.o(.text.vTaskRemoveFromUnorderedEventList) refers to tasks.o(.bss.uxSchedulerSuspended) for uxSchedulerSuspended + tasks.o(.text.vTaskRemoveFromUnorderedEventList) refers to list.o(.text.uxListRemove) for uxListRemove + tasks.o(.text.vTaskRemoveFromUnorderedEventList) refers to tasks.o(.bss.uxTopReadyPriority) for uxTopReadyPriority + tasks.o(.text.vTaskRemoveFromUnorderedEventList) refers to tasks.o(.bss.pxReadyTasksLists) for pxReadyTasksLists + tasks.o(.text.vTaskRemoveFromUnorderedEventList) refers to list.o(.text.vListInsertEnd) for vListInsertEnd + tasks.o(.text.vTaskRemoveFromUnorderedEventList) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.vTaskRemoveFromUnorderedEventList) refers to tasks.o(.bss.xYieldPending) for xYieldPending + tasks.o(.ARM.exidx.text.vTaskRemoveFromUnorderedEventList) refers to tasks.o(.text.vTaskRemoveFromUnorderedEventList) for [Anonymous Symbol] + tasks.o(.text.vTaskSetTimeOutState) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + tasks.o(.text.vTaskSetTimeOutState) refers to tasks.o(.bss.xNumOfOverflows) for xNumOfOverflows + tasks.o(.text.vTaskSetTimeOutState) refers to tasks.o(.bss.xTickCount) for xTickCount + tasks.o(.text.vTaskSetTimeOutState) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + tasks.o(.ARM.exidx.text.vTaskSetTimeOutState) refers to tasks.o(.text.vTaskSetTimeOutState) for [Anonymous Symbol] + tasks.o(.text.vTaskInternalSetTimeOutState) refers to tasks.o(.bss.xNumOfOverflows) for xNumOfOverflows + tasks.o(.text.vTaskInternalSetTimeOutState) refers to tasks.o(.bss.xTickCount) for xTickCount + tasks.o(.ARM.exidx.text.vTaskInternalSetTimeOutState) refers to tasks.o(.text.vTaskInternalSetTimeOutState) for [Anonymous Symbol] + tasks.o(.text.xTaskCheckForTimeOut) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + tasks.o(.text.xTaskCheckForTimeOut) refers to tasks.o(.bss.xTickCount) for xTickCount + tasks.o(.text.xTaskCheckForTimeOut) refers to tasks.o(.bss.xNumOfOverflows) for xNumOfOverflows + tasks.o(.text.xTaskCheckForTimeOut) refers to tasks.o(.text.vTaskInternalSetTimeOutState) for vTaskInternalSetTimeOutState + tasks.o(.text.xTaskCheckForTimeOut) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + tasks.o(.ARM.exidx.text.xTaskCheckForTimeOut) refers to tasks.o(.text.xTaskCheckForTimeOut) for [Anonymous Symbol] + tasks.o(.text.vTaskMissedYield) refers to tasks.o(.bss.xYieldPending) for xYieldPending + tasks.o(.ARM.exidx.text.vTaskMissedYield) refers to tasks.o(.text.vTaskMissedYield) for [Anonymous Symbol] + tasks.o(.ARM.exidx.text.uxTaskGetTaskNumber) refers to tasks.o(.text.uxTaskGetTaskNumber) for [Anonymous Symbol] + tasks.o(.ARM.exidx.text.vTaskSetTaskNumber) refers to tasks.o(.text.vTaskSetTaskNumber) for [Anonymous Symbol] + tasks.o(.text.vTaskGetInfo) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.vTaskGetInfo) refers to tasks.o(.text.eTaskGetState) for eTaskGetState + tasks.o(.text.vTaskGetInfo) refers to tasks.o(.text.vTaskSuspendAll) for vTaskSuspendAll + tasks.o(.text.vTaskGetInfo) refers to tasks.o(.text.xTaskResumeAll) for xTaskResumeAll + tasks.o(.text.vTaskGetInfo) refers to tasks.o(.text.prvTaskCheckFreeStackSpace) for prvTaskCheckFreeStackSpace + tasks.o(.ARM.exidx.text.vTaskGetInfo) refers to tasks.o(.text.vTaskGetInfo) for [Anonymous Symbol] + tasks.o(.ARM.exidx.text.prvTaskCheckFreeStackSpace) refers to tasks.o(.text.prvTaskCheckFreeStackSpace) for [Anonymous Symbol] + tasks.o(.text.uxTaskGetStackHighWaterMark) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.uxTaskGetStackHighWaterMark) refers to tasks.o(.text.prvTaskCheckFreeStackSpace) for prvTaskCheckFreeStackSpace + tasks.o(.ARM.exidx.text.uxTaskGetStackHighWaterMark) refers to tasks.o(.text.uxTaskGetStackHighWaterMark) for [Anonymous Symbol] + tasks.o(.text.xTaskGetCurrentTaskHandle) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.ARM.exidx.text.xTaskGetCurrentTaskHandle) refers to tasks.o(.text.xTaskGetCurrentTaskHandle) for [Anonymous Symbol] + tasks.o(.text.xTaskGetSchedulerState) refers to tasks.o(.bss.xSchedulerRunning) for xSchedulerRunning + tasks.o(.text.xTaskGetSchedulerState) refers to tasks.o(.bss.uxSchedulerSuspended) for uxSchedulerSuspended + tasks.o(.ARM.exidx.text.xTaskGetSchedulerState) refers to tasks.o(.text.xTaskGetSchedulerState) for [Anonymous Symbol] + tasks.o(.text.xTaskPriorityInherit) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.xTaskPriorityInherit) refers to tasks.o(.bss.pxReadyTasksLists) for pxReadyTasksLists + tasks.o(.text.xTaskPriorityInherit) refers to list.o(.text.uxListRemove) for uxListRemove + tasks.o(.text.xTaskPriorityInherit) refers to tasks.o(.bss.uxTopReadyPriority) for uxTopReadyPriority + tasks.o(.text.xTaskPriorityInherit) refers to list.o(.text.vListInsertEnd) for vListInsertEnd + tasks.o(.ARM.exidx.text.xTaskPriorityInherit) refers to tasks.o(.text.xTaskPriorityInherit) for [Anonymous Symbol] + tasks.o(.text.xTaskPriorityDisinherit) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.xTaskPriorityDisinherit) refers to list.o(.text.uxListRemove) for uxListRemove + tasks.o(.text.xTaskPriorityDisinherit) refers to tasks.o(.bss.uxTopReadyPriority) for uxTopReadyPriority + tasks.o(.text.xTaskPriorityDisinherit) refers to tasks.o(.bss.pxReadyTasksLists) for pxReadyTasksLists + tasks.o(.text.xTaskPriorityDisinherit) refers to list.o(.text.vListInsertEnd) for vListInsertEnd + tasks.o(.ARM.exidx.text.xTaskPriorityDisinherit) refers to tasks.o(.text.xTaskPriorityDisinherit) for [Anonymous Symbol] + tasks.o(.text.vTaskPriorityDisinheritAfterTimeout) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.vTaskPriorityDisinheritAfterTimeout) refers to tasks.o(.bss.pxReadyTasksLists) for pxReadyTasksLists + tasks.o(.text.vTaskPriorityDisinheritAfterTimeout) refers to list.o(.text.uxListRemove) for uxListRemove + tasks.o(.text.vTaskPriorityDisinheritAfterTimeout) refers to tasks.o(.bss.uxTopReadyPriority) for uxTopReadyPriority + tasks.o(.text.vTaskPriorityDisinheritAfterTimeout) refers to list.o(.text.vListInsertEnd) for vListInsertEnd + tasks.o(.ARM.exidx.text.vTaskPriorityDisinheritAfterTimeout) refers to tasks.o(.text.vTaskPriorityDisinheritAfterTimeout) for [Anonymous Symbol] + tasks.o(.text.uxTaskResetEventItemValue) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.ARM.exidx.text.uxTaskResetEventItemValue) refers to tasks.o(.text.uxTaskResetEventItemValue) for [Anonymous Symbol] + tasks.o(.text.pvTaskIncrementMutexHeldCount) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.ARM.exidx.text.pvTaskIncrementMutexHeldCount) refers to tasks.o(.text.pvTaskIncrementMutexHeldCount) for [Anonymous Symbol] + tasks.o(.text.ulTaskNotifyTake) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + tasks.o(.text.ulTaskNotifyTake) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.ulTaskNotifyTake) refers to tasks.o(.text.prvAddCurrentTaskToDelayedList) for prvAddCurrentTaskToDelayedList + tasks.o(.text.ulTaskNotifyTake) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + tasks.o(.ARM.exidx.text.ulTaskNotifyTake) refers to tasks.o(.text.ulTaskNotifyTake) for [Anonymous Symbol] + tasks.o(.text.xTaskNotifyWait) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + tasks.o(.text.xTaskNotifyWait) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.xTaskNotifyWait) refers to tasks.o(.text.prvAddCurrentTaskToDelayedList) for prvAddCurrentTaskToDelayedList + tasks.o(.text.xTaskNotifyWait) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + tasks.o(.ARM.exidx.text.xTaskNotifyWait) refers to tasks.o(.text.xTaskNotifyWait) for [Anonymous Symbol] + tasks.o(.text.xTaskGenericNotify) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + tasks.o(.text.xTaskGenericNotify) refers to list.o(.text.uxListRemove) for uxListRemove + tasks.o(.text.xTaskGenericNotify) refers to tasks.o(.bss.uxTopReadyPriority) for uxTopReadyPriority + tasks.o(.text.xTaskGenericNotify) refers to tasks.o(.bss.pxReadyTasksLists) for pxReadyTasksLists + tasks.o(.text.xTaskGenericNotify) refers to list.o(.text.vListInsertEnd) for vListInsertEnd + tasks.o(.text.xTaskGenericNotify) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.xTaskGenericNotify) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + tasks.o(.ARM.exidx.text.xTaskGenericNotify) refers to tasks.o(.text.xTaskGenericNotify) for [Anonymous Symbol] + tasks.o(.text.xTaskGenericNotifyFromISR) refers to port.o(.text.vPortValidateInterruptPriority) for vPortValidateInterruptPriority + tasks.o(.text.xTaskGenericNotifyFromISR) refers to tasks.o(.bss.uxSchedulerSuspended) for uxSchedulerSuspended + tasks.o(.text.xTaskGenericNotifyFromISR) refers to tasks.o(.bss.xPendingReadyList) for xPendingReadyList + tasks.o(.text.xTaskGenericNotifyFromISR) refers to list.o(.text.uxListRemove) for uxListRemove + tasks.o(.text.xTaskGenericNotifyFromISR) refers to tasks.o(.bss.uxTopReadyPriority) for uxTopReadyPriority + tasks.o(.text.xTaskGenericNotifyFromISR) refers to tasks.o(.bss.pxReadyTasksLists) for pxReadyTasksLists + tasks.o(.text.xTaskGenericNotifyFromISR) refers to list.o(.text.vListInsertEnd) for vListInsertEnd + tasks.o(.text.xTaskGenericNotifyFromISR) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.xTaskGenericNotifyFromISR) refers to tasks.o(.bss.xYieldPending) for xYieldPending + tasks.o(.ARM.exidx.text.xTaskGenericNotifyFromISR) refers to tasks.o(.text.xTaskGenericNotifyFromISR) for [Anonymous Symbol] + tasks.o(.text.vTaskNotifyGiveFromISR) refers to port.o(.text.vPortValidateInterruptPriority) for vPortValidateInterruptPriority + tasks.o(.text.vTaskNotifyGiveFromISR) refers to tasks.o(.bss.uxSchedulerSuspended) for uxSchedulerSuspended + tasks.o(.text.vTaskNotifyGiveFromISR) refers to tasks.o(.bss.xPendingReadyList) for xPendingReadyList + tasks.o(.text.vTaskNotifyGiveFromISR) refers to list.o(.text.uxListRemove) for uxListRemove + tasks.o(.text.vTaskNotifyGiveFromISR) refers to tasks.o(.bss.uxTopReadyPriority) for uxTopReadyPriority + tasks.o(.text.vTaskNotifyGiveFromISR) refers to tasks.o(.bss.pxReadyTasksLists) for pxReadyTasksLists + tasks.o(.text.vTaskNotifyGiveFromISR) refers to list.o(.text.vListInsertEnd) for vListInsertEnd + tasks.o(.text.vTaskNotifyGiveFromISR) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.vTaskNotifyGiveFromISR) refers to tasks.o(.bss.xYieldPending) for xYieldPending + tasks.o(.ARM.exidx.text.vTaskNotifyGiveFromISR) refers to tasks.o(.text.vTaskNotifyGiveFromISR) for [Anonymous Symbol] + tasks.o(.text.xTaskNotifyStateClear) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.xTaskNotifyStateClear) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + tasks.o(.text.xTaskNotifyStateClear) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + tasks.o(.ARM.exidx.text.xTaskNotifyStateClear) refers to tasks.o(.text.xTaskNotifyStateClear) for [Anonymous Symbol] + tasks.o(.text.ulTaskNotifyValueClear) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + tasks.o(.text.ulTaskNotifyValueClear) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + tasks.o(.text.ulTaskNotifyValueClear) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + tasks.o(.ARM.exidx.text.ulTaskNotifyValueClear) refers to tasks.o(.text.ulTaskNotifyValueClear) for [Anonymous Symbol] + tasks.o(.text.prvInitialiseTaskLists) refers to tasks.o(.bss.pxReadyTasksLists) for pxReadyTasksLists + tasks.o(.text.prvInitialiseTaskLists) refers to list.o(.text.vListInitialise) for vListInitialise + tasks.o(.text.prvInitialiseTaskLists) refers to tasks.o(.bss.xDelayedTaskList1) for xDelayedTaskList1 + tasks.o(.text.prvInitialiseTaskLists) refers to tasks.o(.bss.xDelayedTaskList2) for xDelayedTaskList2 + tasks.o(.text.prvInitialiseTaskLists) refers to tasks.o(.bss.xPendingReadyList) for xPendingReadyList + tasks.o(.text.prvInitialiseTaskLists) refers to tasks.o(.bss.xTasksWaitingTermination) for xTasksWaitingTermination + tasks.o(.text.prvInitialiseTaskLists) refers to tasks.o(.bss.xSuspendedTaskList) for xSuspendedTaskList + tasks.o(.text.prvInitialiseTaskLists) refers to tasks.o(.bss.pxDelayedTaskList) for pxDelayedTaskList + tasks.o(.text.prvInitialiseTaskLists) refers to tasks.o(.bss.pxOverflowDelayedTaskList) for pxOverflowDelayedTaskList + tasks.o(.ARM.exidx.text.prvInitialiseTaskLists) refers to tasks.o(.text.prvInitialiseTaskLists) for [Anonymous Symbol] + tasks.o(.text.prvCheckTasksWaitingTermination) refers to tasks.o(.bss.uxDeletedTasksWaitingCleanUp) for uxDeletedTasksWaitingCleanUp + tasks.o(.text.prvCheckTasksWaitingTermination) refers to tasks.o(.bss.xTasksWaitingTermination) for xTasksWaitingTermination + tasks.o(.text.prvCheckTasksWaitingTermination) refers to tasks.o(.bss.uxCurrentNumberOfTasks) for uxCurrentNumberOfTasks + tasks.o(.text.prvCheckTasksWaitingTermination) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + tasks.o(.text.prvCheckTasksWaitingTermination) refers to list.o(.text.uxListRemove) for uxListRemove + tasks.o(.text.prvCheckTasksWaitingTermination) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + tasks.o(.text.prvCheckTasksWaitingTermination) refers to tasks.o(.text.prvDeleteTCB) for prvDeleteTCB + tasks.o(.ARM.exidx.text.prvCheckTasksWaitingTermination) refers to tasks.o(.text.prvCheckTasksWaitingTermination) for [Anonymous Symbol] + timers.o(.text.xTimerCreateTimerTask) refers to timers.o(.text.prvCheckForValidListAndQueue) for prvCheckForValidListAndQueue + timers.o(.text.xTimerCreateTimerTask) refers to timers.o(.bss.xTimerQueue) for xTimerQueue + timers.o(.text.xTimerCreateTimerTask) refers to cmsis_os2.o(.text.vApplicationGetTimerTaskMemory) for vApplicationGetTimerTaskMemory + timers.o(.text.xTimerCreateTimerTask) refers to timers.o(.text.prvTimerTask) for prvTimerTask + timers.o(.text.xTimerCreateTimerTask) refers to tasks.o(.text.xTaskCreateStatic) for xTaskCreateStatic + timers.o(.text.xTimerCreateTimerTask) refers to timers.o(.bss.xTimerTaskHandle) for xTimerTaskHandle + timers.o(.ARM.exidx.text.xTimerCreateTimerTask) refers to timers.o(.text.xTimerCreateTimerTask) for [Anonymous Symbol] + timers.o(.text.prvCheckForValidListAndQueue) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + timers.o(.text.prvCheckForValidListAndQueue) refers to timers.o(.bss.xTimerQueue) for xTimerQueue + timers.o(.text.prvCheckForValidListAndQueue) refers to timers.o(.bss.xActiveTimerList1) for xActiveTimerList1 + timers.o(.text.prvCheckForValidListAndQueue) refers to list.o(.text.vListInitialise) for vListInitialise + timers.o(.text.prvCheckForValidListAndQueue) refers to timers.o(.bss.xActiveTimerList2) for xActiveTimerList2 + timers.o(.text.prvCheckForValidListAndQueue) refers to timers.o(.bss.pxCurrentTimerList) for pxCurrentTimerList + timers.o(.text.prvCheckForValidListAndQueue) refers to timers.o(.bss.pxOverflowTimerList) for pxOverflowTimerList + timers.o(.text.prvCheckForValidListAndQueue) refers to timers.o(.bss.prvCheckForValidListAndQueue.ucStaticTimerQueueStorage) for prvCheckForValidListAndQueue.ucStaticTimerQueueStorage + timers.o(.text.prvCheckForValidListAndQueue) refers to timers.o(.bss.prvCheckForValidListAndQueue.xStaticTimerQueue) for prvCheckForValidListAndQueue.xStaticTimerQueue + timers.o(.text.prvCheckForValidListAndQueue) refers to queue.o(.text.xQueueGenericCreateStatic) for xQueueGenericCreateStatic + timers.o(.text.prvCheckForValidListAndQueue) refers to queue.o(.text.vQueueAddToRegistry) for vQueueAddToRegistry + timers.o(.text.prvCheckForValidListAndQueue) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + timers.o(.ARM.exidx.text.prvCheckForValidListAndQueue) refers to timers.o(.text.prvCheckForValidListAndQueue) for [Anonymous Symbol] + timers.o(.text.prvTimerTask) refers to timers.o(.text.prvGetNextExpireTime) for prvGetNextExpireTime + timers.o(.text.prvTimerTask) refers to timers.o(.text.prvProcessTimerOrBlockTask) for prvProcessTimerOrBlockTask + timers.o(.text.prvTimerTask) refers to timers.o(.text.prvProcessReceivedCommands) for prvProcessReceivedCommands + timers.o(.ARM.exidx.text.prvTimerTask) refers to timers.o(.text.prvTimerTask) for [Anonymous Symbol] + timers.o(.text.xTimerCreate) refers to heap_4.o(.text.pvPortMalloc) for pvPortMalloc + timers.o(.text.xTimerCreate) refers to timers.o(.text.prvInitialiseNewTimer) for prvInitialiseNewTimer + timers.o(.ARM.exidx.text.xTimerCreate) refers to timers.o(.text.xTimerCreate) for [Anonymous Symbol] + timers.o(.text.prvInitialiseNewTimer) refers to timers.o(.text.prvCheckForValidListAndQueue) for prvCheckForValidListAndQueue + timers.o(.text.prvInitialiseNewTimer) refers to list.o(.text.vListInitialiseItem) for vListInitialiseItem + timers.o(.ARM.exidx.text.prvInitialiseNewTimer) refers to timers.o(.text.prvInitialiseNewTimer) for [Anonymous Symbol] + timers.o(.text.xTimerCreateStatic) refers to timers.o(.text.prvInitialiseNewTimer) for prvInitialiseNewTimer + timers.o(.ARM.exidx.text.xTimerCreateStatic) refers to timers.o(.text.xTimerCreateStatic) for [Anonymous Symbol] + timers.o(.text.xTimerGenericCommand) refers to timers.o(.bss.xTimerQueue) for xTimerQueue + timers.o(.text.xTimerGenericCommand) refers to tasks.o(.text.xTaskGetSchedulerState) for xTaskGetSchedulerState + timers.o(.text.xTimerGenericCommand) refers to queue.o(.text.xQueueGenericSendFromISR) for xQueueGenericSendFromISR + timers.o(.text.xTimerGenericCommand) refers to queue.o(.text.xQueueGenericSend) for xQueueGenericSend + timers.o(.ARM.exidx.text.xTimerGenericCommand) refers to timers.o(.text.xTimerGenericCommand) for [Anonymous Symbol] + timers.o(.text.xTimerGetTimerDaemonTaskHandle) refers to timers.o(.bss.xTimerTaskHandle) for xTimerTaskHandle + timers.o(.ARM.exidx.text.xTimerGetTimerDaemonTaskHandle) refers to timers.o(.text.xTimerGetTimerDaemonTaskHandle) for [Anonymous Symbol] + timers.o(.ARM.exidx.text.xTimerGetPeriod) refers to timers.o(.text.xTimerGetPeriod) for [Anonymous Symbol] + timers.o(.text.vTimerSetReloadMode) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + timers.o(.text.vTimerSetReloadMode) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + timers.o(.ARM.exidx.text.vTimerSetReloadMode) refers to timers.o(.text.vTimerSetReloadMode) for [Anonymous Symbol] + timers.o(.text.uxTimerGetReloadMode) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + timers.o(.text.uxTimerGetReloadMode) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + timers.o(.ARM.exidx.text.uxTimerGetReloadMode) refers to timers.o(.text.uxTimerGetReloadMode) for [Anonymous Symbol] + timers.o(.ARM.exidx.text.xTimerGetExpiryTime) refers to timers.o(.text.xTimerGetExpiryTime) for [Anonymous Symbol] + timers.o(.ARM.exidx.text.pcTimerGetName) refers to timers.o(.text.pcTimerGetName) for [Anonymous Symbol] + timers.o(.text.xTimerIsTimerActive) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + timers.o(.text.xTimerIsTimerActive) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + timers.o(.ARM.exidx.text.xTimerIsTimerActive) refers to timers.o(.text.xTimerIsTimerActive) for [Anonymous Symbol] + timers.o(.text.pvTimerGetTimerID) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + timers.o(.text.pvTimerGetTimerID) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + timers.o(.ARM.exidx.text.pvTimerGetTimerID) refers to timers.o(.text.pvTimerGetTimerID) for [Anonymous Symbol] + timers.o(.text.vTimerSetTimerID) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + timers.o(.text.vTimerSetTimerID) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + timers.o(.ARM.exidx.text.vTimerSetTimerID) refers to timers.o(.text.vTimerSetTimerID) for [Anonymous Symbol] + timers.o(.text.xTimerPendFunctionCallFromISR) refers to timers.o(.bss.xTimerQueue) for xTimerQueue + timers.o(.text.xTimerPendFunctionCallFromISR) refers to queue.o(.text.xQueueGenericSendFromISR) for xQueueGenericSendFromISR + timers.o(.ARM.exidx.text.xTimerPendFunctionCallFromISR) refers to timers.o(.text.xTimerPendFunctionCallFromISR) for [Anonymous Symbol] + timers.o(.text.xTimerPendFunctionCall) refers to timers.o(.bss.xTimerQueue) for xTimerQueue + timers.o(.text.xTimerPendFunctionCall) refers to queue.o(.text.xQueueGenericSend) for xQueueGenericSend + timers.o(.ARM.exidx.text.xTimerPendFunctionCall) refers to timers.o(.text.xTimerPendFunctionCall) for [Anonymous Symbol] + timers.o(.ARM.exidx.text.uxTimerGetTimerNumber) refers to timers.o(.text.uxTimerGetTimerNumber) for [Anonymous Symbol] + timers.o(.ARM.exidx.text.vTimerSetTimerNumber) refers to timers.o(.text.vTimerSetTimerNumber) for [Anonymous Symbol] + timers.o(.text.prvGetNextExpireTime) refers to timers.o(.bss.pxCurrentTimerList) for pxCurrentTimerList + timers.o(.ARM.exidx.text.prvGetNextExpireTime) refers to timers.o(.text.prvGetNextExpireTime) for [Anonymous Symbol] + timers.o(.text.prvProcessTimerOrBlockTask) refers to tasks.o(.text.vTaskSuspendAll) for vTaskSuspendAll + timers.o(.text.prvProcessTimerOrBlockTask) refers to timers.o(.text.prvSampleTimeNow) for prvSampleTimeNow + timers.o(.text.prvProcessTimerOrBlockTask) refers to tasks.o(.text.xTaskResumeAll) for xTaskResumeAll + timers.o(.text.prvProcessTimerOrBlockTask) refers to timers.o(.text.prvProcessExpiredTimer) for prvProcessExpiredTimer + timers.o(.text.prvProcessTimerOrBlockTask) refers to timers.o(.bss.pxOverflowTimerList) for pxOverflowTimerList + timers.o(.text.prvProcessTimerOrBlockTask) refers to timers.o(.bss.xTimerQueue) for xTimerQueue + timers.o(.text.prvProcessTimerOrBlockTask) refers to queue.o(.text.vQueueWaitForMessageRestricted) for vQueueWaitForMessageRestricted + timers.o(.ARM.exidx.text.prvProcessTimerOrBlockTask) refers to timers.o(.text.prvProcessTimerOrBlockTask) for [Anonymous Symbol] + timers.o(.text.prvProcessReceivedCommands) refers to timers.o(.bss.xTimerQueue) for xTimerQueue + timers.o(.text.prvProcessReceivedCommands) refers to queue.o(.text.xQueueReceive) for xQueueReceive + timers.o(.text.prvProcessReceivedCommands) refers to list.o(.text.uxListRemove) for uxListRemove + timers.o(.text.prvProcessReceivedCommands) refers to timers.o(.text.prvSampleTimeNow) for prvSampleTimeNow + timers.o(.text.prvProcessReceivedCommands) refers to timers.o(.text.prvInsertTimerInActiveList) for prvInsertTimerInActiveList + timers.o(.text.prvProcessReceivedCommands) refers to timers.o(.text.xTimerGenericCommand) for xTimerGenericCommand + timers.o(.text.prvProcessReceivedCommands) refers to heap_4.o(.text.vPortFree) for vPortFree + timers.o(.ARM.exidx.text.prvProcessReceivedCommands) refers to timers.o(.text.prvProcessReceivedCommands) for [Anonymous Symbol] + timers.o(.text.prvSampleTimeNow) refers to tasks.o(.text.xTaskGetTickCount) for xTaskGetTickCount + timers.o(.text.prvSampleTimeNow) refers to timers.o(.bss.prvSampleTimeNow.xLastTime) for prvSampleTimeNow.xLastTime + timers.o(.text.prvSampleTimeNow) refers to timers.o(.text.prvSwitchTimerLists) for prvSwitchTimerLists + timers.o(.ARM.exidx.text.prvSampleTimeNow) refers to timers.o(.text.prvSampleTimeNow) for [Anonymous Symbol] + timers.o(.text.prvProcessExpiredTimer) refers to timers.o(.bss.pxCurrentTimerList) for pxCurrentTimerList + timers.o(.text.prvProcessExpiredTimer) refers to list.o(.text.uxListRemove) for uxListRemove + timers.o(.text.prvProcessExpiredTimer) refers to timers.o(.text.prvInsertTimerInActiveList) for prvInsertTimerInActiveList + timers.o(.text.prvProcessExpiredTimer) refers to timers.o(.text.xTimerGenericCommand) for xTimerGenericCommand + timers.o(.ARM.exidx.text.prvProcessExpiredTimer) refers to timers.o(.text.prvProcessExpiredTimer) for [Anonymous Symbol] + timers.o(.text.prvSwitchTimerLists) refers to timers.o(.bss.pxCurrentTimerList) for pxCurrentTimerList + timers.o(.text.prvSwitchTimerLists) refers to list.o(.text.vListInsert) for vListInsert + timers.o(.text.prvSwitchTimerLists) refers to list.o(.text.uxListRemove) for uxListRemove + timers.o(.text.prvSwitchTimerLists) refers to timers.o(.text.xTimerGenericCommand) for xTimerGenericCommand + timers.o(.text.prvSwitchTimerLists) refers to timers.o(.bss.pxOverflowTimerList) for pxOverflowTimerList + timers.o(.ARM.exidx.text.prvSwitchTimerLists) refers to timers.o(.text.prvSwitchTimerLists) for [Anonymous Symbol] + timers.o(.text.prvInsertTimerInActiveList) refers to timers.o(.bss.pxCurrentTimerList) for pxCurrentTimerList + timers.o(.text.prvInsertTimerInActiveList) refers to timers.o(.bss.pxOverflowTimerList) for pxOverflowTimerList + timers.o(.text.prvInsertTimerInActiveList) refers to list.o(.text.vListInsert) for vListInsert + timers.o(.ARM.exidx.text.prvInsertTimerInActiveList) refers to timers.o(.text.prvInsertTimerInActiveList) for [Anonymous Symbol] + cmsis_os2.o(.text.osKernelInitialize) refers to cmsis_os2.o(.bss.KernelState) for KernelState + cmsis_os2.o(.ARM.exidx.text.osKernelInitialize) refers to cmsis_os2.o(.text.osKernelInitialize) for [Anonymous Symbol] + cmsis_os2.o(.text.osKernelGetInfo) refers to cmsis_os2.o(.rodata.str1.4) for .L.str + cmsis_os2.o(.text.osKernelGetInfo) refers to rt_memcpy_v6.o(.text) for __aeabi_memcpy + cmsis_os2.o(.ARM.exidx.text.osKernelGetInfo) refers to cmsis_os2.o(.text.osKernelGetInfo) for [Anonymous Symbol] + cmsis_os2.o(.text.osKernelGetState) refers to tasks.o(.text.xTaskGetSchedulerState) for xTaskGetSchedulerState + cmsis_os2.o(.text.osKernelGetState) refers to cmsis_os2.o(.bss.KernelState) for KernelState + cmsis_os2.o(.ARM.exidx.text.osKernelGetState) refers to cmsis_os2.o(.text.osKernelGetState) for [Anonymous Symbol] + cmsis_os2.o(.text.osKernelStart) refers to cmsis_os2.o(.bss.KernelState) for KernelState + cmsis_os2.o(.text.osKernelStart) refers to cmsis_os2.o(.text.SVC_Setup) for SVC_Setup + cmsis_os2.o(.text.osKernelStart) refers to tasks.o(.text.vTaskStartScheduler) for vTaskStartScheduler + cmsis_os2.o(.ARM.exidx.text.osKernelStart) refers to cmsis_os2.o(.text.osKernelStart) for [Anonymous Symbol] + cmsis_os2.o(.text.SVC_Setup) refers to cmsis_os2.o(.text.__NVIC_SetPriority) for __NVIC_SetPriority + cmsis_os2.o(.ARM.exidx.text.SVC_Setup) refers to cmsis_os2.o(.text.SVC_Setup) for [Anonymous Symbol] + cmsis_os2.o(.text.osKernelLock) refers to tasks.o(.text.xTaskGetSchedulerState) for xTaskGetSchedulerState + cmsis_os2.o(.text.osKernelLock) refers to tasks.o(.text.vTaskSuspendAll) for vTaskSuspendAll + cmsis_os2.o(.ARM.exidx.text.osKernelLock) refers to cmsis_os2.o(.text.osKernelLock) for [Anonymous Symbol] + cmsis_os2.o(.text.osKernelUnlock) refers to tasks.o(.text.xTaskGetSchedulerState) for xTaskGetSchedulerState + cmsis_os2.o(.text.osKernelUnlock) refers to tasks.o(.text.xTaskResumeAll) for xTaskResumeAll + cmsis_os2.o(.ARM.exidx.text.osKernelUnlock) refers to cmsis_os2.o(.text.osKernelUnlock) for [Anonymous Symbol] + cmsis_os2.o(.text.osKernelRestoreLock) refers to tasks.o(.text.xTaskGetSchedulerState) for xTaskGetSchedulerState + cmsis_os2.o(.text.osKernelRestoreLock) refers to tasks.o(.text.vTaskSuspendAll) for vTaskSuspendAll + cmsis_os2.o(.text.osKernelRestoreLock) refers to tasks.o(.text.xTaskResumeAll) for xTaskResumeAll + cmsis_os2.o(.ARM.exidx.text.osKernelRestoreLock) refers to cmsis_os2.o(.text.osKernelRestoreLock) for [Anonymous Symbol] + cmsis_os2.o(.text.osKernelGetTickCount) refers to tasks.o(.text.xTaskGetTickCountFromISR) for xTaskGetTickCountFromISR + cmsis_os2.o(.text.osKernelGetTickCount) refers to tasks.o(.text.xTaskGetTickCount) for xTaskGetTickCount + cmsis_os2.o(.ARM.exidx.text.osKernelGetTickCount) refers to cmsis_os2.o(.text.osKernelGetTickCount) for [Anonymous Symbol] + cmsis_os2.o(.ARM.exidx.text.osKernelGetTickFreq) refers to cmsis_os2.o(.text.osKernelGetTickFreq) for [Anonymous Symbol] + cmsis_os2.o(.text.osKernelGetSysTimerCount) refers to tasks.o(.text.xTaskGetTickCount) for xTaskGetTickCount + cmsis_os2.o(.text.osKernelGetSysTimerCount) refers to cmsis_os2.o(.text.OS_Tick_GetCount) for OS_Tick_GetCount + cmsis_os2.o(.text.osKernelGetSysTimerCount) refers to cmsis_os2.o(.text.OS_Tick_GetOverflow) for OS_Tick_GetOverflow + cmsis_os2.o(.text.osKernelGetSysTimerCount) refers to cmsis_os2.o(.text.OS_Tick_GetInterval) for OS_Tick_GetInterval + cmsis_os2.o(.ARM.exidx.text.osKernelGetSysTimerCount) refers to cmsis_os2.o(.text.osKernelGetSysTimerCount) for [Anonymous Symbol] + cmsis_os2.o(.ARM.exidx.text.OS_Tick_GetCount) refers to cmsis_os2.o(.text.OS_Tick_GetCount) for [Anonymous Symbol] + cmsis_os2.o(.ARM.exidx.text.OS_Tick_GetOverflow) refers to cmsis_os2.o(.text.OS_Tick_GetOverflow) for [Anonymous Symbol] + cmsis_os2.o(.ARM.exidx.text.OS_Tick_GetInterval) refers to cmsis_os2.o(.text.OS_Tick_GetInterval) for [Anonymous Symbol] + cmsis_os2.o(.text.osKernelGetSysTimerFreq) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + cmsis_os2.o(.ARM.exidx.text.osKernelGetSysTimerFreq) refers to cmsis_os2.o(.text.osKernelGetSysTimerFreq) for [Anonymous Symbol] + cmsis_os2.o(.text.osThreadNew) refers to tasks.o(.text.xTaskCreateStatic) for xTaskCreateStatic + cmsis_os2.o(.text.osThreadNew) refers to tasks.o(.text.xTaskCreate) for xTaskCreate + cmsis_os2.o(.ARM.exidx.text.osThreadNew) refers to cmsis_os2.o(.text.osThreadNew) for [Anonymous Symbol] + cmsis_os2.o(.text.osThreadGetName) refers to tasks.o(.text.pcTaskGetName) for pcTaskGetName + cmsis_os2.o(.ARM.exidx.text.osThreadGetName) refers to cmsis_os2.o(.text.osThreadGetName) for [Anonymous Symbol] + cmsis_os2.o(.text.osThreadGetId) refers to tasks.o(.text.xTaskGetCurrentTaskHandle) for xTaskGetCurrentTaskHandle + cmsis_os2.o(.ARM.exidx.text.osThreadGetId) refers to cmsis_os2.o(.text.osThreadGetId) for [Anonymous Symbol] + cmsis_os2.o(.text.osThreadGetState) refers to tasks.o(.text.eTaskGetState) for eTaskGetState + cmsis_os2.o(.ARM.exidx.text.osThreadGetState) refers to cmsis_os2.o(.text.osThreadGetState) for [Anonymous Symbol] + cmsis_os2.o(.text.osThreadGetStackSpace) refers to tasks.o(.text.uxTaskGetStackHighWaterMark) for uxTaskGetStackHighWaterMark + cmsis_os2.o(.ARM.exidx.text.osThreadGetStackSpace) refers to cmsis_os2.o(.text.osThreadGetStackSpace) for [Anonymous Symbol] + cmsis_os2.o(.text.osThreadSetPriority) refers to tasks.o(.text.vTaskPrioritySet) for vTaskPrioritySet + cmsis_os2.o(.ARM.exidx.text.osThreadSetPriority) refers to cmsis_os2.o(.text.osThreadSetPriority) for [Anonymous Symbol] + cmsis_os2.o(.text.osThreadGetPriority) refers to tasks.o(.text.uxTaskPriorityGet) for uxTaskPriorityGet + cmsis_os2.o(.ARM.exidx.text.osThreadGetPriority) refers to cmsis_os2.o(.text.osThreadGetPriority) for [Anonymous Symbol] + cmsis_os2.o(.ARM.exidx.text.osThreadYield) refers to cmsis_os2.o(.text.osThreadYield) for [Anonymous Symbol] + cmsis_os2.o(.text.osThreadSuspend) refers to tasks.o(.text.vTaskSuspend) for vTaskSuspend + cmsis_os2.o(.ARM.exidx.text.osThreadSuspend) refers to cmsis_os2.o(.text.osThreadSuspend) for [Anonymous Symbol] + cmsis_os2.o(.text.osThreadResume) refers to tasks.o(.text.vTaskResume) for vTaskResume + cmsis_os2.o(.ARM.exidx.text.osThreadResume) refers to cmsis_os2.o(.text.osThreadResume) for [Anonymous Symbol] + cmsis_os2.o(.text.osThreadExit) refers to tasks.o(.text.vTaskDelete) for vTaskDelete + cmsis_os2.o(.ARM.exidx.text.osThreadExit) refers to cmsis_os2.o(.text.osThreadExit) for [Anonymous Symbol] + cmsis_os2.o(.text.osThreadTerminate) refers to tasks.o(.text.eTaskGetState) for eTaskGetState + cmsis_os2.o(.text.osThreadTerminate) refers to tasks.o(.text.vTaskDelete) for vTaskDelete + cmsis_os2.o(.ARM.exidx.text.osThreadTerminate) refers to cmsis_os2.o(.text.osThreadTerminate) for [Anonymous Symbol] + cmsis_os2.o(.text.osThreadGetCount) refers to tasks.o(.text.uxTaskGetNumberOfTasks) for uxTaskGetNumberOfTasks + cmsis_os2.o(.ARM.exidx.text.osThreadGetCount) refers to cmsis_os2.o(.text.osThreadGetCount) for [Anonymous Symbol] + cmsis_os2.o(.text.osThreadEnumerate) refers to tasks.o(.text.vTaskSuspendAll) for vTaskSuspendAll + cmsis_os2.o(.text.osThreadEnumerate) refers to tasks.o(.text.uxTaskGetNumberOfTasks) for uxTaskGetNumberOfTasks + cmsis_os2.o(.text.osThreadEnumerate) refers to heap_4.o(.text.pvPortMalloc) for pvPortMalloc + cmsis_os2.o(.text.osThreadEnumerate) refers to tasks.o(.text.uxTaskGetSystemState) for uxTaskGetSystemState + cmsis_os2.o(.text.osThreadEnumerate) refers to tasks.o(.text.xTaskResumeAll) for xTaskResumeAll + cmsis_os2.o(.text.osThreadEnumerate) refers to heap_4.o(.text.vPortFree) for vPortFree + cmsis_os2.o(.ARM.exidx.text.osThreadEnumerate) refers to cmsis_os2.o(.text.osThreadEnumerate) for [Anonymous Symbol] + cmsis_os2.o(.text.osThreadFlagsSet) refers to tasks.o(.text.xTaskGenericNotifyFromISR) for xTaskGenericNotifyFromISR + cmsis_os2.o(.text.osThreadFlagsSet) refers to tasks.o(.text.xTaskGenericNotify) for xTaskGenericNotify + cmsis_os2.o(.ARM.exidx.text.osThreadFlagsSet) refers to cmsis_os2.o(.text.osThreadFlagsSet) for [Anonymous Symbol] + cmsis_os2.o(.text.osThreadFlagsClear) refers to tasks.o(.text.xTaskGetCurrentTaskHandle) for xTaskGetCurrentTaskHandle + cmsis_os2.o(.text.osThreadFlagsClear) refers to tasks.o(.text.xTaskGenericNotify) for xTaskGenericNotify + cmsis_os2.o(.ARM.exidx.text.osThreadFlagsClear) refers to cmsis_os2.o(.text.osThreadFlagsClear) for [Anonymous Symbol] + cmsis_os2.o(.text.osThreadFlagsGet) refers to tasks.o(.text.xTaskGetCurrentTaskHandle) for xTaskGetCurrentTaskHandle + cmsis_os2.o(.text.osThreadFlagsGet) refers to tasks.o(.text.xTaskGenericNotify) for xTaskGenericNotify + cmsis_os2.o(.ARM.exidx.text.osThreadFlagsGet) refers to cmsis_os2.o(.text.osThreadFlagsGet) for [Anonymous Symbol] + cmsis_os2.o(.text.osThreadFlagsWait) refers to tasks.o(.text.xTaskGetTickCount) for xTaskGetTickCount + cmsis_os2.o(.text.osThreadFlagsWait) refers to tasks.o(.text.xTaskNotifyWait) for xTaskNotifyWait + cmsis_os2.o(.ARM.exidx.text.osThreadFlagsWait) refers to cmsis_os2.o(.text.osThreadFlagsWait) for [Anonymous Symbol] + cmsis_os2.o(.text.osDelay) refers to tasks.o(.text.vTaskDelay) for vTaskDelay + cmsis_os2.o(.ARM.exidx.text.osDelay) refers to cmsis_os2.o(.text.osDelay) for [Anonymous Symbol] + cmsis_os2.o(.text.osDelayUntil) refers to tasks.o(.text.xTaskGetTickCount) for xTaskGetTickCount + cmsis_os2.o(.text.osDelayUntil) refers to tasks.o(.text.vTaskDelayUntil) for vTaskDelayUntil + cmsis_os2.o(.ARM.exidx.text.osDelayUntil) refers to cmsis_os2.o(.text.osDelayUntil) for [Anonymous Symbol] + cmsis_os2.o(.text.osTimerNew) refers to heap_4.o(.text.pvPortMalloc) for pvPortMalloc + cmsis_os2.o(.text.osTimerNew) refers to cmsis_os2.o(.text.TimerCallback) for TimerCallback + cmsis_os2.o(.text.osTimerNew) refers to timers.o(.text.xTimerCreateStatic) for xTimerCreateStatic + cmsis_os2.o(.text.osTimerNew) refers to timers.o(.text.xTimerCreate) for xTimerCreate + cmsis_os2.o(.text.osTimerNew) refers to heap_4.o(.text.vPortFree) for vPortFree + cmsis_os2.o(.ARM.exidx.text.osTimerNew) refers to cmsis_os2.o(.text.osTimerNew) for [Anonymous Symbol] + cmsis_os2.o(.text.TimerCallback) refers to timers.o(.text.pvTimerGetTimerID) for pvTimerGetTimerID + cmsis_os2.o(.ARM.exidx.text.TimerCallback) refers to cmsis_os2.o(.text.TimerCallback) for [Anonymous Symbol] + cmsis_os2.o(.text.osTimerGetName) refers to timers.o(.text.pcTimerGetName) for pcTimerGetName + cmsis_os2.o(.ARM.exidx.text.osTimerGetName) refers to cmsis_os2.o(.text.osTimerGetName) for [Anonymous Symbol] + cmsis_os2.o(.text.osTimerStart) refers to timers.o(.text.xTimerGenericCommand) for xTimerGenericCommand + cmsis_os2.o(.ARM.exidx.text.osTimerStart) refers to cmsis_os2.o(.text.osTimerStart) for [Anonymous Symbol] + cmsis_os2.o(.text.osTimerStop) refers to timers.o(.text.xTimerIsTimerActive) for xTimerIsTimerActive + cmsis_os2.o(.text.osTimerStop) refers to timers.o(.text.xTimerGenericCommand) for xTimerGenericCommand + cmsis_os2.o(.ARM.exidx.text.osTimerStop) refers to cmsis_os2.o(.text.osTimerStop) for [Anonymous Symbol] + cmsis_os2.o(.text.osTimerIsRunning) refers to timers.o(.text.xTimerIsTimerActive) for xTimerIsTimerActive + cmsis_os2.o(.ARM.exidx.text.osTimerIsRunning) refers to cmsis_os2.o(.text.osTimerIsRunning) for [Anonymous Symbol] + cmsis_os2.o(.text.osTimerDelete) refers to timers.o(.text.pvTimerGetTimerID) for pvTimerGetTimerID + cmsis_os2.o(.text.osTimerDelete) refers to timers.o(.text.xTimerGenericCommand) for xTimerGenericCommand + cmsis_os2.o(.text.osTimerDelete) refers to heap_4.o(.text.vPortFree) for vPortFree + cmsis_os2.o(.ARM.exidx.text.osTimerDelete) refers to cmsis_os2.o(.text.osTimerDelete) for [Anonymous Symbol] + cmsis_os2.o(.text.osEventFlagsNew) refers to event_groups.o(.text.xEventGroupCreateStatic) for xEventGroupCreateStatic + cmsis_os2.o(.text.osEventFlagsNew) refers to event_groups.o(.text.xEventGroupCreate) for xEventGroupCreate + cmsis_os2.o(.ARM.exidx.text.osEventFlagsNew) refers to cmsis_os2.o(.text.osEventFlagsNew) for [Anonymous Symbol] + cmsis_os2.o(.text.osEventFlagsSet) refers to event_groups.o(.text.xEventGroupSetBitsFromISR) for xEventGroupSetBitsFromISR + cmsis_os2.o(.text.osEventFlagsSet) refers to event_groups.o(.text.xEventGroupSetBits) for xEventGroupSetBits + cmsis_os2.o(.ARM.exidx.text.osEventFlagsSet) refers to cmsis_os2.o(.text.osEventFlagsSet) for [Anonymous Symbol] + cmsis_os2.o(.text.osEventFlagsClear) refers to event_groups.o(.text.xEventGroupGetBitsFromISR) for xEventGroupGetBitsFromISR + cmsis_os2.o(.text.osEventFlagsClear) refers to event_groups.o(.text.xEventGroupClearBitsFromISR) for xEventGroupClearBitsFromISR + cmsis_os2.o(.text.osEventFlagsClear) refers to event_groups.o(.text.xEventGroupClearBits) for xEventGroupClearBits + cmsis_os2.o(.ARM.exidx.text.osEventFlagsClear) refers to cmsis_os2.o(.text.osEventFlagsClear) for [Anonymous Symbol] + cmsis_os2.o(.text.osEventFlagsGet) refers to event_groups.o(.text.xEventGroupGetBitsFromISR) for xEventGroupGetBitsFromISR + cmsis_os2.o(.text.osEventFlagsGet) refers to event_groups.o(.text.xEventGroupClearBits) for xEventGroupClearBits + cmsis_os2.o(.ARM.exidx.text.osEventFlagsGet) refers to cmsis_os2.o(.text.osEventFlagsGet) for [Anonymous Symbol] + cmsis_os2.o(.text.osEventFlagsWait) refers to event_groups.o(.text.xEventGroupWaitBits) for xEventGroupWaitBits + cmsis_os2.o(.ARM.exidx.text.osEventFlagsWait) refers to cmsis_os2.o(.text.osEventFlagsWait) for [Anonymous Symbol] + cmsis_os2.o(.text.osEventFlagsDelete) refers to event_groups.o(.text.vEventGroupDelete) for vEventGroupDelete + cmsis_os2.o(.ARM.exidx.text.osEventFlagsDelete) refers to cmsis_os2.o(.text.osEventFlagsDelete) for [Anonymous Symbol] + cmsis_os2.o(.text.osMutexNew) refers to queue.o(.text.xQueueCreateMutexStatic) for xQueueCreateMutexStatic + cmsis_os2.o(.text.osMutexNew) refers to queue.o(.text.xQueueCreateMutex) for xQueueCreateMutex + cmsis_os2.o(.text.osMutexNew) refers to queue.o(.text.vQueueAddToRegistry) for vQueueAddToRegistry + cmsis_os2.o(.ARM.exidx.text.osMutexNew) refers to cmsis_os2.o(.text.osMutexNew) for [Anonymous Symbol] + cmsis_os2.o(.text.osMutexAcquire) refers to queue.o(.text.xQueueSemaphoreTake) for xQueueSemaphoreTake + cmsis_os2.o(.text.osMutexAcquire) refers to queue.o(.text.xQueueTakeMutexRecursive) for xQueueTakeMutexRecursive + cmsis_os2.o(.ARM.exidx.text.osMutexAcquire) refers to cmsis_os2.o(.text.osMutexAcquire) for [Anonymous Symbol] + cmsis_os2.o(.text.osMutexRelease) refers to queue.o(.text.xQueueGenericSend) for xQueueGenericSend + cmsis_os2.o(.text.osMutexRelease) refers to queue.o(.text.xQueueGiveMutexRecursive) for xQueueGiveMutexRecursive + cmsis_os2.o(.ARM.exidx.text.osMutexRelease) refers to cmsis_os2.o(.text.osMutexRelease) for [Anonymous Symbol] + cmsis_os2.o(.text.osMutexGetOwner) refers to queue.o(.text.xQueueGetMutexHolder) for xQueueGetMutexHolder + cmsis_os2.o(.ARM.exidx.text.osMutexGetOwner) refers to cmsis_os2.o(.text.osMutexGetOwner) for [Anonymous Symbol] + cmsis_os2.o(.text.osMutexDelete) refers to queue.o(.text.vQueueUnregisterQueue) for vQueueUnregisterQueue + cmsis_os2.o(.text.osMutexDelete) refers to queue.o(.text.vQueueDelete) for vQueueDelete + cmsis_os2.o(.ARM.exidx.text.osMutexDelete) refers to cmsis_os2.o(.text.osMutexDelete) for [Anonymous Symbol] + cmsis_os2.o(.text.osSemaphoreNew) refers to queue.o(.text.xQueueGenericCreateStatic) for xQueueGenericCreateStatic + cmsis_os2.o(.text.osSemaphoreNew) refers to queue.o(.text.xQueueCreateCountingSemaphoreStatic) for xQueueCreateCountingSemaphoreStatic + cmsis_os2.o(.text.osSemaphoreNew) refers to queue.o(.text.xQueueGenericCreate) for xQueueGenericCreate + cmsis_os2.o(.text.osSemaphoreNew) refers to queue.o(.text.xQueueGenericSend) for xQueueGenericSend + cmsis_os2.o(.text.osSemaphoreNew) refers to queue.o(.text.vQueueDelete) for vQueueDelete + cmsis_os2.o(.text.osSemaphoreNew) refers to queue.o(.text.xQueueCreateCountingSemaphore) for xQueueCreateCountingSemaphore + cmsis_os2.o(.text.osSemaphoreNew) refers to queue.o(.text.vQueueAddToRegistry) for vQueueAddToRegistry + cmsis_os2.o(.ARM.exidx.text.osSemaphoreNew) refers to cmsis_os2.o(.text.osSemaphoreNew) for [Anonymous Symbol] + cmsis_os2.o(.text.osSemaphoreAcquire) refers to queue.o(.text.xQueueSemaphoreTake) for xQueueSemaphoreTake + cmsis_os2.o(.text.osSemaphoreAcquire) refers to queue.o(.text.xQueueReceiveFromISR) for xQueueReceiveFromISR + cmsis_os2.o(.ARM.exidx.text.osSemaphoreAcquire) refers to cmsis_os2.o(.text.osSemaphoreAcquire) for [Anonymous Symbol] + cmsis_os2.o(.text.osSemaphoreRelease) refers to queue.o(.text.xQueueGiveFromISR) for xQueueGiveFromISR + cmsis_os2.o(.text.osSemaphoreRelease) refers to queue.o(.text.xQueueGenericSend) for xQueueGenericSend + cmsis_os2.o(.ARM.exidx.text.osSemaphoreRelease) refers to cmsis_os2.o(.text.osSemaphoreRelease) for [Anonymous Symbol] + cmsis_os2.o(.text.osSemaphoreGetCount) refers to queue.o(.text.uxQueueMessagesWaitingFromISR) for uxQueueMessagesWaitingFromISR + cmsis_os2.o(.text.osSemaphoreGetCount) refers to queue.o(.text.uxQueueMessagesWaiting) for uxQueueMessagesWaiting + cmsis_os2.o(.ARM.exidx.text.osSemaphoreGetCount) refers to cmsis_os2.o(.text.osSemaphoreGetCount) for [Anonymous Symbol] + cmsis_os2.o(.text.osSemaphoreDelete) refers to queue.o(.text.vQueueUnregisterQueue) for vQueueUnregisterQueue + cmsis_os2.o(.text.osSemaphoreDelete) refers to queue.o(.text.vQueueDelete) for vQueueDelete + cmsis_os2.o(.ARM.exidx.text.osSemaphoreDelete) refers to cmsis_os2.o(.text.osSemaphoreDelete) for [Anonymous Symbol] + cmsis_os2.o(.text.osMessageQueueNew) refers to queue.o(.text.xQueueGenericCreate) for xQueueGenericCreate + cmsis_os2.o(.text.osMessageQueueNew) refers to queue.o(.text.xQueueGenericCreateStatic) for xQueueGenericCreateStatic + cmsis_os2.o(.text.osMessageQueueNew) refers to queue.o(.text.vQueueAddToRegistry) for vQueueAddToRegistry + cmsis_os2.o(.ARM.exidx.text.osMessageQueueNew) refers to cmsis_os2.o(.text.osMessageQueueNew) for [Anonymous Symbol] + cmsis_os2.o(.text.osMessageQueuePut) refers to queue.o(.text.xQueueGenericSendFromISR) for xQueueGenericSendFromISR + cmsis_os2.o(.text.osMessageQueuePut) refers to queue.o(.text.xQueueGenericSend) for xQueueGenericSend + cmsis_os2.o(.ARM.exidx.text.osMessageQueuePut) refers to cmsis_os2.o(.text.osMessageQueuePut) for [Anonymous Symbol] + cmsis_os2.o(.text.osMessageQueueGet) refers to queue.o(.text.xQueueReceiveFromISR) for xQueueReceiveFromISR + cmsis_os2.o(.text.osMessageQueueGet) refers to queue.o(.text.xQueueReceive) for xQueueReceive + cmsis_os2.o(.ARM.exidx.text.osMessageQueueGet) refers to cmsis_os2.o(.text.osMessageQueueGet) for [Anonymous Symbol] + cmsis_os2.o(.ARM.exidx.text.osMessageQueueGetCapacity) refers to cmsis_os2.o(.text.osMessageQueueGetCapacity) for [Anonymous Symbol] + cmsis_os2.o(.ARM.exidx.text.osMessageQueueGetMsgSize) refers to cmsis_os2.o(.text.osMessageQueueGetMsgSize) for [Anonymous Symbol] + cmsis_os2.o(.text.osMessageQueueGetCount) refers to queue.o(.text.uxQueueMessagesWaitingFromISR) for uxQueueMessagesWaitingFromISR + cmsis_os2.o(.text.osMessageQueueGetCount) refers to queue.o(.text.uxQueueMessagesWaiting) for uxQueueMessagesWaiting + cmsis_os2.o(.ARM.exidx.text.osMessageQueueGetCount) refers to cmsis_os2.o(.text.osMessageQueueGetCount) for [Anonymous Symbol] + cmsis_os2.o(.text.osMessageQueueGetSpace) refers to queue.o(.text.uxQueueSpacesAvailable) for uxQueueSpacesAvailable + cmsis_os2.o(.ARM.exidx.text.osMessageQueueGetSpace) refers to cmsis_os2.o(.text.osMessageQueueGetSpace) for [Anonymous Symbol] + cmsis_os2.o(.text.osMessageQueueReset) refers to queue.o(.text.xQueueGenericReset) for xQueueGenericReset + cmsis_os2.o(.ARM.exidx.text.osMessageQueueReset) refers to cmsis_os2.o(.text.osMessageQueueReset) for [Anonymous Symbol] + cmsis_os2.o(.text.osMessageQueueDelete) refers to queue.o(.text.vQueueUnregisterQueue) for vQueueUnregisterQueue + cmsis_os2.o(.text.osMessageQueueDelete) refers to queue.o(.text.vQueueDelete) for vQueueDelete + cmsis_os2.o(.ARM.exidx.text.osMessageQueueDelete) refers to cmsis_os2.o(.text.osMessageQueueDelete) for [Anonymous Symbol] + cmsis_os2.o(.text.osMemoryPoolNew) refers to heap_4.o(.text.pvPortMalloc) for pvPortMalloc + cmsis_os2.o(.text.osMemoryPoolNew) refers to queue.o(.text.xQueueCreateCountingSemaphoreStatic) for xQueueCreateCountingSemaphoreStatic + cmsis_os2.o(.text.osMemoryPoolNew) refers to heap_4.o(.text.vPortFree) for vPortFree + cmsis_os2.o(.ARM.exidx.text.osMemoryPoolNew) refers to cmsis_os2.o(.text.osMemoryPoolNew) for [Anonymous Symbol] + cmsis_os2.o(.ARM.exidx.text.osMemoryPoolGetName) refers to cmsis_os2.o(.text.osMemoryPoolGetName) for [Anonymous Symbol] + cmsis_os2.o(.text.osMemoryPoolAlloc) refers to queue.o(.text.xQueueReceiveFromISR) for xQueueReceiveFromISR + cmsis_os2.o(.text.osMemoryPoolAlloc) refers to cmsis_os2.o(.text.AllocBlock) for AllocBlock + cmsis_os2.o(.text.osMemoryPoolAlloc) refers to cmsis_os2.o(.text.CreateBlock) for CreateBlock + cmsis_os2.o(.text.osMemoryPoolAlloc) refers to queue.o(.text.xQueueSemaphoreTake) for xQueueSemaphoreTake + cmsis_os2.o(.text.osMemoryPoolAlloc) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + cmsis_os2.o(.text.osMemoryPoolAlloc) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + cmsis_os2.o(.ARM.exidx.text.osMemoryPoolAlloc) refers to cmsis_os2.o(.text.osMemoryPoolAlloc) for [Anonymous Symbol] + cmsis_os2.o(.ARM.exidx.text.AllocBlock) refers to cmsis_os2.o(.text.AllocBlock) for [Anonymous Symbol] + cmsis_os2.o(.ARM.exidx.text.CreateBlock) refers to cmsis_os2.o(.text.CreateBlock) for [Anonymous Symbol] + cmsis_os2.o(.text.osMemoryPoolFree) refers to queue.o(.text.uxQueueMessagesWaitingFromISR) for uxQueueMessagesWaitingFromISR + cmsis_os2.o(.text.osMemoryPoolFree) refers to queue.o(.text.uxQueueMessagesWaiting) for uxQueueMessagesWaiting + cmsis_os2.o(.text.osMemoryPoolFree) refers to cmsis_os2.o(.text.FreeBlock) for FreeBlock + cmsis_os2.o(.text.osMemoryPoolFree) refers to queue.o(.text.xQueueGiveFromISR) for xQueueGiveFromISR + cmsis_os2.o(.text.osMemoryPoolFree) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + cmsis_os2.o(.text.osMemoryPoolFree) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + cmsis_os2.o(.text.osMemoryPoolFree) refers to queue.o(.text.xQueueGenericSend) for xQueueGenericSend + cmsis_os2.o(.ARM.exidx.text.osMemoryPoolFree) refers to cmsis_os2.o(.text.osMemoryPoolFree) for [Anonymous Symbol] + cmsis_os2.o(.ARM.exidx.text.FreeBlock) refers to cmsis_os2.o(.text.FreeBlock) for [Anonymous Symbol] + cmsis_os2.o(.ARM.exidx.text.osMemoryPoolGetCapacity) refers to cmsis_os2.o(.text.osMemoryPoolGetCapacity) for [Anonymous Symbol] + cmsis_os2.o(.ARM.exidx.text.osMemoryPoolGetBlockSize) refers to cmsis_os2.o(.text.osMemoryPoolGetBlockSize) for [Anonymous Symbol] + cmsis_os2.o(.text.osMemoryPoolGetCount) refers to queue.o(.text.uxQueueMessagesWaitingFromISR) for uxQueueMessagesWaitingFromISR + cmsis_os2.o(.text.osMemoryPoolGetCount) refers to queue.o(.text.uxQueueMessagesWaiting) for uxQueueMessagesWaiting + cmsis_os2.o(.ARM.exidx.text.osMemoryPoolGetCount) refers to cmsis_os2.o(.text.osMemoryPoolGetCount) for [Anonymous Symbol] + cmsis_os2.o(.text.osMemoryPoolGetSpace) refers to queue.o(.text.uxQueueMessagesWaitingFromISR) for uxQueueMessagesWaitingFromISR + cmsis_os2.o(.text.osMemoryPoolGetSpace) refers to queue.o(.text.uxQueueMessagesWaiting) for uxQueueMessagesWaiting + cmsis_os2.o(.ARM.exidx.text.osMemoryPoolGetSpace) refers to cmsis_os2.o(.text.osMemoryPoolGetSpace) for [Anonymous Symbol] + cmsis_os2.o(.text.osMemoryPoolDelete) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + cmsis_os2.o(.text.osMemoryPoolDelete) refers to queue.o(.text.xQueueGenericSend) for xQueueGenericSend + cmsis_os2.o(.text.osMemoryPoolDelete) refers to heap_4.o(.text.vPortFree) for vPortFree + cmsis_os2.o(.text.osMemoryPoolDelete) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + cmsis_os2.o(.ARM.exidx.text.osMemoryPoolDelete) refers to cmsis_os2.o(.text.osMemoryPoolDelete) for [Anonymous Symbol] + cmsis_os2.o(.text.vApplicationGetIdleTaskMemory) refers to cmsis_os2.o(.bss.vApplicationGetIdleTaskMemory.Idle_TCB) for vApplicationGetIdleTaskMemory.Idle_TCB + cmsis_os2.o(.text.vApplicationGetIdleTaskMemory) refers to cmsis_os2.o(.bss.vApplicationGetIdleTaskMemory.Idle_Stack) for vApplicationGetIdleTaskMemory.Idle_Stack + cmsis_os2.o(.ARM.exidx.text.vApplicationGetIdleTaskMemory) refers to cmsis_os2.o(.text.vApplicationGetIdleTaskMemory) for [Anonymous Symbol] + cmsis_os2.o(.text.vApplicationGetTimerTaskMemory) refers to cmsis_os2.o(.bss.vApplicationGetTimerTaskMemory.Timer_TCB) for vApplicationGetTimerTaskMemory.Timer_TCB + cmsis_os2.o(.text.vApplicationGetTimerTaskMemory) refers to cmsis_os2.o(.bss.vApplicationGetTimerTaskMemory.Timer_Stack) for vApplicationGetTimerTaskMemory.Timer_Stack + cmsis_os2.o(.ARM.exidx.text.vApplicationGetTimerTaskMemory) refers to cmsis_os2.o(.text.vApplicationGetTimerTaskMemory) for [Anonymous Symbol] + cmsis_os2.o(.ARM.exidx.text.__NVIC_SetPriority) refers to cmsis_os2.o(.text.__NVIC_SetPriority) for [Anonymous Symbol] + heap_4.o(.text.pvPortMalloc) refers to tasks.o(.text.vTaskSuspendAll) for vTaskSuspendAll + heap_4.o(.text.pvPortMalloc) refers to heap_4.o(.bss.pxEnd) for pxEnd + heap_4.o(.text.pvPortMalloc) refers to heap_4.o(.text.prvHeapInit) for prvHeapInit + heap_4.o(.text.pvPortMalloc) refers to heap_4.o(.bss.xBlockAllocatedBit) for xBlockAllocatedBit + heap_4.o(.text.pvPortMalloc) refers to tasks.o(.text.xTaskResumeAll) for xTaskResumeAll + heap_4.o(.text.pvPortMalloc) refers to heap_4.o(.bss.xFreeBytesRemaining) for xFreeBytesRemaining + heap_4.o(.text.pvPortMalloc) refers to heap_4.o(.bss.xStart) for xStart + heap_4.o(.text.pvPortMalloc) refers to heap_4.o(.text.prvInsertBlockIntoFreeList) for prvInsertBlockIntoFreeList + heap_4.o(.text.pvPortMalloc) refers to heap_4.o(.bss.xMinimumEverFreeBytesRemaining) for xMinimumEverFreeBytesRemaining + heap_4.o(.text.pvPortMalloc) refers to heap_4.o(.bss.xNumberOfSuccessfulAllocations) for xNumberOfSuccessfulAllocations + heap_4.o(.ARM.exidx.text.pvPortMalloc) refers to heap_4.o(.text.pvPortMalloc) for [Anonymous Symbol] + heap_4.o(.text.prvHeapInit) refers to heap_4.o(.bss.ucHeap) for ucHeap + heap_4.o(.text.prvHeapInit) refers to heap_4.o(.bss.xStart) for xStart + heap_4.o(.text.prvHeapInit) refers to heap_4.o(.bss.pxEnd) for pxEnd + heap_4.o(.text.prvHeapInit) refers to heap_4.o(.bss.xMinimumEverFreeBytesRemaining) for xMinimumEverFreeBytesRemaining + heap_4.o(.text.prvHeapInit) refers to heap_4.o(.bss.xFreeBytesRemaining) for xFreeBytesRemaining + heap_4.o(.text.prvHeapInit) refers to heap_4.o(.bss.xBlockAllocatedBit) for xBlockAllocatedBit + heap_4.o(.ARM.exidx.text.prvHeapInit) refers to heap_4.o(.text.prvHeapInit) for [Anonymous Symbol] + heap_4.o(.text.prvInsertBlockIntoFreeList) refers to heap_4.o(.bss.xStart) for xStart + heap_4.o(.text.prvInsertBlockIntoFreeList) refers to heap_4.o(.bss.pxEnd) for pxEnd + heap_4.o(.ARM.exidx.text.prvInsertBlockIntoFreeList) refers to heap_4.o(.text.prvInsertBlockIntoFreeList) for [Anonymous Symbol] + heap_4.o(.text.vPortFree) refers to heap_4.o(.bss.xBlockAllocatedBit) for xBlockAllocatedBit + heap_4.o(.text.vPortFree) refers to tasks.o(.text.vTaskSuspendAll) for vTaskSuspendAll + heap_4.o(.text.vPortFree) refers to heap_4.o(.bss.xFreeBytesRemaining) for xFreeBytesRemaining + heap_4.o(.text.vPortFree) refers to heap_4.o(.text.prvInsertBlockIntoFreeList) for prvInsertBlockIntoFreeList + heap_4.o(.text.vPortFree) refers to heap_4.o(.bss.xNumberOfSuccessfulFrees) for xNumberOfSuccessfulFrees + heap_4.o(.text.vPortFree) refers to tasks.o(.text.xTaskResumeAll) for xTaskResumeAll + heap_4.o(.ARM.exidx.text.vPortFree) refers to heap_4.o(.text.vPortFree) for [Anonymous Symbol] + heap_4.o(.text.xPortGetFreeHeapSize) refers to heap_4.o(.bss.xFreeBytesRemaining) for xFreeBytesRemaining + heap_4.o(.ARM.exidx.text.xPortGetFreeHeapSize) refers to heap_4.o(.text.xPortGetFreeHeapSize) for [Anonymous Symbol] + heap_4.o(.text.xPortGetMinimumEverFreeHeapSize) refers to heap_4.o(.bss.xMinimumEverFreeBytesRemaining) for xMinimumEverFreeBytesRemaining + heap_4.o(.ARM.exidx.text.xPortGetMinimumEverFreeHeapSize) refers to heap_4.o(.text.xPortGetMinimumEverFreeHeapSize) for [Anonymous Symbol] + heap_4.o(.ARM.exidx.text.vPortInitialiseBlocks) refers to heap_4.o(.text.vPortInitialiseBlocks) for [Anonymous Symbol] + heap_4.o(.text.vPortGetHeapStats) refers to tasks.o(.text.vTaskSuspendAll) for vTaskSuspendAll + heap_4.o(.text.vPortGetHeapStats) refers to heap_4.o(.bss.xStart) for xStart + heap_4.o(.text.vPortGetHeapStats) refers to heap_4.o(.bss.pxEnd) for pxEnd + heap_4.o(.text.vPortGetHeapStats) refers to tasks.o(.text.xTaskResumeAll) for xTaskResumeAll + heap_4.o(.text.vPortGetHeapStats) refers to port.o(.text.vPortEnterCritical) for vPortEnterCritical + heap_4.o(.text.vPortGetHeapStats) refers to heap_4.o(.bss.xFreeBytesRemaining) for xFreeBytesRemaining + heap_4.o(.text.vPortGetHeapStats) refers to heap_4.o(.bss.xMinimumEverFreeBytesRemaining) for xMinimumEverFreeBytesRemaining + heap_4.o(.text.vPortGetHeapStats) refers to heap_4.o(.bss.xNumberOfSuccessfulAllocations) for xNumberOfSuccessfulAllocations + heap_4.o(.text.vPortGetHeapStats) refers to heap_4.o(.bss.xNumberOfSuccessfulFrees) for xNumberOfSuccessfulFrees + heap_4.o(.text.vPortGetHeapStats) refers to port.o(.text.vPortExitCritical) for vPortExitCritical + heap_4.o(.ARM.exidx.text.vPortGetHeapStats) refers to heap_4.o(.text.vPortGetHeapStats) for [Anonymous Symbol] + port.o(.text.pxPortInitialiseStack) refers to port.o(.text.prvTaskExitError) for prvTaskExitError + port.o(.ARM.exidx.text.pxPortInitialiseStack) refers to port.o(.text.pxPortInitialiseStack) for [Anonymous Symbol] + port.o(.text.prvTaskExitError) refers to port.o(.data.uxCriticalNesting) for uxCriticalNesting + port.o(.ARM.exidx.text.prvTaskExitError) refers to port.o(.text.prvTaskExitError) for [Anonymous Symbol] + port.o(.text.SVC_Handler) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + port.o(.ARM.exidx.text.SVC_Handler) refers to port.o(.text.SVC_Handler) for [Anonymous Symbol] + port.o(.text.xPortStartScheduler) refers to port.o(.bss.ucMaxSysCallPriority) for ucMaxSysCallPriority + port.o(.text.xPortStartScheduler) refers to port.o(.bss.ulMaxPRIGROUPValue) for ulMaxPRIGROUPValue + port.o(.text.xPortStartScheduler) refers to port.o(.text.vPortSetupTimerInterrupt) for vPortSetupTimerInterrupt + port.o(.text.xPortStartScheduler) refers to port.o(.data.uxCriticalNesting) for uxCriticalNesting + port.o(.text.xPortStartScheduler) refers to port.o(.text.vPortEnableVFP) for vPortEnableVFP + port.o(.text.xPortStartScheduler) refers to port.o(.text.prvPortStartFirstTask) for prvPortStartFirstTask + port.o(.text.xPortStartScheduler) refers to tasks.o(.text.vTaskSwitchContext) for vTaskSwitchContext + port.o(.text.xPortStartScheduler) refers to port.o(.text.prvTaskExitError) for prvTaskExitError + port.o(.ARM.exidx.text.xPortStartScheduler) refers to port.o(.text.xPortStartScheduler) for [Anonymous Symbol] + port.o(.text.vPortSetupTimerInterrupt) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + port.o(.ARM.exidx.text.vPortSetupTimerInterrupt) refers to port.o(.text.vPortSetupTimerInterrupt) for [Anonymous Symbol] + port.o(.ARM.exidx.text.vPortEnableVFP) refers to port.o(.text.vPortEnableVFP) for [Anonymous Symbol] + port.o(.ARM.exidx.text.prvPortStartFirstTask) refers to port.o(.text.prvPortStartFirstTask) for [Anonymous Symbol] + port.o(.text.vPortEndScheduler) refers to port.o(.data.uxCriticalNesting) for uxCriticalNesting + port.o(.ARM.exidx.text.vPortEndScheduler) refers to port.o(.text.vPortEndScheduler) for [Anonymous Symbol] + port.o(.text.vPortEnterCritical) refers to port.o(.data.uxCriticalNesting) for uxCriticalNesting + port.o(.ARM.exidx.text.vPortEnterCritical) refers to port.o(.text.vPortEnterCritical) for [Anonymous Symbol] + port.o(.text.vPortExitCritical) refers to port.o(.data.uxCriticalNesting) for uxCriticalNesting + port.o(.ARM.exidx.text.vPortExitCritical) refers to port.o(.text.vPortExitCritical) for [Anonymous Symbol] + port.o(.text.PendSV_Handler) refers to tasks.o(.text.vTaskSwitchContext) for vTaskSwitchContext + port.o(.text.PendSV_Handler) refers to tasks.o(.bss.pxCurrentTCB) for pxCurrentTCB + port.o(.ARM.exidx.text.PendSV_Handler) refers to port.o(.text.PendSV_Handler) for [Anonymous Symbol] + port.o(.text.xPortSysTickHandler) refers to tasks.o(.text.xTaskIncrementTick) for xTaskIncrementTick + port.o(.ARM.exidx.text.xPortSysTickHandler) refers to port.o(.text.xPortSysTickHandler) for [Anonymous Symbol] + port.o(.text.vPortValidateInterruptPriority) refers to port.o(.bss.ucMaxSysCallPriority) for ucMaxSysCallPriority + port.o(.text.vPortValidateInterruptPriority) refers to port.o(.bss.ulMaxPRIGROUPValue) for ulMaxPRIGROUPValue + port.o(.ARM.exidx.text.vPortValidateInterruptPriority) refers to port.o(.text.vPortValidateInterruptPriority) for [Anonymous Symbol] + buzzer_pwm.o(.text.BSP_BUZ_GetTIMxFrequency) refers to stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetPCLK1Freq) for HAL_RCC_GetPCLK1Freq + buzzer_pwm.o(.text.BSP_BUZ_GetTIMxFrequency) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + buzzer_pwm.o(.ARM.exidx.text.BSP_BUZ_GetTIMxFrequency) refers to buzzer_pwm.o(.text.BSP_BUZ_GetTIMxFrequency) for [Anonymous Symbol] + buzzer_pwm.o(.text.BSP_BUZZER_Start) refers to buzzer_pwm.o(.data.bsp_buzzer_ch) for bsp_buzzer_ch + buzzer_pwm.o(.text.BSP_BUZZER_Start) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Start) for HAL_TIM_PWM_Start + buzzer_pwm.o(.ARM.exidx.text.BSP_BUZZER_Start) refers to buzzer_pwm.o(.text.BSP_BUZZER_Start) for [Anonymous Symbol] + buzzer_pwm.o(.text.BSP_BUZZER_Stop) refers to buzzer_pwm.o(.data.bsp_buzzer_ch) for bsp_buzzer_ch + buzzer_pwm.o(.text.BSP_BUZZER_Stop) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Stop) for HAL_TIM_PWM_Stop + buzzer_pwm.o(.ARM.exidx.text.BSP_BUZZER_Stop) refers to buzzer_pwm.o(.text.BSP_BUZZER_Stop) for [Anonymous Symbol] + buzzer_pwm.o(.text.BSP_BUZZER_Set_Duty_Cycle) refers to buzzer_pwm.o(.data.bsp_buzzer_ch) for bsp_buzzer_ch + buzzer_pwm.o(.ARM.exidx.text.BSP_BUZZER_Set_Duty_Cycle) refers to buzzer_pwm.o(.text.BSP_BUZZER_Set_Duty_Cycle) for [Anonymous Symbol] + buzzer_pwm.o(.text.BSP_BUZZER_Set_Freq) refers to buzzer_pwm.o(.text.BSP_BUZZER_Stop) for BSP_BUZZER_Stop + buzzer_pwm.o(.text.BSP_BUZZER_Set_Freq) refers to buzzer_pwm.o(.data.bsp_buzzer_ch) for bsp_buzzer_ch + buzzer_pwm.o(.text.BSP_BUZZER_Set_Freq) refers to dflt_clz.o(x$fpl$dfltu) for __aeabi_ui2d + buzzer_pwm.o(.text.BSP_BUZZER_Set_Freq) refers to dmul.o(x$fpl$dmul) for __aeabi_dmul + buzzer_pwm.o(.text.BSP_BUZZER_Set_Freq) refers to dfixu.o(x$fpl$dfixu) for __aeabi_d2uiz + buzzer_pwm.o(.text.BSP_BUZZER_Set_Freq) refers to buzzer_pwm.o(.text.BSP_BUZZER_Start) for BSP_BUZZER_Start + buzzer_pwm.o(.ARM.exidx.text.BSP_BUZZER_Set_Freq) refers to buzzer_pwm.o(.text.BSP_BUZZER_Set_Freq) for [Anonymous Symbol] + buzzer_pwm.o(.text.BSP_BUZZER_Set) refers to buzzer_pwm.o(.text.BSP_BUZZER_Start) for BSP_BUZZER_Start + buzzer_pwm.o(.text.BSP_BUZZER_Set) refers to buzzer_pwm.o(.bss.bsp_buzzer_s_flag) for bsp_buzzer_s_flag + buzzer_pwm.o(.text.BSP_BUZZER_Set) refers to buzzer_pwm.o(.data.bsp_buzzer_ch) for bsp_buzzer_ch + buzzer_pwm.o(.text.BSP_BUZZER_Set) refers to buzzer_pwm.o(.text.BSP_BUZ_GetTIMxFrequency) for BSP_BUZ_GetTIMxFrequency + buzzer_pwm.o(.text.BSP_BUZZER_Set) refers to buzzer_pwm.o(.text.BSP_BUZZER_Set_Freq) for BSP_BUZZER_Set_Freq + buzzer_pwm.o(.text.BSP_BUZZER_Set) refers to buzzer_pwm.o(.text.BSP_BUZZER_Set_Duty_Cycle) for BSP_BUZZER_Set_Duty_Cycle + buzzer_pwm.o(.text.BSP_BUZZER_Set) refers to buzzer_pwm.o(.text.BSP_BUZZER_Stop) for BSP_BUZZER_Stop + buzzer_pwm.o(.ARM.exidx.text.BSP_BUZZER_Set) refers to buzzer_pwm.o(.text.BSP_BUZZER_Set) for [Anonymous Symbol] + buzzer_pwm.o(.text.Buzzer_On) refers to tim.o(.bss.htim4) for htim4 + buzzer_pwm.o(.text.Buzzer_On) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Start) for HAL_TIM_PWM_Start + buzzer_pwm.o(.ARM.exidx.text.Buzzer_On) refers to buzzer_pwm.o(.text.Buzzer_On) for [Anonymous Symbol] + buzzer_pwm.o(.text.Buzzer_Off) refers to tim.o(.bss.htim4) for htim4 + buzzer_pwm.o(.text.Buzzer_Off) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Stop) for HAL_TIM_PWM_Stop + buzzer_pwm.o(.ARM.exidx.text.Buzzer_Off) refers to buzzer_pwm.o(.text.Buzzer_Off) for [Anonymous Symbol] + buzzer_pwm.o(.data.bsp_buzzer_ch) refers to tim.o(.bss.htim4) for htim4 + delay.o(.text.BSP_Delay) refers to cmsis_os2.o(.text.osKernelGetTickFreq) for osKernelGetTickFreq + delay.o(.text.BSP_Delay) refers to cmsis_os2.o(.text.osKernelGetState) for osKernelGetState + delay.o(.text.BSP_Delay) refers to stm32f4xx_hal.o(.text.HAL_Delay) for HAL_Delay + delay.o(.text.BSP_Delay) refers to cmsis_os2.o(.text.osDelay) for osDelay + delay.o(.ARM.exidx.text.BSP_Delay) refers to delay.o(.text.BSP_Delay) for [Anonymous Symbol] + delay.o(.text.BSP_Delay_Init) refers to system_stm32f4xx.o(.data.SystemCoreClock) for SystemCoreClock + delay.o(.text.BSP_Delay_Init) refers to delay.o(.bss.fac_us) for fac_us + delay.o(.text.BSP_Delay_Init) refers to delay.o(.bss.fac_ms) for fac_ms + delay.o(.ARM.exidx.text.BSP_Delay_Init) refers to delay.o(.text.BSP_Delay_Init) for [Anonymous Symbol] + delay.o(.text.BSP_Delay_us) refers to delay.o(.bss.fac_us) for fac_us + delay.o(.text.BSP_Delay_us) refers to delay.o(.text.delay_ticks) for delay_ticks + delay.o(.ARM.exidx.text.BSP_Delay_us) refers to delay.o(.text.BSP_Delay_us) for [Anonymous Symbol] + delay.o(.ARM.exidx.text.delay_ticks) refers to delay.o(.text.delay_ticks) for [Anonymous Symbol] + delay.o(.text.BSP_Delay_ms) refers to delay.o(.bss.fac_ms) for fac_ms + delay.o(.text.BSP_Delay_ms) refers to delay.o(.text.delay_ticks) for delay_ticks + delay.o(.ARM.exidx.text.BSP_Delay_ms) refers to delay.o(.text.BSP_Delay_ms) for [Anonymous Symbol] + dwt.o(.text.DWT_Init) refers to dwt.o(.bss.CPU_FREQ_Hz) for CPU_FREQ_Hz + dwt.o(.text.DWT_Init) refers to dwt.o(.bss.CPU_FREQ_Hz_ms) for CPU_FREQ_Hz_ms + dwt.o(.text.DWT_Init) refers to dwt.o(.bss.CPU_FREQ_Hz_us) for CPU_FREQ_Hz_us + dwt.o(.text.DWT_Init) refers to dwt.o(.bss.CYCCNT_RountCount) for CYCCNT_RountCount + dwt.o(.ARM.exidx.text.DWT_Init) refers to dwt.o(.text.DWT_Init) for [Anonymous Symbol] + dwt.o(.text.DWT_GetDeltaT) refers to dwt.o(.bss.CPU_FREQ_Hz) for CPU_FREQ_Hz + dwt.o(.text.DWT_GetDeltaT) refers to dwt.o(.text.DWT_CNT_Update) for DWT_CNT_Update + dwt.o(.ARM.exidx.text.DWT_GetDeltaT) refers to dwt.o(.text.DWT_GetDeltaT) for [Anonymous Symbol] + dwt.o(.text.DWT_CNT_Update) refers to dwt.o(.bss.CYCCNT_LAST) for CYCCNT_LAST + dwt.o(.text.DWT_CNT_Update) refers to dwt.o(.bss.CYCCNT_RountCount) for CYCCNT_RountCount + dwt.o(.ARM.exidx.text.DWT_CNT_Update) refers to dwt.o(.text.DWT_CNT_Update) for [Anonymous Symbol] + dwt.o(.text.DWT_GetDeltaT64) refers to dflt_clz.o(x$fpl$dfltu) for __aeabi_ui2d + dwt.o(.text.DWT_GetDeltaT64) refers to dwt.o(.bss.CPU_FREQ_Hz) for CPU_FREQ_Hz + dwt.o(.text.DWT_GetDeltaT64) refers to dwt.o(.text.DWT_CNT_Update) for DWT_CNT_Update + dwt.o(.text.DWT_GetDeltaT64) refers to ddiv.o(x$fpl$ddiv) for __aeabi_ddiv + dwt.o(.ARM.exidx.text.DWT_GetDeltaT64) refers to dwt.o(.text.DWT_GetDeltaT64) for [Anonymous Symbol] + dwt.o(.text.DWT_SysTimeUpdate) refers to dwt.o(.text.DWT_CNT_Update) for DWT_CNT_Update + dwt.o(.text.DWT_SysTimeUpdate) refers to dwt.o(.bss.CYCCNT_RountCount) for CYCCNT_RountCount + dwt.o(.text.DWT_SysTimeUpdate) refers to dwt.o(.bss.CPU_FREQ_Hz) for CPU_FREQ_Hz + dwt.o(.text.DWT_SysTimeUpdate) refers to dwt.o(.bss.CYCCNT64) for CYCCNT64 + dwt.o(.text.DWT_SysTimeUpdate) refers to lludivv7m.o(.text) for __aeabi_uldivmod + dwt.o(.text.DWT_SysTimeUpdate) refers to dwt.o(.bss.CPU_FREQ_Hz_ms) for CPU_FREQ_Hz_ms + dwt.o(.text.DWT_SysTimeUpdate) refers to dwt.o(.bss.SysTime) for SysTime + dwt.o(.text.DWT_SysTimeUpdate) refers to dwt.o(.bss.CPU_FREQ_Hz_us) for CPU_FREQ_Hz_us + dwt.o(.ARM.exidx.text.DWT_SysTimeUpdate) refers to dwt.o(.text.DWT_SysTimeUpdate) for [Anonymous Symbol] + dwt.o(.text.DWT_GetTimeline_s) refers to dwt.o(.text.DWT_SysTimeUpdate) for DWT_SysTimeUpdate + dwt.o(.text.DWT_GetTimeline_s) refers to dwt.o(.bss.SysTime) for SysTime + dwt.o(.ARM.exidx.text.DWT_GetTimeline_s) refers to dwt.o(.text.DWT_GetTimeline_s) for [Anonymous Symbol] + dwt.o(.text.DWT_GetTimeline_ms) refers to dwt.o(.text.DWT_SysTimeUpdate) for DWT_SysTimeUpdate + dwt.o(.text.DWT_GetTimeline_ms) refers to dwt.o(.bss.SysTime) for SysTime + dwt.o(.ARM.exidx.text.DWT_GetTimeline_ms) refers to dwt.o(.text.DWT_GetTimeline_ms) for [Anonymous Symbol] + dwt.o(.text.DWT_GetTimeline_us) refers to dwt.o(.text.DWT_SysTimeUpdate) for DWT_SysTimeUpdate + dwt.o(.text.DWT_GetTimeline_us) refers to dwt.o(.bss.SysTime) for SysTime + dwt.o(.ARM.exidx.text.DWT_GetTimeline_us) refers to dwt.o(.text.DWT_GetTimeline_us) for [Anonymous Symbol] + dwt.o(.text.DWT_Delay) refers to dwt.o(.bss.CPU_FREQ_Hz) for CPU_FREQ_Hz + dwt.o(.ARM.exidx.text.DWT_Delay) refers to dwt.o(.text.DWT_Delay) for [Anonymous Symbol] + gpio_1.o(.text.HAL_GPIO_EXTI_Callback) refers to gpio_1.o(.bss.GPIO_Callback) for GPIO_Callback + gpio_1.o(.ARM.exidx.text.HAL_GPIO_EXTI_Callback) refers to gpio_1.o(.text.HAL_GPIO_EXTI_Callback) for [Anonymous Symbol] + gpio_1.o(.text.BSP_GPIO_RegisterCallback) refers to gpio_1.o(.bss.GPIO_Callback) for GPIO_Callback + gpio_1.o(.ARM.exidx.text.BSP_GPIO_RegisterCallback) refers to gpio_1.o(.text.BSP_GPIO_RegisterCallback) for [Anonymous Symbol] + gpio_1.o(.text.BSP_GPIO_EnableIRQ) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_EnableIRQ) for HAL_NVIC_EnableIRQ + gpio_1.o(.ARM.exidx.text.BSP_GPIO_EnableIRQ) refers to gpio_1.o(.text.BSP_GPIO_EnableIRQ) for [Anonymous Symbol] + gpio_1.o(.text.BSP_GPIO_DisableIRQ) refers to stm32f4xx_hal_cortex.o(.text.HAL_NVIC_DisableIRQ) for HAL_NVIC_DisableIRQ + gpio_1.o(.ARM.exidx.text.BSP_GPIO_DisableIRQ) refers to gpio_1.o(.text.BSP_GPIO_DisableIRQ) for [Anonymous Symbol] + i2c_1.o(.text.HAL_I2C_MasterTxCpltCallback) refers to i2c_1.o(.text.I2C_Get) for I2C_Get + i2c_1.o(.text.HAL_I2C_MasterTxCpltCallback) refers to i2c_1.o(.bss.I2C_Callback) for I2C_Callback + i2c_1.o(.ARM.exidx.text.HAL_I2C_MasterTxCpltCallback) refers to i2c_1.o(.text.HAL_I2C_MasterTxCpltCallback) for [Anonymous Symbol] + i2c_1.o(.ARM.exidx.text.I2C_Get) refers to i2c_1.o(.text.I2C_Get) for [Anonymous Symbol] + i2c_1.o(.text.HAL_I2C_MasterRxCpltCallback) refers to i2c_1.o(.text.I2C_Get) for I2C_Get + i2c_1.o(.text.HAL_I2C_MasterRxCpltCallback) refers to i2c_1.o(.bss.I2C_Callback) for I2C_Callback + i2c_1.o(.ARM.exidx.text.HAL_I2C_MasterRxCpltCallback) refers to i2c_1.o(.text.HAL_I2C_MasterRxCpltCallback) for [Anonymous Symbol] + i2c_1.o(.text.HAL_I2C_SlaveTxCpltCallback) refers to i2c_1.o(.text.I2C_Get) for I2C_Get + i2c_1.o(.text.HAL_I2C_SlaveTxCpltCallback) refers to i2c_1.o(.bss.I2C_Callback) for I2C_Callback + i2c_1.o(.ARM.exidx.text.HAL_I2C_SlaveTxCpltCallback) refers to i2c_1.o(.text.HAL_I2C_SlaveTxCpltCallback) for [Anonymous Symbol] + i2c_1.o(.text.HAL_I2C_SlaveRxCpltCallback) refers to i2c_1.o(.text.I2C_Get) for I2C_Get + i2c_1.o(.text.HAL_I2C_SlaveRxCpltCallback) refers to i2c_1.o(.bss.I2C_Callback) for I2C_Callback + i2c_1.o(.ARM.exidx.text.HAL_I2C_SlaveRxCpltCallback) refers to i2c_1.o(.text.HAL_I2C_SlaveRxCpltCallback) for [Anonymous Symbol] + i2c_1.o(.text.HAL_I2C_ListenCpltCallback) refers to i2c_1.o(.text.I2C_Get) for I2C_Get + i2c_1.o(.text.HAL_I2C_ListenCpltCallback) refers to i2c_1.o(.bss.I2C_Callback) for I2C_Callback + i2c_1.o(.ARM.exidx.text.HAL_I2C_ListenCpltCallback) refers to i2c_1.o(.text.HAL_I2C_ListenCpltCallback) for [Anonymous Symbol] + i2c_1.o(.text.HAL_I2C_MemTxCpltCallback) refers to i2c_1.o(.text.I2C_Get) for I2C_Get + i2c_1.o(.text.HAL_I2C_MemTxCpltCallback) refers to i2c_1.o(.bss.I2C_Callback) for I2C_Callback + i2c_1.o(.ARM.exidx.text.HAL_I2C_MemTxCpltCallback) refers to i2c_1.o(.text.HAL_I2C_MemTxCpltCallback) for [Anonymous Symbol] + i2c_1.o(.text.HAL_I2C_MemRxCpltCallback) refers to i2c_1.o(.text.I2C_Get) for I2C_Get + i2c_1.o(.text.HAL_I2C_MemRxCpltCallback) refers to i2c_1.o(.bss.I2C_Callback) for I2C_Callback + i2c_1.o(.ARM.exidx.text.HAL_I2C_MemRxCpltCallback) refers to i2c_1.o(.text.HAL_I2C_MemRxCpltCallback) for [Anonymous Symbol] + i2c_1.o(.text.HAL_I2C_ErrorCallback) refers to i2c_1.o(.text.I2C_Get) for I2C_Get + i2c_1.o(.text.HAL_I2C_ErrorCallback) refers to i2c_1.o(.bss.I2C_Callback) for I2C_Callback + i2c_1.o(.ARM.exidx.text.HAL_I2C_ErrorCallback) refers to i2c_1.o(.text.HAL_I2C_ErrorCallback) for [Anonymous Symbol] + i2c_1.o(.text.HAL_I2C_AbortCpltCallback) refers to i2c_1.o(.text.I2C_Get) for I2C_Get + i2c_1.o(.text.HAL_I2C_AbortCpltCallback) refers to i2c_1.o(.bss.I2C_Callback) for I2C_Callback + i2c_1.o(.ARM.exidx.text.HAL_I2C_AbortCpltCallback) refers to i2c_1.o(.text.HAL_I2C_AbortCpltCallback) for [Anonymous Symbol] + i2c_1.o(.text.BSP_I2C_GetHandle) refers to i2c.o(.bss.hi2c3) for hi2c3 + i2c_1.o(.ARM.exidx.text.BSP_I2C_GetHandle) refers to i2c_1.o(.text.BSP_I2C_GetHandle) for [Anonymous Symbol] + i2c_1.o(.text.BSP_I2C_RegisterCallback) refers to i2c_1.o(.bss.I2C_Callback) for I2C_Callback + i2c_1.o(.ARM.exidx.text.BSP_I2C_RegisterCallback) refers to i2c_1.o(.text.BSP_I2C_RegisterCallback) for [Anonymous Symbol] + led_pwm.o(.text.BSP_LED_Start) refers to led_pwm.o(.data.bsp_led_channel_config) for bsp_led_channel_config + led_pwm.o(.text.BSP_LED_Start) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Start) for HAL_TIM_PWM_Start + led_pwm.o(.ARM.exidx.text.BSP_LED_Start) refers to led_pwm.o(.text.BSP_LED_Start) for [Anonymous Symbol] + led_pwm.o(.text.BSP_LED_Stop) refers to led_pwm.o(.data.bsp_led_channel_config) for bsp_led_channel_config + led_pwm.o(.text.BSP_LED_Stop) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Stop) for HAL_TIM_PWM_Stop + led_pwm.o(.ARM.exidx.text.BSP_LED_Stop) refers to led_pwm.o(.text.BSP_LED_Stop) for [Anonymous Symbol] + led_pwm.o(.text.BSP_LED_Set) refers to led_pwm.o(.data.bsp_led_channel_config) for bsp_led_channel_config + led_pwm.o(.text.BSP_LED_Set) refers to led_pwm.o(.text.BSP_LED_Stop) for BSP_LED_Stop + led_pwm.o(.text.BSP_LED_Set) refers to led_pwm.o(.text.BSP_LED_Start) for BSP_LED_Start + led_pwm.o(.ARM.exidx.text.BSP_LED_Set) refers to led_pwm.o(.text.BSP_LED_Set) for [Anonymous Symbol] + led_pwm.o(.data.bsp_led_channel_config) refers to tim.o(.bss.htim5) for htim5 + pwm.o(.text.BSP_PWM_Start) refers to tim.o(.bss.htim1) for htim1 + pwm.o(.text.BSP_PWM_Start) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Start) for HAL_TIM_PWM_Start + pwm.o(.text.BSP_PWM_Start) refers to tim.o(.bss.htim10) for htim10 + pwm.o(.ARM.exidx.text.BSP_PWM_Start) refers to pwm.o(.text.BSP_PWM_Start) for [Anonymous Symbol] + pwm.o(.text.BSP_PWM_Set) refers to tim.o(.bss.htim1) for htim1 + pwm.o(.text.BSP_PWM_Set) refers to pwm.o(.text.BSP_PWM_Stop) for BSP_PWM_Stop + pwm.o(.text.BSP_PWM_Set) refers to tim.o(.bss.htim10) for htim10 + pwm.o(.ARM.exidx.text.BSP_PWM_Set) refers to pwm.o(.text.BSP_PWM_Set) for [Anonymous Symbol] + pwm.o(.text.BSP_PWM_Stop) refers to tim.o(.bss.htim1) for htim1 + pwm.o(.text.BSP_PWM_Stop) refers to stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Stop) for HAL_TIM_PWM_Stop + pwm.o(.text.BSP_PWM_Stop) refers to tim.o(.bss.htim10) for htim10 + pwm.o(.ARM.exidx.text.BSP_PWM_Stop) refers to pwm.o(.text.BSP_PWM_Stop) for [Anonymous Symbol] + spi_1.o(.text.HAL_SPI_TxCpltCallback) refers to spi_1.o(.text.SPI_Get) for SPI_Get + spi_1.o(.text.HAL_SPI_TxCpltCallback) refers to spi_1.o(.bss.SPI_Callback) for SPI_Callback + spi_1.o(.ARM.exidx.text.HAL_SPI_TxCpltCallback) refers to spi_1.o(.text.HAL_SPI_TxCpltCallback) for [Anonymous Symbol] + spi_1.o(.ARM.exidx.text.SPI_Get) refers to spi_1.o(.text.SPI_Get) for [Anonymous Symbol] + spi_1.o(.text.HAL_SPI_RxCpltCallback) refers to spi_1.o(.text.SPI_Get) for SPI_Get + spi_1.o(.text.HAL_SPI_RxCpltCallback) refers to spi_1.o(.bss.SPI_Callback) for SPI_Callback + spi_1.o(.ARM.exidx.text.HAL_SPI_RxCpltCallback) refers to spi_1.o(.text.HAL_SPI_RxCpltCallback) for [Anonymous Symbol] + spi_1.o(.text.HAL_SPI_TxRxCpltCallback) refers to spi_1.o(.text.SPI_Get) for SPI_Get + spi_1.o(.text.HAL_SPI_TxRxCpltCallback) refers to spi_1.o(.bss.SPI_Callback) for SPI_Callback + spi_1.o(.ARM.exidx.text.HAL_SPI_TxRxCpltCallback) refers to spi_1.o(.text.HAL_SPI_TxRxCpltCallback) for [Anonymous Symbol] + spi_1.o(.text.HAL_SPI_TxHalfCpltCallback) refers to spi_1.o(.text.SPI_Get) for SPI_Get + spi_1.o(.text.HAL_SPI_TxHalfCpltCallback) refers to spi_1.o(.bss.SPI_Callback) for SPI_Callback + spi_1.o(.ARM.exidx.text.HAL_SPI_TxHalfCpltCallback) refers to spi_1.o(.text.HAL_SPI_TxHalfCpltCallback) for [Anonymous Symbol] + spi_1.o(.text.HAL_SPI_RxHalfCpltCallback) refers to spi_1.o(.text.SPI_Get) for SPI_Get + spi_1.o(.text.HAL_SPI_RxHalfCpltCallback) refers to spi_1.o(.bss.SPI_Callback) for SPI_Callback + spi_1.o(.ARM.exidx.text.HAL_SPI_RxHalfCpltCallback) refers to spi_1.o(.text.HAL_SPI_RxHalfCpltCallback) for [Anonymous Symbol] + spi_1.o(.text.HAL_SPI_TxRxHalfCpltCallback) refers to spi_1.o(.text.SPI_Get) for SPI_Get + spi_1.o(.text.HAL_SPI_TxRxHalfCpltCallback) refers to spi_1.o(.bss.SPI_Callback) for SPI_Callback + spi_1.o(.ARM.exidx.text.HAL_SPI_TxRxHalfCpltCallback) refers to spi_1.o(.text.HAL_SPI_TxRxHalfCpltCallback) for [Anonymous Symbol] + spi_1.o(.text.HAL_SPI_ErrorCallback) refers to spi_1.o(.text.SPI_Get) for SPI_Get + spi_1.o(.text.HAL_SPI_ErrorCallback) refers to spi_1.o(.bss.SPI_Callback) for SPI_Callback + spi_1.o(.ARM.exidx.text.HAL_SPI_ErrorCallback) refers to spi_1.o(.text.HAL_SPI_ErrorCallback) for [Anonymous Symbol] + spi_1.o(.text.HAL_SPI_AbortCpltCallback) refers to spi_1.o(.text.SPI_Get) for SPI_Get + spi_1.o(.text.HAL_SPI_AbortCpltCallback) refers to spi_1.o(.bss.SPI_Callback) for SPI_Callback + spi_1.o(.ARM.exidx.text.HAL_SPI_AbortCpltCallback) refers to spi_1.o(.text.HAL_SPI_AbortCpltCallback) for [Anonymous Symbol] + spi_1.o(.text.BSP_SPI_GetHandle) refers to spi.o(.bss.hspi1) for hspi1 + spi_1.o(.ARM.exidx.text.BSP_SPI_GetHandle) refers to spi_1.o(.text.BSP_SPI_GetHandle) for [Anonymous Symbol] + spi_1.o(.text.BSP_SPI_RegisterCallback) refers to spi_1.o(.bss.SPI_Callback) for SPI_Callback + spi_1.o(.ARM.exidx.text.BSP_SPI_RegisterCallback) refers to spi_1.o(.text.BSP_SPI_RegisterCallback) for [Anonymous Symbol] + time.o(.text.BSP_TIME_Get_ms) refers to tasks.o(.text.xTaskGetTickCount) for xTaskGetTickCount + time.o(.ARM.exidx.text.BSP_TIME_Get_ms) refers to time.o(.text.BSP_TIME_Get_ms) for [Anonymous Symbol] + time.o(.text.BSP_TIME_Get_us) refers to cmsis_os2.o(.text.osKernelGetTickFreq) for osKernelGetTickFreq + time.o(.text.BSP_TIME_Get_us) refers to tasks.o(.text.xTaskGetTickCount) for xTaskGetTickCount + time.o(.ARM.exidx.text.BSP_TIME_Get_us) refers to time.o(.text.BSP_TIME_Get_us) for [Anonymous Symbol] + time.o(.text.BSP_TIME_Delay_ms) refers to cmsis_os2.o(.text.osKernelGetTickFreq) for osKernelGetTickFreq + time.o(.text.BSP_TIME_Delay_ms) refers to cmsis_os2.o(.text.osKernelGetState) for osKernelGetState + time.o(.text.BSP_TIME_Delay_ms) refers to stm32f4xx_hal.o(.text.HAL_Delay) for HAL_Delay + time.o(.text.BSP_TIME_Delay_ms) refers to cmsis_os2.o(.text.osDelay) for osDelay + time.o(.ARM.exidx.text.BSP_TIME_Delay_ms) refers to time.o(.text.BSP_TIME_Delay_ms) for [Anonymous Symbol] + time.o(.text.BSP_TIME_Delay_us) refers to time.o(.text.BSP_TIME_Get_us) for BSP_TIME_Get_us + time.o(.ARM.exidx.text.BSP_TIME_Delay_us) refers to time.o(.text.BSP_TIME_Delay_us) for [Anonymous Symbol] + uart.o(.text.HAL_UART_TxCpltCallback) refers to uart.o(.text.UART_Get) for UART_Get + uart.o(.text.HAL_UART_TxCpltCallback) refers to uart.o(.bss.UART_Callback) for UART_Callback + uart.o(.ARM.exidx.text.HAL_UART_TxCpltCallback) refers to uart.o(.text.HAL_UART_TxCpltCallback) for [Anonymous Symbol] + uart.o(.ARM.exidx.text.UART_Get) refers to uart.o(.text.UART_Get) for [Anonymous Symbol] + uart.o(.text.HAL_UART_TxHalfCpltCallback) refers to uart.o(.text.UART_Get) for UART_Get + uart.o(.text.HAL_UART_TxHalfCpltCallback) refers to uart.o(.bss.UART_Callback) for UART_Callback + uart.o(.ARM.exidx.text.HAL_UART_TxHalfCpltCallback) refers to uart.o(.text.HAL_UART_TxHalfCpltCallback) for [Anonymous Symbol] + uart.o(.text.HAL_UART_RxCpltCallback) refers to uart.o(.text.UART_Get) for UART_Get + uart.o(.text.HAL_UART_RxCpltCallback) refers to uart.o(.bss.UART_Callback) for UART_Callback + uart.o(.ARM.exidx.text.HAL_UART_RxCpltCallback) refers to uart.o(.text.HAL_UART_RxCpltCallback) for [Anonymous Symbol] + uart.o(.text.HAL_UART_RxHalfCpltCallback) refers to uart.o(.text.UART_Get) for UART_Get + uart.o(.text.HAL_UART_RxHalfCpltCallback) refers to uart.o(.bss.UART_Callback) for UART_Callback + uart.o(.ARM.exidx.text.HAL_UART_RxHalfCpltCallback) refers to uart.o(.text.HAL_UART_RxHalfCpltCallback) for [Anonymous Symbol] + uart.o(.text.HAL_UART_ErrorCallback) refers to uart.o(.text.UART_Get) for UART_Get + uart.o(.text.HAL_UART_ErrorCallback) refers to uart.o(.bss.UART_Callback) for UART_Callback + uart.o(.ARM.exidx.text.HAL_UART_ErrorCallback) refers to uart.o(.text.HAL_UART_ErrorCallback) for [Anonymous Symbol] + uart.o(.text.HAL_UART_AbortCpltCallback) refers to uart.o(.text.UART_Get) for UART_Get + uart.o(.text.HAL_UART_AbortCpltCallback) refers to uart.o(.bss.UART_Callback) for UART_Callback + uart.o(.ARM.exidx.text.HAL_UART_AbortCpltCallback) refers to uart.o(.text.HAL_UART_AbortCpltCallback) for [Anonymous Symbol] + uart.o(.text.HAL_UART_AbortTransmitCpltCallback) refers to uart.o(.text.UART_Get) for UART_Get + uart.o(.text.HAL_UART_AbortTransmitCpltCallback) refers to uart.o(.bss.UART_Callback) for UART_Callback + uart.o(.ARM.exidx.text.HAL_UART_AbortTransmitCpltCallback) refers to uart.o(.text.HAL_UART_AbortTransmitCpltCallback) for [Anonymous Symbol] + uart.o(.text.HAL_UART_AbortReceiveCpltCallback) refers to uart.o(.text.UART_Get) for UART_Get + uart.o(.text.HAL_UART_AbortReceiveCpltCallback) refers to uart.o(.bss.UART_Callback) for UART_Callback + uart.o(.ARM.exidx.text.HAL_UART_AbortReceiveCpltCallback) refers to uart.o(.text.HAL_UART_AbortReceiveCpltCallback) for [Anonymous Symbol] + uart.o(.text.BSP_UART_IRQHandler) refers to uart.o(.text.UART_Get) for UART_Get + uart.o(.text.BSP_UART_IRQHandler) refers to uart.o(.bss.UART_Callback) for UART_Callback + uart.o(.ARM.exidx.text.BSP_UART_IRQHandler) refers to uart.o(.text.BSP_UART_IRQHandler) for [Anonymous Symbol] + uart.o(.text.BSP_UART_GetHandle) refers to usart.o(.bss.huart6) for huart6 + uart.o(.ARM.exidx.text.BSP_UART_GetHandle) refers to uart.o(.text.BSP_UART_GetHandle) for [Anonymous Symbol] + uart.o(.text.BSP_UART_RegisterCallback) refers to uart.o(.bss.UART_Callback) for UART_Callback + uart.o(.ARM.exidx.text.BSP_UART_RegisterCallback) refers to uart.o(.text.BSP_UART_RegisterCallback) for [Anonymous Symbol] + uart.o(.text.BSP_UART_Transmit) refers to uart.o(.text.BSP_UART_GetHandle) for BSP_UART_GetHandle + uart.o(.text.BSP_UART_Transmit) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_Transmit_DMA) for HAL_UART_Transmit_DMA + uart.o(.text.BSP_UART_Transmit) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_Transmit_IT) for HAL_UART_Transmit_IT + uart.o(.ARM.exidx.text.BSP_UART_Transmit) refers to uart.o(.text.BSP_UART_Transmit) for [Anonymous Symbol] + uart.o(.text.BSP_UART_Receive) refers to uart.o(.text.BSP_UART_GetHandle) for BSP_UART_GetHandle + uart.o(.text.BSP_UART_Receive) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_Receive_DMA) for HAL_UART_Receive_DMA + uart.o(.text.BSP_UART_Receive) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_Receive_IT) for HAL_UART_Receive_IT + uart.o(.ARM.exidx.text.BSP_UART_Receive) refers to uart.o(.text.BSP_UART_Receive) for [Anonymous Symbol] + bmi088.o(.text.BMI088_Init) refers to bmi088.o(.bss.inited) for inited + bmi088.o(.text.BMI088_Init) refers to cmsis_os2.o(.text.osThreadGetId) for osThreadGetId + bmi088.o(.text.BMI088_Init) refers to bmi088.o(.bss.thread_alert) for thread_alert + bmi088.o(.text.BMI088_Init) refers to bmi088.o(.text.BMI_WriteSingle) for BMI_WriteSingle + bmi088.o(.text.BMI088_Init) refers to delay.o(.text.BSP_Delay) for BSP_Delay + bmi088.o(.text.BMI088_Init) refers to bmi088.o(.text.BMI_ReadSingle) for BMI_ReadSingle + bmi088.o(.text.BMI088_Init) refers to gpio_1.o(.text.BSP_GPIO_DisableIRQ) for BSP_GPIO_DisableIRQ + bmi088.o(.text.BMI088_Init) refers to bmi088.o(.text.BMI088_RxCpltCallback) for BMI088_RxCpltCallback + bmi088.o(.text.BMI088_Init) refers to spi_1.o(.text.BSP_SPI_RegisterCallback) for BSP_SPI_RegisterCallback + bmi088.o(.text.BMI088_Init) refers to bmi088.o(.text.BMI088_AcclIntCallback) for BMI088_AcclIntCallback + bmi088.o(.text.BMI088_Init) refers to gpio_1.o(.text.BSP_GPIO_RegisterCallback) for BSP_GPIO_RegisterCallback + bmi088.o(.text.BMI088_Init) refers to bmi088.o(.text.BMI088_GyroIntCallback) for BMI088_GyroIntCallback + bmi088.o(.text.BMI088_Init) refers to gpio_1.o(.text.BSP_GPIO_EnableIRQ) for BSP_GPIO_EnableIRQ + bmi088.o(.ARM.exidx.text.BMI088_Init) refers to bmi088.o(.text.BMI088_Init) for [Anonymous Symbol] + bmi088.o(.text.BMI_WriteSingle) refers to bmi088.o(.bss.buffer) for buffer + bmi088.o(.text.BMI_WriteSingle) refers to delay.o(.text.BSP_Delay) for BSP_Delay + bmi088.o(.text.BMI_WriteSingle) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_WritePin) for HAL_GPIO_WritePin + bmi088.o(.text.BMI_WriteSingle) refers to spi_1.o(.text.BSP_SPI_GetHandle) for BSP_SPI_GetHandle + bmi088.o(.text.BMI_WriteSingle) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_Transmit) for HAL_SPI_Transmit + bmi088.o(.ARM.exidx.text.BMI_WriteSingle) refers to bmi088.o(.text.BMI_WriteSingle) for [Anonymous Symbol] + bmi088.o(.text.BMI_ReadSingle) refers to delay.o(.text.BSP_Delay) for BSP_Delay + bmi088.o(.text.BMI_ReadSingle) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_WritePin) for HAL_GPIO_WritePin + bmi088.o(.text.BMI_ReadSingle) refers to bmi088.o(.bss.buffer) for buffer + bmi088.o(.text.BMI_ReadSingle) refers to spi_1.o(.text.BSP_SPI_GetHandle) for BSP_SPI_GetHandle + bmi088.o(.text.BMI_ReadSingle) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_Transmit) for HAL_SPI_Transmit + bmi088.o(.text.BMI_ReadSingle) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_Receive) for HAL_SPI_Receive + bmi088.o(.ARM.exidx.text.BMI_ReadSingle) refers to bmi088.o(.text.BMI_ReadSingle) for [Anonymous Symbol] + bmi088.o(.text.BMI088_RxCpltCallback) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_ReadPin) for HAL_GPIO_ReadPin + bmi088.o(.text.BMI088_RxCpltCallback) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_WritePin) for HAL_GPIO_WritePin + bmi088.o(.text.BMI088_RxCpltCallback) refers to bmi088.o(.bss.thread_alert) for thread_alert + bmi088.o(.text.BMI088_RxCpltCallback) refers to cmsis_os2.o(.text.osThreadFlagsSet) for osThreadFlagsSet + bmi088.o(.ARM.exidx.text.BMI088_RxCpltCallback) refers to bmi088.o(.text.BMI088_RxCpltCallback) for [Anonymous Symbol] + bmi088.o(.text.BMI088_AcclIntCallback) refers to bmi088.o(.bss.thread_alert) for thread_alert + bmi088.o(.text.BMI088_AcclIntCallback) refers to cmsis_os2.o(.text.osThreadFlagsSet) for osThreadFlagsSet + bmi088.o(.ARM.exidx.text.BMI088_AcclIntCallback) refers to bmi088.o(.text.BMI088_AcclIntCallback) for [Anonymous Symbol] + bmi088.o(.text.BMI088_GyroIntCallback) refers to bmi088.o(.bss.thread_alert) for thread_alert + bmi088.o(.text.BMI088_GyroIntCallback) refers to cmsis_os2.o(.text.osThreadFlagsSet) for osThreadFlagsSet + bmi088.o(.ARM.exidx.text.BMI088_GyroIntCallback) refers to bmi088.o(.text.BMI088_GyroIntCallback) for [Anonymous Symbol] + bmi088.o(.ARM.exidx.text.BMI088_GyroStable) refers to bmi088.o(.text.BMI088_GyroStable) for [Anonymous Symbol] + bmi088.o(.text.BMI088_WaitNew) refers to cmsis_os2.o(.text.osThreadFlagsWait) for osThreadFlagsWait + bmi088.o(.ARM.exidx.text.BMI088_WaitNew) refers to bmi088.o(.text.BMI088_WaitNew) for [Anonymous Symbol] + bmi088.o(.text.BMI088_AcclStartDmaRecv) refers to bmi088.o(.bss.bmi088_rxbuf) for bmi088_rxbuf + bmi088.o(.text.BMI088_AcclStartDmaRecv) refers to bmi088.o(.text.BMI_Read) for BMI_Read + bmi088.o(.ARM.exidx.text.BMI088_AcclStartDmaRecv) refers to bmi088.o(.text.BMI088_AcclStartDmaRecv) for [Anonymous Symbol] + bmi088.o(.text.BMI_Read) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_WritePin) for HAL_GPIO_WritePin + bmi088.o(.text.BMI_Read) refers to bmi088.o(.bss.buffer) for buffer + bmi088.o(.text.BMI_Read) refers to spi_1.o(.text.BSP_SPI_GetHandle) for BSP_SPI_GetHandle + bmi088.o(.text.BMI_Read) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_Transmit) for HAL_SPI_Transmit + bmi088.o(.text.BMI_Read) refers to stm32f4xx_hal_spi.o(.text.HAL_SPI_Receive_DMA) for HAL_SPI_Receive_DMA + bmi088.o(.ARM.exidx.text.BMI_Read) refers to bmi088.o(.text.BMI_Read) for [Anonymous Symbol] + bmi088.o(.text.BMI088_AcclWaitDmaCplt) refers to cmsis_os2.o(.text.osThreadFlagsWait) for osThreadFlagsWait + bmi088.o(.ARM.exidx.text.BMI088_AcclWaitDmaCplt) refers to bmi088.o(.text.BMI088_AcclWaitDmaCplt) for [Anonymous Symbol] + bmi088.o(.text.BMI088_GyroStartDmaRecv) refers to bmi088.o(.bss.bmi088_rxbuf) for bmi088_rxbuf + bmi088.o(.text.BMI088_GyroStartDmaRecv) refers to bmi088.o(.text.BMI_Read) for BMI_Read + bmi088.o(.ARM.exidx.text.BMI088_GyroStartDmaRecv) refers to bmi088.o(.text.BMI088_GyroStartDmaRecv) for [Anonymous Symbol] + bmi088.o(.text.BMI088_GyroWaitDmaCplt) refers to cmsis_os2.o(.text.osThreadFlagsWait) for osThreadFlagsWait + bmi088.o(.ARM.exidx.text.BMI088_GyroWaitDmaCplt) refers to bmi088.o(.text.BMI088_GyroWaitDmaCplt) for [Anonymous Symbol] + bmi088.o(.text.BMI088_ParseAccl) refers to bmi088.o(.bss.bmi088_rxbuf) for bmi088_rxbuf + bmi088.o(.ARM.exidx.text.BMI088_ParseAccl) refers to bmi088.o(.text.BMI088_ParseAccl) for [Anonymous Symbol] + bmi088.o(.text.BMI088_ParseGyro) refers to bmi088.o(.bss.bmi088_rxbuf) for bmi088_rxbuf + bmi088.o(.ARM.exidx.text.BMI088_ParseGyro) refers to bmi088.o(.text.BMI088_ParseGyro) for [Anonymous Symbol] + bmi088.o(.ARM.exidx.text.BMI088_GetUpdateFreq) refers to bmi088.o(.text.BMI088_GetUpdateFreq) for [Anonymous Symbol] + ist8310.o(.text.IST8310_Init) refers to ist8310.o(.bss.inited) for inited + ist8310.o(.text.IST8310_Init) refers to cmsis_os2.o(.text.osThreadGetId) for osThreadGetId + ist8310.o(.text.IST8310_Init) refers to ist8310.o(.bss.thread_alert) for thread_alert + ist8310.o(.text.IST8310_Init) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_WritePin) for HAL_GPIO_WritePin + ist8310.o(.text.IST8310_Init) refers to delay.o(.text.BSP_Delay) for BSP_Delay + ist8310.o(.text.IST8310_Init) refers to ist8310.o(.text.IST8310_ReadSingle) for IST8310_ReadSingle + ist8310.o(.text.IST8310_Init) refers to gpio_1.o(.text.BSP_GPIO_DisableIRQ) for BSP_GPIO_DisableIRQ + ist8310.o(.text.IST8310_Init) refers to ist8310.o(.text.IST8310_MemRxCpltCallback) for IST8310_MemRxCpltCallback + ist8310.o(.text.IST8310_Init) refers to i2c_1.o(.text.BSP_I2C_RegisterCallback) for BSP_I2C_RegisterCallback + ist8310.o(.text.IST8310_Init) refers to ist8310.o(.text.IST8310_IntCallback) for IST8310_IntCallback + ist8310.o(.text.IST8310_Init) refers to gpio_1.o(.text.BSP_GPIO_RegisterCallback) for BSP_GPIO_RegisterCallback + ist8310.o(.text.IST8310_Init) refers to ist8310.o(.text.IST8310_WriteSingle) for IST8310_WriteSingle + ist8310.o(.text.IST8310_Init) refers to gpio_1.o(.text.BSP_GPIO_EnableIRQ) for BSP_GPIO_EnableIRQ + ist8310.o(.ARM.exidx.text.IST8310_Init) refers to ist8310.o(.text.IST8310_Init) for [Anonymous Symbol] + ist8310.o(.text.IST8310_ReadSingle) refers to i2c_1.o(.text.BSP_I2C_GetHandle) for BSP_I2C_GetHandle + ist8310.o(.text.IST8310_ReadSingle) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Read) for HAL_I2C_Mem_Read + ist8310.o(.ARM.exidx.text.IST8310_ReadSingle) refers to ist8310.o(.text.IST8310_ReadSingle) for [Anonymous Symbol] + ist8310.o(.text.IST8310_MemRxCpltCallback) refers to ist8310.o(.bss.thread_alert) for thread_alert + ist8310.o(.text.IST8310_MemRxCpltCallback) refers to cmsis_os2.o(.text.osThreadFlagsSet) for osThreadFlagsSet + ist8310.o(.ARM.exidx.text.IST8310_MemRxCpltCallback) refers to ist8310.o(.text.IST8310_MemRxCpltCallback) for [Anonymous Symbol] + ist8310.o(.text.IST8310_IntCallback) refers to ist8310.o(.bss.thread_alert) for thread_alert + ist8310.o(.text.IST8310_IntCallback) refers to cmsis_os2.o(.text.osThreadFlagsSet) for osThreadFlagsSet + ist8310.o(.ARM.exidx.text.IST8310_IntCallback) refers to ist8310.o(.text.IST8310_IntCallback) for [Anonymous Symbol] + ist8310.o(.text.IST8310_WriteSingle) refers to i2c_1.o(.text.BSP_I2C_GetHandle) for BSP_I2C_GetHandle + ist8310.o(.text.IST8310_WriteSingle) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Write) for HAL_I2C_Mem_Write + ist8310.o(.ARM.exidx.text.IST8310_WriteSingle) refers to ist8310.o(.text.IST8310_WriteSingle) for [Anonymous Symbol] + ist8310.o(.text.IST8310_WaitNew) refers to cmsis_os2.o(.text.osThreadFlagsWait) for osThreadFlagsWait + ist8310.o(.ARM.exidx.text.IST8310_WaitNew) refers to ist8310.o(.text.IST8310_WaitNew) for [Anonymous Symbol] + ist8310.o(.text.IST8310_StartDmaRecv) refers to ist8310.o(.text.IST8310_Read) for IST8310_Read + ist8310.o(.ARM.exidx.text.IST8310_StartDmaRecv) refers to ist8310.o(.text.IST8310_StartDmaRecv) for [Anonymous Symbol] + ist8310.o(.text.IST8310_Read) refers to i2c_1.o(.text.BSP_I2C_GetHandle) for BSP_I2C_GetHandle + ist8310.o(.text.IST8310_Read) refers to ist8310.o(.bss.ist8310_rxbuf) for ist8310_rxbuf + ist8310.o(.text.IST8310_Read) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Read_DMA) for HAL_I2C_Mem_Read_DMA + ist8310.o(.ARM.exidx.text.IST8310_Read) refers to ist8310.o(.text.IST8310_Read) for [Anonymous Symbol] + ist8310.o(.text.IST8310_WaitDmaCplt) refers to cmsis_os2.o(.text.osThreadFlagsWait) for osThreadFlagsWait + ist8310.o(.ARM.exidx.text.IST8310_WaitDmaCplt) refers to ist8310.o(.text.IST8310_WaitDmaCplt) for [Anonymous Symbol] + ist8310.o(.text.IST8310_Parse) refers to ist8310.o(.bss.ist8310_rxbuf) for ist8310_rxbuf + ist8310.o(.ARM.exidx.text.IST8310_Parse) refers to ist8310.o(.text.IST8310_Parse) for [Anonymous Symbol] + ps2.o(.text.PS2_CS) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_WritePin) for HAL_GPIO_WritePin + ps2.o(.ARM.exidx.text.PS2_CS) refers to ps2.o(.text.PS2_CS) for [Anonymous Symbol] + ps2.o(.text.PS2_CLK) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_WritePin) for HAL_GPIO_WritePin + ps2.o(.ARM.exidx.text.PS2_CLK) refers to ps2.o(.text.PS2_CLK) for [Anonymous Symbol] + ps2.o(.text.PS2_DO) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_WritePin) for HAL_GPIO_WritePin + ps2.o(.ARM.exidx.text.PS2_DO) refers to ps2.o(.text.PS2_DO) for [Anonymous Symbol] + ps2.o(.text.PS2_Read_DI) refers to stm32f4xx_hal_gpio.o(.text.HAL_GPIO_ReadPin) for HAL_GPIO_ReadPin + ps2.o(.ARM.exidx.text.PS2_Read_DI) refers to ps2.o(.text.PS2_Read_DI) for [Anonymous Symbol] + ps2.o(.text.PS2_ReadWrite_Byte) refers to ps2.o(.text.PS2_DO) for PS2_DO + ps2.o(.text.PS2_ReadWrite_Byte) refers to ps2.o(.text.PS2_CLK) for PS2_CLK + ps2.o(.text.PS2_ReadWrite_Byte) refers to delay.o(.text.BSP_Delay_us) for BSP_Delay_us + ps2.o(.text.PS2_ReadWrite_Byte) refers to ps2.o(.text.PS2_Read_DI) for PS2_Read_DI + ps2.o(.ARM.exidx.text.PS2_ReadWrite_Byte) refers to ps2.o(.text.PS2_ReadWrite_Byte) for [Anonymous Symbol] + ps2.o(.text.PS2_Decode) refers to ps2.o(.bss.PS2_RawData) for PS2_RawData + ps2.o(.text.PS2_Decode) refers to ps2.o(.bss.PS2_Data) for PS2_Data + ps2.o(.ARM.exidx.text.PS2_Decode) refers to ps2.o(.text.PS2_Decode) for [Anonymous Symbol] + ps2.o(.text.PS2_Read_Data) refers to ps2.o(.text.PS2_CS) for PS2_CS + ps2.o(.text.PS2_Read_Data) refers to ps2.o(.text.PS2_ReadWrite_Byte) for PS2_ReadWrite_Byte + ps2.o(.text.PS2_Read_Data) refers to ps2.o(.bss.PS2_RawData) for PS2_RawData + ps2.o(.text.PS2_Read_Data) refers to ps2.o(.text.PS2_Decode) for PS2_Decode + ps2.o(.ARM.exidx.text.PS2_Read_Data) refers to ps2.o(.text.PS2_Read_Data) for [Anonymous Symbol] + ps2.o(.ARM.exidx.text.StickToThrottle_Optimized) refers to ps2.o(.text.StickToThrottle_Optimized) for [Anonymous Symbol] + spl06.o(.text.spl06_write_reg) refers to i2c.o(.bss.hi2c2) for hi2c2 + spl06.o(.text.spl06_write_reg) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Write) for HAL_I2C_Mem_Write + spl06.o(.ARM.exidx.text.spl06_write_reg) refers to spl06.o(.text.spl06_write_reg) for [Anonymous Symbol] + spl06.o(.text.spl06_read_reg) refers to i2c.o(.bss.hi2c2) for hi2c2 + spl06.o(.text.spl06_read_reg) refers to stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Read) for HAL_I2C_Mem_Read + spl06.o(.ARM.exidx.text.spl06_read_reg) refers to spl06.o(.text.spl06_read_reg) for [Anonymous Symbol] + spl06.o(.text.spl06_start) refers to spl06.o(.text.spl06_write_reg) for spl06_write_reg + spl06.o(.ARM.exidx.text.spl06_start) refers to spl06.o(.text.spl06_start) for [Anonymous Symbol] + spl06.o(.text.spl06_config_temperature) refers to spl06.o(.text.spl06_read_reg) for spl06_read_reg + spl06.o(.text.spl06_config_temperature) refers to spl06.o(.text.spl06_write_reg) for spl06_write_reg + spl06.o(.text.spl06_config_temperature) refers to spl06.o(.bss.spl06) for spl06 + spl06.o(.ARM.exidx.text.spl06_config_temperature) refers to spl06.o(.text.spl06_config_temperature) for [Anonymous Symbol] + spl06.o(.text.spl06_config_pressure) refers to spl06.o(.text.spl06_read_reg) for spl06_read_reg + spl06.o(.text.spl06_config_pressure) refers to spl06.o(.text.spl06_write_reg) for spl06_write_reg + spl06.o(.text.spl06_config_pressure) refers to spl06.o(.bss.spl06) for spl06 + spl06.o(.ARM.exidx.text.spl06_config_pressure) refers to spl06.o(.text.spl06_config_pressure) for [Anonymous Symbol] + spl06.o(.text.spl06_get_pressure_adc) refers to spl06.o(.text.spl06_read_reg) for spl06_read_reg + spl06.o(.ARM.exidx.text.spl06_get_pressure_adc) refers to spl06.o(.text.spl06_get_pressure_adc) for [Anonymous Symbol] + spl06.o(.text.spl06_get_temperature_adc) refers to spl06.o(.text.spl06_read_reg) for spl06_read_reg + spl06.o(.ARM.exidx.text.spl06_get_temperature_adc) refers to spl06.o(.text.spl06_get_temperature_adc) for [Anonymous Symbol] + spl06.o(.text.spl06_update) refers to spl06.o(.text.spl06_get_temperature_adc) for spl06_get_temperature_adc + spl06.o(.text.spl06_update) refers to spl06.o(.bss.spl06) for spl06 + spl06.o(.text.spl06_update) refers to spl06.o(.text.spl06_get_pressure_adc) for spl06_get_pressure_adc + spl06.o(.text.spl06_update) refers to spl06.o(.bss.spl06_calib_param) for spl06_calib_param + spl06.o(.text.spl06_update) refers to dflt_clz.o(x$fpl$dflt) for __aeabi_i2d + spl06.o(.text.spl06_update) refers to dmul.o(x$fpl$dmul) for __aeabi_dmul + spl06.o(.text.spl06_update) refers to f2d.o(x$fpl$f2d) for __aeabi_f2d + spl06.o(.text.spl06_update) refers to daddsub_clz.o(x$fpl$dadd) for __aeabi_dadd + spl06.o(.text.spl06_update) refers to dfix.o(x$fpl$dfix) for __aeabi_d2iz + spl06.o(.ARM.exidx.text.spl06_update) refers to spl06.o(.text.spl06_update) for [Anonymous Symbol] + spl06.o(.text.spl06_get_measure_status) refers to spl06.o(.text.spl06_read_reg) for spl06_read_reg + spl06.o(.ARM.exidx.text.spl06_get_measure_status) refers to spl06.o(.text.spl06_get_measure_status) for [Anonymous Symbol] + spl06.o(.text.spl06_set_measure_mode) refers to spl06.o(.text.spl06_write_reg) for spl06_write_reg + spl06.o(.ARM.exidx.text.spl06_set_measure_mode) refers to spl06.o(.text.spl06_set_measure_mode) for [Anonymous Symbol] + spl06.o(.text.spl06_start_temperature) refers to spl06.o(.text.spl06_write_reg) for spl06_write_reg + spl06.o(.ARM.exidx.text.spl06_start_temperature) refers to spl06.o(.text.spl06_start_temperature) for [Anonymous Symbol] + spl06.o(.text.spl06_start_pressure) refers to spl06.o(.text.spl06_write_reg) for spl06_write_reg + spl06.o(.ARM.exidx.text.spl06_start_pressure) refers to spl06.o(.text.spl06_start_pressure) for [Anonymous Symbol] + spl06.o(.text.spl06_enter_standby) refers to spl06.o(.text.spl06_write_reg) for spl06_write_reg + spl06.o(.ARM.exidx.text.spl06_enter_standby) refers to spl06.o(.text.spl06_enter_standby) for [Anonymous Symbol] + spl06.o(.text.spl06_get_calib_param) refers to spl06.o(.text.spl06_read_reg) for spl06_read_reg + spl06.o(.text.spl06_get_calib_param) refers to spl06.o(.bss.spl06_calib_param) for spl06_calib_param + spl06.o(.ARM.exidx.text.spl06_get_calib_param) refers to spl06.o(.text.spl06_get_calib_param) for [Anonymous Symbol] + spl06.o(.text.spl06_init) refers to spl06.o(.text.spl06_write_reg) for spl06_write_reg + spl06.o(.text.spl06_init) refers to delay.o(.text.BSP_Delay_ms) for BSP_Delay_ms + spl06.o(.text.spl06_init) refers to spl06.o(.text.spl06_get_measure_status) for spl06_get_measure_status + spl06.o(.text.spl06_init) refers to spl06.o(.text.spl06_get_calib_param) for spl06_get_calib_param + spl06.o(.text.spl06_init) refers to spl06.o(.text.spl06_read_reg) for spl06_read_reg + spl06.o(.text.spl06_init) refers to spl06.o(.bss.spl06) for spl06 + spl06.o(.text.spl06_init) refers to spl06.o(.text.spl06_config_pressure) for spl06_config_pressure + spl06.o(.text.spl06_init) refers to spl06.o(.text.spl06_config_temperature) for spl06_config_temperature + spl06.o(.text.spl06_init) refers to spl06.o(.text.spl06_start) for spl06_start + spl06.o(.ARM.exidx.text.spl06_init) refers to spl06.o(.text.spl06_init) for [Anonymous Symbol] + spl06.o(.text.Caculate_height) refers to f2d.o(x$fpl$f2d) for __aeabi_f2d + spl06.o(.text.Caculate_height) refers to ddiv.o(x$fpl$ddiv) for __aeabi_ddiv + spl06.o(.text.Caculate_height) refers to pow.o(i.__hardfp_pow) for __hardfp_pow + spl06.o(.text.Caculate_height) refers to daddsub_clz.o(x$fpl$dsub) for __aeabi_dsub + spl06.o(.text.Caculate_height) refers to dmul.o(x$fpl$dmul) for __aeabi_dmul + spl06.o(.text.Caculate_height) refers to dfix.o(x$fpl$dfix) for __aeabi_d2iz + spl06.o(.ARM.exidx.text.Caculate_height) refers to spl06.o(.text.Caculate_height) for [Anonymous Symbol] + ahrs.o(.text.AHRS_Init) refers to f2d.o(x$fpl$f2d) for __aeabi_f2d + ahrs.o(.text.AHRS_Init) refers to atan2.o(i.__hardfp_atan2) for __hardfp_atan2 + ahrs.o(.text.AHRS_Init) refers to d2f.o(x$fpl$d2f) for __aeabi_d2f + ahrs.o(.ARM.exidx.text.AHRS_Init) refers to ahrs.o(.text.AHRS_Init) for [Anonymous Symbol] + ahrs.o(.text.AHRS_Update) refers to ahrs.o(.data.beta) for beta + ahrs.o(.text.AHRS_Update) refers to ahrs.o(.text.AHRS_UpdateIMU) for AHRS_UpdateIMU + ahrs.o(.text.AHRS_Update) refers to user_math.o(.text.InvSqrt) for InvSqrt + ahrs.o(.ARM.exidx.text.AHRS_Update) refers to ahrs.o(.text.AHRS_Update) for [Anonymous Symbol] + ahrs.o(.text.AHRS_UpdateIMU) refers to ahrs.o(.data.beta) for beta + ahrs.o(.text.AHRS_UpdateIMU) refers to user_math.o(.text.InvSqrt) for InvSqrt + ahrs.o(.ARM.exidx.text.AHRS_UpdateIMU) refers to ahrs.o(.text.AHRS_UpdateIMU) for [Anonymous Symbol] + ahrs.o(.text.AHRS_GetEulr) refers to atan2f.o(i.__hardfp_atan2f) for __hardfp_atan2f + ahrs.o(.text.AHRS_GetEulr) refers to asinf.o(i.__hardfp_asinf) for __hardfp_asinf + ahrs.o(.text.AHRS_GetEulr) refers to ahrs.o(.text.copysignf) for copysignf + ahrs.o(.ARM.exidx.text.AHRS_GetEulr) refers to ahrs.o(.text.AHRS_GetEulr) for [Anonymous Symbol] + ahrs.o(.ARM.exidx.text.copysignf) refers to ahrs.o(.text.copysignf) for [Anonymous Symbol] + ahrs.o(.ARM.exidx.text.AHRS_ResetEulr) refers to ahrs.o(.text.AHRS_ResetEulr) for [Anonymous Symbol] + filter.o(.text.LowPassFilter2p_Init) refers to tanf.o(i.__hardfp_tanf) for __hardfp_tanf + filter.o(.ARM.exidx.text.LowPassFilter2p_Init) refers to filter.o(.text.LowPassFilter2p_Init) for [Anonymous Symbol] + filter.o(.text.LowPassFilter2p_Apply) refers to filter.o(.text.__ARM_isinff) for __ARM_isinff + filter.o(.ARM.exidx.text.LowPassFilter2p_Apply) refers to filter.o(.text.LowPassFilter2p_Apply) for [Anonymous Symbol] + filter.o(.ARM.exidx.text.__ARM_isinff) refers to filter.o(.text.__ARM_isinff) for [Anonymous Symbol] + filter.o(.text.LowPassFilter2p_Reset) refers to filter.o(.text.__ARM_isfinitef) for __ARM_isfinitef + filter.o(.text.LowPassFilter2p_Reset) refers to filter.o(.text.LowPassFilter2p_Apply) for LowPassFilter2p_Apply + filter.o(.ARM.exidx.text.LowPassFilter2p_Reset) refers to filter.o(.text.LowPassFilter2p_Reset) for [Anonymous Symbol] + filter.o(.ARM.exidx.text.__ARM_isfinitef) refers to filter.o(.text.__ARM_isfinitef) for [Anonymous Symbol] + filter.o(.text.NotchFilter_Init) refers to tanf.o(i.__hardfp_tanf) for __hardfp_tanf + filter.o(.text.NotchFilter_Init) refers to cosf.o(i.__hardfp_cosf) for __hardfp_cosf + filter.o(.ARM.exidx.text.NotchFilter_Init) refers to filter.o(.text.NotchFilter_Init) for [Anonymous Symbol] + filter.o(.ARM.exidx.text.NotchFilter_Apply) refers to filter.o(.text.NotchFilter_Apply) for [Anonymous Symbol] + filter.o(.text.NotchFilter_Reset) refers to filter.o(.text.NotchFilter_Apply) for NotchFilter_Apply + filter.o(.ARM.exidx.text.NotchFilter_Reset) refers to filter.o(.text.NotchFilter_Reset) for [Anonymous Symbol] + fixed_height.o(.ARM.exidx.text.AltKalman_Init) refers to fixed_height.o(.text.AltKalman_Init) for [Anonymous Symbol] + fixed_height.o(.ARM.exidx.text.AltKalman_Update) refers to fixed_height.o(.text.AltKalman_Update) for [Anonymous Symbol] + pid.o(.text.PID_Init) refers to pid.o(.text.__ARM_isfinitef) for __ARM_isfinitef + pid.o(.text.PID_Init) refers to filter.o(.text.LowPassFilter2p_Init) for LowPassFilter2p_Init + pid.o(.text.PID_Init) refers to pid.o(.text.PID_Reset) for PID_Reset + pid.o(.ARM.exidx.text.PID_Init) refers to pid.o(.text.PID_Init) for [Anonymous Symbol] + pid.o(.ARM.exidx.text.__ARM_isfinitef) refers to pid.o(.text.__ARM_isfinitef) for [Anonymous Symbol] + pid.o(.text.PID_Reset) refers to filter.o(.text.LowPassFilter2p_Reset) for LowPassFilter2p_Reset + pid.o(.ARM.exidx.text.PID_Reset) refers to pid.o(.text.PID_Reset) for [Anonymous Symbol] + pid.o(.text.PID_Calc) refers to pid.o(.text.__ARM_isfinitef) for __ARM_isfinitef + pid.o(.text.PID_Calc) refers to user_math.o(.text.CircleError) for CircleError + pid.o(.text.PID_Calc) refers to filter.o(.text.LowPassFilter2p_Apply) for LowPassFilter2p_Apply + pid.o(.text.PID_Calc) refers to user_math.o(.text.AbsClip) for AbsClip + pid.o(.ARM.exidx.text.PID_Calc) refers to pid.o(.text.PID_Calc) for [Anonymous Symbol] + pid.o(.ARM.exidx.text.PID_ResetIntegral) refers to pid.o(.text.PID_ResetIntegral) for [Anonymous Symbol] + user_math.o(.ARM.exidx.text.InvSqrt) refers to user_math.o(.text.InvSqrt) for [Anonymous Symbol] + user_math.o(.ARM.exidx.text.AbsClip) refers to user_math.o(.text.AbsClip) for [Anonymous Symbol] + user_math.o(.ARM.exidx.text.fAbs) refers to user_math.o(.text.fAbs) for [Anonymous Symbol] + user_math.o(.ARM.exidx.text.Clip) refers to user_math.o(.text.Clip) for [Anonymous Symbol] + user_math.o(.ARM.exidx.text.Sign) refers to user_math.o(.text.Sign) for [Anonymous Symbol] + user_math.o(.ARM.exidx.text.CircleError) refers to user_math.o(.text.CircleError) for [Anonymous Symbol] + user_math.o(.ARM.exidx.text.CircleAdd) refers to user_math.o(.text.CircleAdd) for [Anonymous Symbol] + user_math.o(.ARM.exidx.text.CircleReverse) refers to user_math.o(.text.CircleReverse) for [Anonymous Symbol] + easy_control.o(.ARM.exidx.text.Kalman_Init) refers to easy_control.o(.text.Kalman_Init) for [Anonymous Symbol] + easy_control.o(.ARM.exidx.text.Kalman_Update) refers to easy_control.o(.text.Kalman_Update) for [Anonymous Symbol] + easy_control.o(.text.FlightController_Init) refers to easy_control.o(.bss.roll_kf) for roll_kf + easy_control.o(.text.FlightController_Init) refers to easy_control.o(.text.Kalman_Init) for Kalman_Init + easy_control.o(.text.FlightController_Init) refers to easy_control.o(.bss.pitch_kf) for pitch_kf + easy_control.o(.text.FlightController_Init) refers to easy_control.o(.bss.roll_angle_pid) for roll_angle_pid + easy_control.o(.text.FlightController_Init) refers to easy_control.o(.data.angle_pid_params) for angle_pid_params + easy_control.o(.text.FlightController_Init) refers to pid.o(.text.PID_Init) for PID_Init + easy_control.o(.text.FlightController_Init) refers to easy_control.o(.bss.pitch_angle_pid) for pitch_angle_pid + easy_control.o(.text.FlightController_Init) refers to easy_control.o(.bss.roll_rate_pid) for roll_rate_pid + easy_control.o(.text.FlightController_Init) refers to easy_control.o(.data.rate_pid_params) for rate_pid_params + easy_control.o(.text.FlightController_Init) refers to easy_control.o(.bss.pitch_rate_pid) for pitch_rate_pid + easy_control.o(.text.FlightController_Init) refers to easy_control.o(.bss.yaw_rate_pid) for yaw_rate_pid + easy_control.o(.text.FlightController_Init) refers to easy_control.o(.bss.altitude_pos_pid) for altitude_pos_pid + easy_control.o(.text.FlightController_Init) refers to easy_control.o(.data.alt_pos_pid_params) for alt_pos_pid_params + easy_control.o(.text.FlightController_Init) refers to easy_control.o(.bss.altitude_vel_pid) for altitude_vel_pid + easy_control.o(.text.FlightController_Init) refers to easy_control.o(.data.alt_vel_pid_params) for alt_vel_pid_params + easy_control.o(.text.FlightController_Init) refers to pid.o(.text.PID_Reset) for PID_Reset + easy_control.o(.ARM.exidx.text.FlightController_Init) refers to easy_control.o(.text.FlightController_Init) for [Anonymous Symbol] + easy_control.o(.text.FlightController_Update) refers to atan2f.o(i.__hardfp_atan2f) for __hardfp_atan2f + easy_control.o(.text.FlightController_Update) refers to easy_control.o(.bss.roll_kf) for roll_kf + easy_control.o(.text.FlightController_Update) refers to easy_control.o(.text.Kalman_Update) for Kalman_Update + easy_control.o(.text.FlightController_Update) refers to f2d.o(x$fpl$f2d) for __aeabi_f2d + easy_control.o(.text.FlightController_Update) refers to daddsub_clz.o(x$fpl$dadd) for __aeabi_dadd + easy_control.o(.text.FlightController_Update) refers to d2f.o(x$fpl$d2f) for __aeabi_d2f + easy_control.o(.text.FlightController_Update) refers to easy_control.o(.bss.roll_angle) for roll_angle + easy_control.o(.text.FlightController_Update) refers to easy_control.o(.bss.pitch_kf) for pitch_kf + easy_control.o(.text.FlightController_Update) refers to easy_control.o(.bss.pitch_angle) for pitch_angle + easy_control.o(.text.FlightController_Update) refers to dmul.o(x$fpl$dmul) for __aeabi_dmul + easy_control.o(.text.FlightController_Update) refers to easy_control.o(.bss.target_altitude) for target_altitude + easy_control.o(.text.FlightController_Update) refers to easy_control.o(.bss.target_yaw_rate) for target_yaw_rate + easy_control.o(.text.FlightController_Update) refers to easy_control.o(.bss.altitude_pos_pid) for altitude_pos_pid + easy_control.o(.text.FlightController_Update) refers to pid.o(.text.PID_Calc) for PID_Calc + easy_control.o(.text.FlightController_Update) refers to easy_control.o(.bss.expected_speed) for expected_speed + easy_control.o(.text.FlightController_Update) refers to easy_control.o(.bss.altitude_vel_pid) for altitude_vel_pid + easy_control.o(.text.FlightController_Update) refers to easy_control.o(.data.base_throttle) for base_throttle + easy_control.o(.text.FlightController_Update) refers to easy_control.o(.bss.expect_thrust) for expect_thrust + easy_control.o(.text.FlightController_Update) refers to easy_control.o(.bss.roll_angle_pid) for roll_angle_pid + easy_control.o(.text.FlightController_Update) refers to easy_control.o(.bss.target_roll_rate) for target_roll_rate + easy_control.o(.text.FlightController_Update) refers to easy_control.o(.bss.pitch_angle_pid) for pitch_angle_pid + easy_control.o(.text.FlightController_Update) refers to easy_control.o(.bss.target_pitch_rate) for target_pitch_rate + easy_control.o(.text.FlightController_Update) refers to easy_control.o(.bss.roll_rate_pid) for roll_rate_pid + easy_control.o(.text.FlightController_Update) refers to easy_control.o(.bss.pitch_rate_pid) for pitch_rate_pid + easy_control.o(.text.FlightController_Update) refers to easy_control.o(.bss.yaw_rate_pid) for yaw_rate_pid + easy_control.o(.ARM.exidx.text.FlightController_Update) refers to easy_control.o(.text.FlightController_Update) for [Anonymous Symbol] + easy_control.o(.text.FlightController_Reset) refers to easy_control.o(.bss.roll_angle_pid) for roll_angle_pid + easy_control.o(.text.FlightController_Reset) refers to pid.o(.text.PID_Reset) for PID_Reset + easy_control.o(.text.FlightController_Reset) refers to easy_control.o(.bss.pitch_angle_pid) for pitch_angle_pid + easy_control.o(.text.FlightController_Reset) refers to easy_control.o(.bss.roll_rate_pid) for roll_rate_pid + easy_control.o(.text.FlightController_Reset) refers to easy_control.o(.bss.pitch_rate_pid) for pitch_rate_pid + easy_control.o(.text.FlightController_Reset) refers to easy_control.o(.bss.yaw_rate_pid) for yaw_rate_pid + easy_control.o(.text.FlightController_Reset) refers to easy_control.o(.bss.altitude_pos_pid) for altitude_pos_pid + easy_control.o(.text.FlightController_Reset) refers to easy_control.o(.bss.altitude_vel_pid) for altitude_vel_pid + easy_control.o(.text.FlightController_Reset) refers to easy_control.o(.bss.roll_kf) for roll_kf + easy_control.o(.text.FlightController_Reset) refers to easy_control.o(.text.Kalman_Init) for Kalman_Init + easy_control.o(.text.FlightController_Reset) refers to easy_control.o(.bss.pitch_kf) for pitch_kf + easy_control.o(.ARM.exidx.text.FlightController_Reset) refers to easy_control.o(.text.FlightController_Reset) for [Anonymous Symbol] + easy_control.o(.text.MotorMixer_Init) refers to easy_control.o(.bss.mixer) for mixer + easy_control.o(.ARM.exidx.text.MotorMixer_Init) refers to easy_control.o(.text.MotorMixer_Init) for [Anonymous Symbol] + easy_control.o(.text.Apply_Motor_Outputs) refers to easy_control.o(.bss.mix) for mix + easy_control.o(.text.Apply_Motor_Outputs) refers to easy_control.o(.bss.mixer) for mixer + easy_control.o(.text.Apply_Motor_Outputs) refers to f2d.o(x$fpl$f2d) for __aeabi_f2d + easy_control.o(.text.Apply_Motor_Outputs) refers to dmul.o(x$fpl$dmul) for __aeabi_dmul + easy_control.o(.text.Apply_Motor_Outputs) refers to daddsub_clz.o(x$fpl$dadd) for __aeabi_dadd + easy_control.o(.text.Apply_Motor_Outputs) refers to d2f.o(x$fpl$d2f) for __aeabi_d2f + easy_control.o(.text.Apply_Motor_Outputs) refers to pwm.o(.text.BSP_PWM_Set) for BSP_PWM_Set + easy_control.o(.ARM.exidx.text.Apply_Motor_Outputs) refers to easy_control.o(.text.Apply_Motor_Outputs) for [Anonymous Symbol] + easy_control.o(.text.MotorMixer_OutStop) refers to pwm.o(.text.BSP_PWM_Stop) for BSP_PWM_Stop + easy_control.o(.ARM.exidx.text.MotorMixer_OutStop) refers to easy_control.o(.text.MotorMixer_OutStop) for [Anonymous Symbol] + atti_esti.o(.text.Task_atti_esti) refers to atti_esti.o(.bss.bmi088) for bmi088 + atti_esti.o(.text.Task_atti_esti) refers to atti_esti.o(.data.bmi_cali) for bmi_cali + atti_esti.o(.text.Task_atti_esti) refers to bmi088.o(.text.BMI088_Init) for BMI088_Init + atti_esti.o(.text.Task_atti_esti) refers to bmi088.o(.text.BMI088_GetUpdateFreq) for BMI088_GetUpdateFreq + atti_esti.o(.text.Task_atti_esti) refers to atti_esti.o(.bss.gimbal_ahrs) for gimbal_ahrs + atti_esti.o(.text.Task_atti_esti) refers to atti_esti.o(.bss.ist8310) for ist8310 + atti_esti.o(.text.Task_atti_esti) refers to ahrs.o(.text.AHRS_Init) for AHRS_Init + atti_esti.o(.text.Task_atti_esti) refers to atti_esti.o(.bss.imu_temp_ctrl_pid) for imu_temp_ctrl_pid + atti_esti.o(.text.Task_atti_esti) refers to atti_esti.o(.rodata.imu_temp_ctrl_pid_param) for imu_temp_ctrl_pid_param + atti_esti.o(.text.Task_atti_esti) refers to pid.o(.text.PID_Init) for PID_Init + atti_esti.o(.text.Task_atti_esti) refers to pwm.o(.text.BSP_PWM_Start) for BSP_PWM_Start + atti_esti.o(.text.Task_atti_esti) refers to cmsis_os2.o(.text.osKernelGetTickFreq) for osKernelGetTickFreq + atti_esti.o(.text.Task_atti_esti) refers to cmsis_os2.o(.text.osDelay) for osDelay + atti_esti.o(.text.Task_atti_esti) refers to cmsis_os2.o(.text.osKernelGetTickCount) for osKernelGetTickCount + atti_esti.o(.text.Task_atti_esti) refers to user_task.o(.bss.task_runtime) for task_runtime + atti_esti.o(.text.Task_atti_esti) refers to atti_esti.o(.bss.eulr_to_send) for eulr_to_send + atti_esti.o(.text.Task_atti_esti) refers to cmsis_os2.o(.text.osThreadGetId) for osThreadGetId + atti_esti.o(.text.Task_atti_esti) refers to cmsis_os2.o(.text.osThreadGetStackSpace) for osThreadGetStackSpace + atti_esti.o(.text.Task_atti_esti) refers to bmi088.o(.text.BMI088_WaitNew) for BMI088_WaitNew + atti_esti.o(.text.Task_atti_esti) refers to bmi088.o(.text.BMI088_AcclStartDmaRecv) for BMI088_AcclStartDmaRecv + atti_esti.o(.text.Task_atti_esti) refers to bmi088.o(.text.BMI088_AcclWaitDmaCplt) for BMI088_AcclWaitDmaCplt + atti_esti.o(.text.Task_atti_esti) refers to bmi088.o(.text.BMI088_GyroStartDmaRecv) for BMI088_GyroStartDmaRecv + atti_esti.o(.text.Task_atti_esti) refers to bmi088.o(.text.BMI088_GyroWaitDmaCplt) for BMI088_GyroWaitDmaCplt + atti_esti.o(.text.Task_atti_esti) refers to cmsis_os2.o(.text.osKernelLock) for osKernelLock + atti_esti.o(.text.Task_atti_esti) refers to bmi088.o(.text.BMI088_ParseAccl) for BMI088_ParseAccl + atti_esti.o(.text.Task_atti_esti) refers to bmi088.o(.text.BMI088_ParseGyro) for BMI088_ParseGyro + atti_esti.o(.text.Task_atti_esti) refers to ahrs.o(.text.AHRS_Update) for AHRS_Update + atti_esti.o(.text.Task_atti_esti) refers to ahrs.o(.text.AHRS_GetEulr) for AHRS_GetEulr + atti_esti.o(.text.Task_atti_esti) refers to cmsis_os2.o(.text.osKernelUnlock) for osKernelUnlock + atti_esti.o(.text.Task_atti_esti) refers to cmsis_os2.o(.text.osMessageQueueReset) for osMessageQueueReset + atti_esti.o(.text.Task_atti_esti) refers to cmsis_os2.o(.text.osMessageQueuePut) for osMessageQueuePut + atti_esti.o(.text.Task_atti_esti) refers to pid.o(.text.PID_Calc) for PID_Calc + atti_esti.o(.text.Task_atti_esti) refers to pwm.o(.text.BSP_PWM_Set) for BSP_PWM_Set + atti_esti.o(.text.Task_atti_esti) refers to cmsis_os2.o(.text.osDelayUntil) for osDelayUntil + atti_esti.o(.ARM.exidx.text.Task_atti_esti) refers to atti_esti.o(.text.Task_atti_esti) for [Anonymous Symbol] + height_cal.o(.text.Task_height_cal) refers to cmsis_os2.o(.text.osKernelGetTickFreq) for osKernelGetTickFreq + height_cal.o(.text.Task_height_cal) refers to height_cal.o(.bss.alt_kf) for alt_kf + height_cal.o(.text.Task_height_cal) refers to fixed_height.o(.text.AltKalman_Init) for AltKalman_Init + height_cal.o(.text.Task_height_cal) refers to cmsis_os2.o(.text.osKernelGetTickCount) for osKernelGetTickCount + height_cal.o(.text.Task_height_cal) refers to height_cal.o(.bss.height_cal_cnt_last) for height_cal_cnt_last + height_cal.o(.text.Task_height_cal) refers to height_cal.o(.bss.height_cal_dt) for height_cal_dt + height_cal.o(.text.Task_height_cal) refers to height_cal.o(.bss.height_cal_running_states) for height_cal_running_states + height_cal.o(.text.Task_height_cal) refers to user_task.o(.bss.task_runtime) for task_runtime + height_cal.o(.text.Task_height_cal) refers to height_cal.o(.bss.height_cal_accl_buffer) for height_cal_accl_buffer + height_cal.o(.text.Task_height_cal) refers to height_cal.o(.bss.baro_height_buffer) for baro_height_buffer + height_cal.o(.text.Task_height_cal) refers to height_cal.o(.bss.initial_baro_height) for initial_baro_height + height_cal.o(.text.Task_height_cal) refers to cmsis_os2.o(.text.osDelayUntil) for osDelayUntil + height_cal.o(.text.Task_height_cal) refers to dwt.o(.text.DWT_GetDeltaT) for DWT_GetDeltaT + height_cal.o(.text.Task_height_cal) refers to cmsis_os2.o(.text.osMessageQueueGet) for osMessageQueueGet + height_cal.o(.text.Task_height_cal) refers to height_cal.o(.bss.Task_height_cal.accl_rx_flag) for Task_height_cal.accl_rx_flag + height_cal.o(.text.Task_height_cal) refers to height_cal.o(.bss.initial_gravity) for initial_gravity + height_cal.o(.text.Task_height_cal) refers to buzzer_pwm.o(.text.BSP_BUZZER_Set) for BSP_BUZZER_Set + height_cal.o(.text.Task_height_cal) refers to height_cal.o(.bss.baro_height_m) for baro_height_m + height_cal.o(.text.Task_height_cal) refers to height_cal.o(.bss.height_cal_accl_without_gravity) for height_cal_accl_without_gravity + height_cal.o(.text.Task_height_cal) refers to fixed_height.o(.text.AltKalman_Update) for AltKalman_Update + height_cal.o(.text.Task_height_cal) refers to cmsis_os2.o(.text.osMessageQueuePut) for osMessageQueuePut + height_cal.o(.text.Task_height_cal) refers to height_cal.o(.bss.Task_height_cal.baro_rx_flag) for Task_height_cal.baro_rx_flag + height_cal.o(.ARM.exidx.text.Task_height_cal) refers to height_cal.o(.text.Task_height_cal) for [Anonymous Symbol] + init.o(.text.Task_Init) refers to cmsis_os2.o(.text.osKernelLock) for osKernelLock + init.o(.text.Task_Init) refers to ps2_1.o(.text.Task_ps2) for Task_ps2 + init.o(.text.Task_Init) refers to user_task.o(.rodata.attr_ps2) for attr_ps2 + init.o(.text.Task_Init) refers to cmsis_os2.o(.text.osThreadNew) for osThreadNew + init.o(.text.Task_Init) refers to user_task.o(.bss.task_runtime) for task_runtime + init.o(.text.Task_Init) refers to test1.o(.text.Task_test1) for Task_test1 + init.o(.text.Task_Init) refers to user_task.o(.rodata.attr_test1) for attr_test1 + init.o(.text.Task_Init) refers to atti_esti.o(.text.Task_atti_esti) for Task_atti_esti + init.o(.text.Task_Init) refers to user_task.o(.rodata.attr_atti_esti) for attr_atti_esti + init.o(.text.Task_Init) refers to height_cal.o(.text.Task_height_cal) for Task_height_cal + init.o(.text.Task_Init) refers to user_task.o(.rodata.attr_height_cal) for attr_height_cal + init.o(.text.Task_Init) refers to main_control.o(.text.Task_main_control) for Task_main_control + init.o(.text.Task_Init) refers to user_task.o(.rodata.attr_main_control) for attr_main_control + init.o(.text.Task_Init) refers to cmsis_os2.o(.text.osMessageQueueNew) for osMessageQueueNew + init.o(.text.Task_Init) refers to dwt.o(.text.DWT_Init) for DWT_Init + init.o(.text.Task_Init) refers to cmsis_os2.o(.text.osKernelUnlock) for osKernelUnlock + init.o(.text.Task_Init) refers to cmsis_os2.o(.text.osThreadGetId) for osThreadGetId + init.o(.text.Task_Init) refers to cmsis_os2.o(.text.osThreadTerminate) for osThreadTerminate + init.o(.ARM.exidx.text.Task_Init) refers to init.o(.text.Task_Init) for [Anonymous Symbol] + main_control.o(.text.Task_main_control) refers to cmsis_os2.o(.text.osKernelGetTickFreq) for osKernelGetTickFreq + main_control.o(.text.Task_main_control) refers to cmsis_os2.o(.text.osDelay) for osDelay + main_control.o(.text.Task_main_control) refers to cmsis_os2.o(.text.osKernelGetTickCount) for osKernelGetTickCount + main_control.o(.text.Task_main_control) refers to easy_control.o(.text.FlightController_Init) for FlightController_Init + main_control.o(.text.Task_main_control) refers to pwm.o(.text.BSP_PWM_Start) for BSP_PWM_Start + main_control.o(.text.Task_main_control) refers to main_control.o(.bss.main_control_running_states) for main_control_running_states + main_control.o(.text.Task_main_control) refers to pwm.o(.text.BSP_PWM_Set) for BSP_PWM_Set + main_control.o(.text.Task_main_control) refers to cmsis_os2.o(.text.osDelayUntil) for osDelayUntil + main_control.o(.text.Task_main_control) refers to user_task.o(.bss.task_runtime) for task_runtime + main_control.o(.text.Task_main_control) refers to cmsis_os2.o(.text.osMessageQueueGet) for osMessageQueueGet + main_control.o(.text.Task_main_control) refers to main_control.o(.bss.main_control_rc) for main_control_rc + main_control.o(.text.Task_main_control) refers to main_control.o(.bss.sensors) for sensors + main_control.o(.text.Task_main_control) refers to main_control.o(.bss.main_control_cnt_last) for main_control_cnt_last + main_control.o(.text.Task_main_control) refers to dwt.o(.text.DWT_GetDeltaT) for DWT_GetDeltaT + main_control.o(.text.Task_main_control) refers to main_control.o(.bss.main_control_dt) for main_control_dt + main_control.o(.text.Task_main_control) refers to main_control.o(.bss.ctrl) for ctrl + main_control.o(.text.Task_main_control) refers to easy_control.o(.text.FlightController_Update) for FlightController_Update + main_control.o(.text.Task_main_control) refers to f2d.o(x$fpl$f2d) for __aeabi_f2d + main_control.o(.text.Task_main_control) refers to daddsub_clz.o(x$fpl$dadd) for __aeabi_dadd + main_control.o(.text.Task_main_control) refers to dmul.o(x$fpl$dmul) for __aeabi_dmul + main_control.o(.text.Task_main_control) refers to d2f.o(x$fpl$d2f) for __aeabi_d2f + main_control.o(.text.Task_main_control) refers to buzzer_pwm.o(.text.BSP_BUZZER_Set) for BSP_BUZZER_Set + main_control.o(.text.Task_main_control) refers to buzzer_pwm.o(.text.BSP_BUZZER_Stop) for BSP_BUZZER_Stop + main_control.o(.text.Task_main_control) refers to easy_control.o(.text.MotorMixer_Init) for MotorMixer_Init + main_control.o(.text.Task_main_control) refers to easy_control.o(.text.Apply_Motor_Outputs) for Apply_Motor_Outputs + main_control.o(.text.Task_main_control) refers to easy_control.o(.text.MotorMixer_OutStop) for MotorMixer_OutStop + main_control.o(.ARM.exidx.text.Task_main_control) refers to main_control.o(.text.Task_main_control) for [Anonymous Symbol] + ps2_1.o(.text.Task_ps2) refers to cmsis_os2.o(.text.osKernelGetTickFreq) for osKernelGetTickFreq + ps2_1.o(.text.Task_ps2) refers to delay.o(.text.BSP_Delay_Init) for BSP_Delay_Init + ps2_1.o(.text.Task_ps2) refers to cmsis_os2.o(.text.osKernelGetTickCount) for osKernelGetTickCount + ps2_1.o(.text.Task_ps2) refers to ps2.o(.bss.PS2_Data) for PS2_Data + ps2_1.o(.text.Task_ps2) refers to ps2_1.o(.bss.rc_to_send) for rc_to_send + ps2_1.o(.text.Task_ps2) refers to user_task.o(.bss.task_runtime) for task_runtime + ps2_1.o(.text.Task_ps2) refers to ps2.o(.text.PS2_Read_Data) for PS2_Read_Data + ps2_1.o(.text.Task_ps2) refers to ps2.o(.text.StickToThrottle_Optimized) for StickToThrottle_Optimized + ps2_1.o(.text.Task_ps2) refers to cmsis_os2.o(.text.osMessageQueuePut) for osMessageQueuePut + ps2_1.o(.text.Task_ps2) refers to cmsis_os2.o(.text.osDelayUntil) for osDelayUntil + ps2_1.o(.ARM.exidx.text.Task_ps2) refers to ps2_1.o(.text.Task_ps2) for [Anonymous Symbol] + test1.o(.text.UART_IdleCallback_test) refers to uart.o(.text.BSP_UART_GetHandle) for BSP_UART_GetHandle + test1.o(.text.UART_IdleCallback_test) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_DMAStop) for HAL_UART_DMAStop + test1.o(.text.UART_IdleCallback_test) refers to test1.o(.bss.rx_index) for rx_index + test1.o(.text.UART_IdleCallback_test) refers to test1.o(.bss.rx_complete) for rx_complete + test1.o(.text.UART_IdleCallback_test) refers to test1.o(.bss.rx_buffer) for rx_buffer + test1.o(.text.UART_IdleCallback_test) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_Receive_DMA) for HAL_UART_Receive_DMA + test1.o(.ARM.exidx.text.UART_IdleCallback_test) refers to test1.o(.text.UART_IdleCallback_test) for [Anonymous Symbol] + test1.o(.text.Task_test1) refers to cmsis_os2.o(.text.osKernelGetTickFreq) for osKernelGetTickFreq + test1.o(.text.Task_test1) refers to test1.o(.text.UART_IdleCallback_test) for UART_IdleCallback_test + test1.o(.text.Task_test1) refers to uart.o(.text.BSP_UART_RegisterCallback) for BSP_UART_RegisterCallback + test1.o(.text.Task_test1) refers to usart.o(.bss.huart6) for huart6 + test1.o(.text.Task_test1) refers to uart.o(.text.BSP_UART_GetHandle) for BSP_UART_GetHandle + test1.o(.text.Task_test1) refers to test1.o(.bss.rx_buffer) for rx_buffer + test1.o(.text.Task_test1) refers to stm32f4xx_hal_uart.o(.text.HAL_UART_Receive_DMA) for HAL_UART_Receive_DMA + test1.o(.text.Task_test1) refers to cmsis_os2.o(.text.osKernelGetTickCount) for osKernelGetTickCount + test1.o(.text.Task_test1) refers to test1.o(.bss.rx_complete) for rx_complete + test1.o(.text.Task_test1) refers to user_task.o(.bss.task_runtime) for task_runtime + test1.o(.text.Task_test1) refers to test1.o(.bss.height) for height + test1.o(.text.Task_test1) refers to test1.o(.bss.rx_index) for rx_index + test1.o(.text.Task_test1) refers to cmsis_os2.o(.text.osMessageQueuePut) for osMessageQueuePut + test1.o(.text.Task_test1) refers to cmsis_os2.o(.text.osDelayUntil) for osDelayUntil + test1.o(.text.Task_test1) refers to cmsis_os2.o(.text.osKernelLock) for osKernelLock + test1.o(.text.Task_test1) refers to cmsis_os2.o(.text.osKernelUnlock) for osKernelUnlock + test1.o(.ARM.exidx.text.Task_test1) refers to test1.o(.text.Task_test1) for [Anonymous Symbol] + user_task.o(.rodata.attr_init) refers to user_task.o(.rodata.str1.1) for [Anonymous Symbol] + user_task.o(.rodata.attr_ps2) refers to user_task.o(.rodata.str1.1) for [Anonymous Symbol] + user_task.o(.rodata.attr_test1) refers to user_task.o(.rodata.str1.1) for [Anonymous Symbol] + user_task.o(.rodata.attr_atti_esti) refers to user_task.o(.rodata.str1.1) for [Anonymous Symbol] + user_task.o(.rodata.attr_height_cal) refers to user_task.o(.rodata.str1.1) for [Anonymous Symbol] + user_task.o(.rodata.attr_main_control) refers to user_task.o(.rodata.str1.1) for [Anonymous Symbol] + rt_memcpy_v6.o(.text) refers to rt_memcpy_w.o(.text) for __aeabi_memcpy4 + aeabi_memset.o(.text) refers to rt_memclr.o(.text) for _memset + aeabi_memset4.o(.text) refers to rt_memclr_w.o(.text) for _memset_w + rt_memclr.o(.text) refers to rt_memclr_w.o(.text) for _memset_w + __main.o(!!!main) refers to __rtentry.o(.ARM.Collect$$rtentry$$00000000) for __rt_entry + d2f.o(x$fpl$d2f) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + d2f.o(x$fpl$d2f) refers to fretinf.o(x$fpl$fretinf) for __fpl_fretinf + d2f.o(x$fpl$d2f) refers to dnaninf.o(x$fpl$dnaninf) for __fpl_dnaninf + daddsub_clz.o(x$fpl$dadd) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + daddsub_clz.o(x$fpl$dadd) refers to daddsub_clz.o(x$fpl$dsub) for _dsub1 + daddsub_clz.o(x$fpl$dadd) refers to dretinf.o(x$fpl$dretinf) for __fpl_dretinf + daddsub_clz.o(x$fpl$dadd) refers to dnaninf.o(x$fpl$dnaninf) for __fpl_dnaninf + daddsub_clz.o(x$fpl$drsb) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + daddsub_clz.o(x$fpl$drsb) refers to daddsub_clz.o(x$fpl$dadd) for _dadd1 + daddsub_clz.o(x$fpl$drsb) refers to daddsub_clz.o(x$fpl$dsub) for _dsub1 + daddsub_clz.o(x$fpl$dsub) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + daddsub_clz.o(x$fpl$dsub) refers to daddsub_clz.o(x$fpl$dadd) for _dadd1 + daddsub_clz.o(x$fpl$dsub) refers to dnaninf.o(x$fpl$dnaninf) for __fpl_dnaninf + ddiv.o(x$fpl$drdiv) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + ddiv.o(x$fpl$drdiv) refers to ddiv.o(x$fpl$ddiv) for ddiv_entry + ddiv.o(x$fpl$ddiv) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + ddiv.o(x$fpl$ddiv) refers to dretinf.o(x$fpl$dretinf) for __fpl_dretinf + ddiv.o(x$fpl$ddiv) refers to dnaninf.o(x$fpl$dnaninf) for __fpl_dnaninf + dfix.o(x$fpl$dfix) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + dfix.o(x$fpl$dfix) refers to dnaninf.o(x$fpl$dnaninf) for __fpl_dnaninf + dfix.o(x$fpl$dfixr) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + dfix.o(x$fpl$dfixr) refers to dnaninf.o(x$fpl$dnaninf) for __fpl_dnaninf + dfixu.o(x$fpl$dfixu) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + dfixu.o(x$fpl$dfixu) refers to dnaninf.o(x$fpl$dnaninf) for __fpl_dnaninf + dfixu.o(x$fpl$dfixur) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + dfixu.o(x$fpl$dfixur) refers to dnaninf.o(x$fpl$dnaninf) for __fpl_dnaninf + dflt_clz.o(x$fpl$dfltu) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + dflt_clz.o(x$fpl$dflt) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + dflt_clz.o(x$fpl$dfltn) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + dmul.o(x$fpl$dmul) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + dmul.o(x$fpl$dmul) refers to dretinf.o(x$fpl$dretinf) for __fpl_dretinf + dmul.o(x$fpl$dmul) refers to dnaninf.o(x$fpl$dnaninf) for __fpl_dnaninf + f2d.o(x$fpl$f2d) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + f2d.o(x$fpl$f2d) refers to fnaninf.o(x$fpl$fnaninf) for __fpl_fnaninf + f2d.o(x$fpl$f2d) refers to dretinf.o(x$fpl$dretinf) for __fpl_dretinf + asinf.o(i.__hardfp_asinf) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + asinf.o(i.__hardfp_asinf) refers to sqrtf.o(i.sqrtf) for sqrtf + asinf.o(i.__hardfp_asinf) refers to fpclassifyf.o(i.__ARM_fpclassifyf) for __ARM_fpclassifyf + asinf.o(i.__hardfp_asinf) refers to funder.o(i.__mathlib_flt_underflow) for __mathlib_flt_underflow + asinf.o(i.__hardfp_asinf) refers to funder.o(i.__mathlib_flt_infnan) for __mathlib_flt_infnan + asinf.o(i.__hardfp_asinf) refers to _rserrno.o(.text) for __set_errno + asinf.o(i.__hardfp_asinf) refers to funder.o(i.__mathlib_flt_invalid) for __mathlib_flt_invalid + asinf.o(i.__softfp_asinf) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + asinf.o(i.__softfp_asinf) refers to asinf.o(i.__hardfp_asinf) for __hardfp_asinf + asinf.o(i.asinf) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + asinf.o(i.asinf) refers to asinf.o(i.__hardfp_asinf) for __hardfp_asinf + atan2.o(i.__hardfp_atan2) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + atan2.o(i.__hardfp_atan2) refers to dunder.o(i.__mathlib_dbl_infnan2) for __mathlib_dbl_infnan2 + atan2.o(i.__hardfp_atan2) refers to atan.o(i.atan) for atan + atan2.o(i.__hardfp_atan2) refers to basic.o(x$fpl$basic) for __aeabi_dneg + atan2.o(i.__hardfp_atan2) refers to ddiv.o(x$fpl$ddiv) for __aeabi_ddiv + atan2.o(i.__hardfp_atan2) refers to fabs.o(i.fabs) for fabs + atan2.o(i.__hardfp_atan2) refers to daddsub_clz.o(x$fpl$dsub) for __aeabi_dsub + atan2.o(i.__hardfp_atan2) refers to deqf.o(x$fpl$deqf) for __aeabi_cdcmpeq + atan2.o(i.__hardfp_atan2) refers to _rserrno.o(.text) for __set_errno + atan2.o(i.__hardfp_atan2) refers to daddsub_clz.o(x$fpl$drsb) for __aeabi_drsub + atan2.o(i.__hardfp_atan2) refers to qnan.o(.constdata) for __mathlib_zero + atan2.o(i.__softfp_atan2) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + atan2.o(i.__softfp_atan2) refers to atan2.o(i.__hardfp_atan2) for __hardfp_atan2 + atan2.o(i.atan2) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + atan2.o(i.atan2) refers to atan2.o(i.__hardfp_atan2) for __hardfp_atan2 + atan2f.o(i.__hardfp_atan2f) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + atan2f.o(i.__hardfp_atan2f) refers to fpclassifyf.o(i.__ARM_fpclassifyf) for __ARM_fpclassifyf + atan2f.o(i.__hardfp_atan2f) refers to funder.o(i.__mathlib_flt_underflow) for __mathlib_flt_underflow + atan2f.o(i.__hardfp_atan2f) refers to _rserrno.o(.text) for __set_errno + atan2f.o(i.__hardfp_atan2f) refers to funder.o(i.__mathlib_flt_infnan2) for __mathlib_flt_infnan2 + atan2f.o(i.__softfp_atan2f) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + atan2f.o(i.__softfp_atan2f) refers to atan2f.o(i.__hardfp_atan2f) for __hardfp_atan2f + atan2f.o(i.atan2f) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + atan2f.o(i.atan2f) refers to atan2f.o(i.__hardfp_atan2f) for __hardfp_atan2f + cosf.o(i.__hardfp_cosf) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + cosf.o(i.__hardfp_cosf) refers to rredf.o(i.__mathlib_rredf2) for __mathlib_rredf2 + cosf.o(i.__hardfp_cosf) refers to _rserrno.o(.text) for __set_errno + cosf.o(i.__hardfp_cosf) refers to funder.o(i.__mathlib_flt_invalid) for __mathlib_flt_invalid + cosf.o(i.__hardfp_cosf) refers to funder.o(i.__mathlib_flt_infnan) for __mathlib_flt_infnan + cosf.o(i.__softfp_cosf) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + cosf.o(i.__softfp_cosf) refers to cosf.o(i.__hardfp_cosf) for __hardfp_cosf + cosf.o(i.cosf) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + cosf.o(i.cosf) refers to cosf.o(i.__hardfp_cosf) for __hardfp_cosf + pow.o(i.__hardfp_pow) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + pow.o(i.__hardfp_pow) refers to dunder.o(i.__mathlib_dbl_infnan2) for __mathlib_dbl_infnan2 + pow.o(i.__hardfp_pow) refers to _rserrno.o(.text) for __set_errno + pow.o(i.__hardfp_pow) refers to dunder.o(i.__mathlib_dbl_divzero) for __mathlib_dbl_divzero + pow.o(i.__hardfp_pow) refers to basic.o(x$fpl$basic) for __aeabi_dneg + pow.o(i.__hardfp_pow) refers to dunder.o(i.__mathlib_dbl_overflow) for __mathlib_dbl_overflow + pow.o(i.__hardfp_pow) refers to ddiv.o(x$fpl$ddiv) for __aeabi_ddiv + pow.o(i.__hardfp_pow) refers to sqrt.o(i.sqrt) for sqrt + pow.o(i.__hardfp_pow) refers to fabs.o(i.fabs) for fabs + pow.o(i.__hardfp_pow) refers to dflt_clz.o(x$fpl$dflt) for __aeabi_i2d + pow.o(i.__hardfp_pow) refers to dunder.o(i.__mathlib_dbl_invalid) for __mathlib_dbl_invalid + pow.o(i.__hardfp_pow) refers to dmul.o(x$fpl$dmul) for __aeabi_dmul + pow.o(i.__hardfp_pow) refers to dunder.o(i.__mathlib_dbl_underflow) for __mathlib_dbl_underflow + pow.o(i.__hardfp_pow) refers to daddsub_clz.o(x$fpl$dsub) for __aeabi_dsub + pow.o(i.__hardfp_pow) refers to daddsub_clz.o(x$fpl$drsb) for __aeabi_drsub + pow.o(i.__hardfp_pow) refers to qnan.o(.constdata) for __mathlib_zero + pow.o(i.__hardfp_pow) refers to daddsub_clz.o(x$fpl$dadd) for __aeabi_dadd + pow.o(i.__hardfp_pow) refers to poly.o(i.__kernel_poly) for __kernel_poly + pow.o(i.__hardfp_pow) refers to pow.o(.constdata) for .constdata + pow.o(i.__hardfp_pow) refers to drleqf.o(x$fpl$drleqf) for __aeabi_cdrcmple + pow.o(i.__hardfp_pow) refers to scalbn.o(x$fpl$scalbn) for __ARM_scalbn + pow.o(i.__hardfp_pow) refers to fpclassify.o(i.__ARM_fpclassify) for __ARM_fpclassify + pow.o(i.__softfp_pow) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + pow.o(i.__softfp_pow) refers to pow.o(i.__hardfp_pow) for __hardfp_pow + pow.o(i.pow) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + pow.o(i.pow) refers to pow.o(i.__hardfp_pow) for __hardfp_pow + pow.o(.constdata) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + tanf.o(i.__hardfp_tanf) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + tanf.o(i.__hardfp_tanf) refers to rredf.o(i.__mathlib_rredf2) for __mathlib_rredf2 + tanf.o(i.__hardfp_tanf) refers to fpclassifyf.o(i.__ARM_fpclassifyf) for __ARM_fpclassifyf + tanf.o(i.__hardfp_tanf) refers to funder.o(i.__mathlib_flt_underflow) for __mathlib_flt_underflow + tanf.o(i.__hardfp_tanf) refers to _rserrno.o(.text) for __set_errno + tanf.o(i.__hardfp_tanf) refers to funder.o(i.__mathlib_flt_invalid) for __mathlib_flt_invalid + tanf.o(i.__hardfp_tanf) refers to funder.o(i.__mathlib_flt_infnan) for __mathlib_flt_infnan + tanf.o(i.__softfp_tanf) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + tanf.o(i.__softfp_tanf) refers to tanf.o(i.__hardfp_tanf) for __hardfp_tanf + tanf.o(i.tanf) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + tanf.o(i.tanf) refers to tanf.o(i.__hardfp_tanf) for __hardfp_tanf + __rtentry.o(.ARM.Collect$$rtentry$$00000000) refers (Special) to __rtentry2.o(.ARM.Collect$$rtentry$$0000000A) for __rt_entry_li + __rtentry.o(.ARM.Collect$$rtentry$$00000000) refers (Special) to __rtentry2.o(.ARM.Collect$$rtentry$$0000000D) for __rt_entry_main + __rtentry.o(.ARM.Collect$$rtentry$$00000000) refers (Special) to __rtentry2.o(.ARM.Collect$$rtentry$$0000000C) for __rt_entry_postli_1 + __rtentry.o(.ARM.Collect$$rtentry$$00000000) refers (Special) to __rtentry2.o(.ARM.Collect$$rtentry$$00000009) for __rt_entry_postsh_1 + __rtentry.o(.ARM.Collect$$rtentry$$00000000) refers (Special) to __rtentry2.o(.ARM.Collect$$rtentry$$00000002) for __rt_entry_presh_1 + __rtentry.o(.ARM.Collect$$rtentry$$00000000) refers (Special) to __rtentry4.o(.ARM.Collect$$rtentry$$00000004) for __rt_entry_sh + aeabi_ldiv0_sigfpe.o(.text) refers to rt_div0.o(.text) for __rt_div0 + _rserrno.o(.text) refers to rt_errno_addr_intlibspace.o(.text) for __aeabi_errno_addr + basic.o(x$fpl$basic) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + deqf.o(x$fpl$deqf) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + deqf.o(x$fpl$deqf) refers to dnaninf.o(x$fpl$dnaninf) for __fpl_dnaninf + deqf.o(x$fpl$deqf) refers to dcmpi.o(x$fpl$dcmpinf) for __fpl_dcmp_Inf + dnaninf.o(x$fpl$dnaninf) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + dretinf.o(x$fpl$dretinf) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + drleqf.o(x$fpl$drleqf) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + drleqf.o(x$fpl$drleqf) refers to dleqf.o(x$fpl$dleqf) for __fpl_dcmple_InfNaN + fnaninf.o(x$fpl$fnaninf) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + fretinf.o(x$fpl$fretinf) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + scalbn.o(x$fpl$scalbn) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + scalbn.o(x$fpl$scalbn) refers to dcheck1.o(x$fpl$dcheck1) for __fpl_dcheck_NaN1 + atan.o(i.__hardfp_atan) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + atan.o(i.__hardfp_atan) refers to dunder.o(i.__mathlib_dbl_infnan) for __mathlib_dbl_infnan + atan.o(i.__hardfp_atan) refers to fpclassify.o(i.__ARM_fpclassify) for __ARM_fpclassify + atan.o(i.__hardfp_atan) refers to dunder.o(i.__mathlib_dbl_underflow) for __mathlib_dbl_underflow + atan.o(i.__hardfp_atan) refers to fabs.o(i.fabs) for fabs + atan.o(i.__hardfp_atan) refers to daddsub_clz.o(x$fpl$dadd) for __aeabi_dadd + atan.o(i.__hardfp_atan) refers to dmul.o(x$fpl$dmul) for __aeabi_dmul + atan.o(i.__hardfp_atan) refers to daddsub_clz.o(x$fpl$dsub) for __aeabi_dsub + atan.o(i.__hardfp_atan) refers to ddiv.o(x$fpl$ddiv) for __aeabi_ddiv + atan.o(i.__hardfp_atan) refers to poly.o(i.__kernel_poly) for __kernel_poly + atan.o(i.__hardfp_atan) refers to daddsub_clz.o(x$fpl$drsb) for __aeabi_drsub + atan.o(i.__hardfp_atan) refers to basic.o(x$fpl$basic) for __aeabi_dneg + atan.o(i.__hardfp_atan) refers to atan.o(.constdata) for .constdata + atan.o(i.__softfp_atan) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + atan.o(i.__softfp_atan) refers to atan.o(i.__hardfp_atan) for __hardfp_atan + atan.o(i.atan) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + atan.o(i.atan) refers to atan.o(i.__hardfp_atan) for __hardfp_atan + atan.o(.constdata) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + dunder.o(i.__mathlib_dbl_divzero) refers to ddiv.o(x$fpl$ddiv) for __aeabi_ddiv + dunder.o(i.__mathlib_dbl_infnan) refers to daddsub_clz.o(x$fpl$dadd) for __aeabi_dadd + dunder.o(i.__mathlib_dbl_infnan2) refers to daddsub_clz.o(x$fpl$dadd) for __aeabi_dadd + dunder.o(i.__mathlib_dbl_invalid) refers to ddiv.o(x$fpl$ddiv) for __aeabi_ddiv + dunder.o(i.__mathlib_dbl_overflow) refers to dmul.o(x$fpl$dmul) for __aeabi_dmul + dunder.o(i.__mathlib_dbl_posinfnan) refers to dmul.o(x$fpl$dmul) for __aeabi_dmul + dunder.o(i.__mathlib_dbl_underflow) refers to dmul.o(x$fpl$dmul) for __aeabi_dmul + fabs.o(i.__hardfp_fabs) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + fabs.o(i.__softfp_fabs) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + fabs.o(i.fabs) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + fpclassify.o(i.__ARM_fpclassify) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + fpclassifyf.o(i.__ARM_fpclassifyf) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + poly.o(i.__kernel_poly) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + poly.o(i.__kernel_poly) refers to dmul.o(x$fpl$dmul) for __aeabi_dmul + poly.o(i.__kernel_poly) refers to daddsub_clz.o(x$fpl$dadd) for __aeabi_dadd + qnan.o(.constdata) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + rredf.o(i.__mathlib_rredf2) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + rredf.o(i.__mathlib_rredf2) refers to rredf.o(.constdata) for .constdata + rredf.o(.constdata) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + sqrt.o(i.__hardfp_sqrt) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + sqrt.o(i.__hardfp_sqrt) refers to dsqrt_umaal.o(x$fpl$dsqrt) for _dsqrt + sqrt.o(i.__hardfp_sqrt) refers to _rserrno.o(.text) for __set_errno + sqrt.o(i.__softfp_sqrt) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + sqrt.o(i.__softfp_sqrt) refers to dsqrt_umaal.o(x$fpl$dsqrt) for _dsqrt + sqrt.o(i.__softfp_sqrt) refers to _rserrno.o(.text) for __set_errno + sqrt.o(i.sqrt) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + sqrt.o(i.sqrt) refers to dsqrt_umaal.o(x$fpl$dsqrt) for _dsqrt + sqrt.o(i.sqrt) refers to _rserrno.o(.text) for __set_errno + sqrtf.o(i.__hardfp_sqrtf) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + sqrtf.o(i.__hardfp_sqrtf) refers to _rserrno.o(.text) for __set_errno + sqrtf.o(i.__softfp_sqrtf) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + sqrtf.o(i.__softfp_sqrtf) refers to _rserrno.o(.text) for __set_errno + sqrtf.o(i.sqrtf) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + sqrtf.o(i.sqrtf) refers to _rserrno.o(.text) for __set_errno + __rtentry2.o(.ARM.Collect$$rtentry$$00000008) refers to boardinit2.o(.text) for _platform_post_stackheap_init + __rtentry2.o(.ARM.Collect$$rtentry$$0000000A) refers to libinit.o(.ARM.Collect$$libinit$$00000000) for __rt_lib_init + __rtentry2.o(.ARM.Collect$$rtentry$$0000000B) refers to boardinit3.o(.text) for _platform_post_lib_init + __rtentry2.o(.ARM.Collect$$rtentry$$0000000D) refers to main.o(.text.main) for main + __rtentry2.o(.ARM.Collect$$rtentry$$0000000D) refers to exit.o(.text) for exit + __rtentry2.o(.ARM.exidx) refers to __rtentry2.o(.ARM.Collect$$rtentry$$00000001) for .ARM.Collect$$rtentry$$00000001 + __rtentry2.o(.ARM.exidx) refers to __rtentry2.o(.ARM.Collect$$rtentry$$00000008) for .ARM.Collect$$rtentry$$00000008 + __rtentry2.o(.ARM.exidx) refers to __rtentry2.o(.ARM.Collect$$rtentry$$0000000A) for .ARM.Collect$$rtentry$$0000000A + __rtentry2.o(.ARM.exidx) refers to __rtentry2.o(.ARM.Collect$$rtentry$$0000000B) for .ARM.Collect$$rtentry$$0000000B + __rtentry2.o(.ARM.exidx) refers to __rtentry2.o(.ARM.Collect$$rtentry$$0000000D) for .ARM.Collect$$rtentry$$0000000D + __rtentry4.o(.ARM.Collect$$rtentry$$00000004) refers to sys_stackheap_outer.o(.text) for __user_setup_stackheap + __rtentry4.o(.ARM.exidx) refers to __rtentry4.o(.ARM.Collect$$rtentry$$00000004) for .ARM.Collect$$rtentry$$00000004 + rt_div0.o(.text) refers to defsig_fpe_outer.o(.text) for __rt_SIGFPE + rt_errno_addr.o(.text) refers to rt_errno_addr.o(.bss) for __aeabi_errno_addr_data + rt_errno_addr_intlibspace.o(.text) refers to libspace.o(.bss) for __libspace_start + dcheck1.o(x$fpl$dcheck1) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + dcheck1.o(x$fpl$dcheck1) refers to retnan.o(x$fpl$retnan) for __fpl_return_NaN + dcmpi.o(x$fpl$dcmpinf) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + dleqf.o(x$fpl$dleqf) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + dleqf.o(x$fpl$dleqf) refers to dnaninf.o(x$fpl$dnaninf) for __fpl_dnaninf + dleqf.o(x$fpl$dleqf) refers to dcmpi.o(x$fpl$dcmpinf) for __fpl_dcmp_Inf + dsqrt_umaal.o(x$fpl$dsqrt) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + dsqrt_umaal.o(x$fpl$dsqrt) refers to dnaninf.o(x$fpl$dnaninf) for __fpl_dnaninf + libspace.o(.text) refers to libspace.o(.bss) for __libspace_start + sys_stackheap_outer.o(.text) refers to libspace.o(.text) for __user_perproc_libspace + sys_stackheap_outer.o(.text) refers to startup_stm32f407xx.o(.text) for __user_initial_stackheap + exit.o(.text) refers to rtexit.o(.ARM.Collect$$rtexit$$00000000) for __rt_exit + defsig_fpe_outer.o(.text) refers to defsig_fpe_inner.o(.text) for __rt_SIGFPE_inner + defsig_fpe_outer.o(.text) refers to defsig_exit.o(.text) for __sig_exit + defsig_fpe_formal.o(.text) refers to rt_raise.o(.text) for __rt_raise + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$0000002E) for __rt_lib_init_alloca_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$0000002C) for __rt_lib_init_argv_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$0000001B) for __rt_lib_init_atexit_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$00000021) for __rt_lib_init_clock_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$00000032) for __rt_lib_init_cpp_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$00000030) for __rt_lib_init_exceptions_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$00000001) for __rt_lib_init_fp_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$0000001F) for __rt_lib_init_fp_trap_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$00000023) for __rt_lib_init_getenv_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$0000000A) for __rt_lib_init_heap_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$00000011) for __rt_lib_init_lc_collate_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$00000013) for __rt_lib_init_lc_ctype_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$00000015) for __rt_lib_init_lc_monetary_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$00000017) for __rt_lib_init_lc_numeric_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$00000019) for __rt_lib_init_lc_time_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$00000004) for __rt_lib_init_preinit_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$0000000E) for __rt_lib_init_rand_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$00000033) for __rt_lib_init_return + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$0000001D) for __rt_lib_init_signal_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$00000025) for __rt_lib_init_stdio_1 + libinit.o(.ARM.Collect$$libinit$$00000000) refers (Special) to libinit2.o(.ARM.Collect$$libinit$$0000000C) for __rt_lib_init_user_alloc_1 + retnan.o(x$fpl$retnan) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + retnan.o(x$fpl$retnan) refers to trapv.o(x$fpl$trapveneer) for __fpl_cmpreturn + rtexit.o(.ARM.Collect$$rtexit$$00000000) refers (Special) to rtexit2.o(.ARM.Collect$$rtexit$$00000004) for __rt_exit_exit + rtexit.o(.ARM.Collect$$rtexit$$00000000) refers (Special) to rtexit2.o(.ARM.Collect$$rtexit$$00000003) for __rt_exit_ls + rtexit.o(.ARM.Collect$$rtexit$$00000000) refers (Special) to rtexit2.o(.ARM.Collect$$rtexit$$00000002) for __rt_exit_prels_1 + rtexit.o(.ARM.exidx) refers (Special) to rtexit2.o(.ARM.Collect$$rtexit$$00000004) for __rt_exit_exit + rtexit.o(.ARM.exidx) refers (Special) to rtexit2.o(.ARM.Collect$$rtexit$$00000003) for __rt_exit_ls + rtexit.o(.ARM.exidx) refers (Special) to rtexit2.o(.ARM.Collect$$rtexit$$00000002) for __rt_exit_prels_1 + rtexit.o(.ARM.exidx) refers to rtexit.o(.ARM.Collect$$rtexit$$00000000) for .ARM.Collect$$rtexit$$00000000 + rt_raise.o(.text) refers to __raise.o(.text) for __raise + rt_raise.o(.text) refers to sys_exit.o(.text) for _sys_exit + defsig_exit.o(.text) refers to sys_exit.o(.text) for _sys_exit + defsig_fpe_inner.o(.text) refers to defsig_general.o(.text) for __default_signal_display + libinit2.o(.ARM.Collect$$libinit$$00000001) refers to fpinit.o(x$fpl$fpinit) for _fp_init + libinit2.o(.ARM.Collect$$libinit$$00000010) refers to libinit2.o(.ARM.Collect$$libinit$$0000000F) for .ARM.Collect$$libinit$$0000000F + libinit2.o(.ARM.Collect$$libinit$$00000012) refers to libinit2.o(.ARM.Collect$$libinit$$0000000F) for .ARM.Collect$$libinit$$0000000F + libinit2.o(.ARM.Collect$$libinit$$00000014) refers to libinit2.o(.ARM.Collect$$libinit$$0000000F) for .ARM.Collect$$libinit$$0000000F + libinit2.o(.ARM.Collect$$libinit$$00000016) refers to libinit2.o(.ARM.Collect$$libinit$$0000000F) for .ARM.Collect$$libinit$$0000000F + libinit2.o(.ARM.Collect$$libinit$$00000018) refers to libinit2.o(.ARM.Collect$$libinit$$0000000F) for .ARM.Collect$$libinit$$0000000F + libinit2.o(.ARM.Collect$$libinit$$00000026) refers to argv_veneer.o(.emb_text) for __ARM_argv_veneer + libinit2.o(.ARM.Collect$$libinit$$00000027) refers to argv_veneer.o(.emb_text) for __ARM_argv_veneer + trapv.o(x$fpl$trapveneer) refers (Special) to usenofp.o(x$fpl$usenofp) for __I$use$fp + sys_exit.o(.text) refers (Special) to use_no_semi.o(.text) for __I$use$semihosting + sys_exit.o(.text) refers (Special) to indicate_semi.o(.text) for __semihosting_library_function + sys_exit_hlt.o(.text) refers (Special) to use_no_semi.o(.text) for __I$use$semihosting + sys_exit_hlt.o(.text) refers (Special) to indicate_semi.o(.text) for __semihosting_library_function + rtexit2.o(.ARM.Collect$$rtexit$$00000003) refers to libshutdown.o(.ARM.Collect$$libshutdown$$00000000) for __rt_lib_shutdown + rtexit2.o(.ARM.Collect$$rtexit$$00000004) refers to sys_exit.o(.text) for _sys_exit + rtexit2.o(.ARM.exidx) refers to rtexit2.o(.ARM.Collect$$rtexit$$00000001) for .ARM.Collect$$rtexit$$00000001 + rtexit2.o(.ARM.exidx) refers to rtexit2.o(.ARM.Collect$$rtexit$$00000003) for .ARM.Collect$$rtexit$$00000003 + rtexit2.o(.ARM.exidx) refers to rtexit2.o(.ARM.Collect$$rtexit$$00000004) for .ARM.Collect$$rtexit$$00000004 + __raise.o(.text) refers to defsig.o(CL$$defsig) for __default_signal_handler + defsig_general.o(.text) refers to sys_wrch.o(.text) for _ttywrch + argv_veneer.o(.emb_text) refers to no_argv.o(.text) for __ARM_get_argv + sys_wrch.o(.text) refers (Special) to use_no_semi.o(.text) for __I$use$semihosting + sys_wrch.o(.text) refers (Special) to indicate_semi.o(.text) for __semihosting_library_function + sys_wrch_hlt.o(.text) refers (Special) to use_no_semi.o(.text) for __I$use$semihosting + sys_wrch_hlt.o(.text) refers (Special) to indicate_semi.o(.text) for __semihosting_library_function + defsig.o(CL$$defsig) refers to defsig_fpe_inner.o(.text) for __rt_SIGFPE_inner + defsig.o(CL$$defsig) refers to defsig_rtmem_inner.o(.text) for __rt_SIGRTMEM_inner + _get_argv_nomalloc.o(.text) refers (Special) to hrguard.o(.text) for __heap_region$guard + _get_argv_nomalloc.o(.text) refers to defsig_rtmem_outer.o(.text) for __rt_SIGRTMEM + _get_argv_nomalloc.o(.text) refers to sys_command.o(.text) for _sys_command_string + libshutdown.o(.ARM.Collect$$libshutdown$$00000000) refers (Special) to libshutdown2.o(.ARM.Collect$$libshutdown$$00000002) for __rt_lib_shutdown_cpp_1 + libshutdown.o(.ARM.Collect$$libshutdown$$00000000) refers (Special) to libshutdown2.o(.ARM.Collect$$libshutdown$$00000007) for __rt_lib_shutdown_fp_trap_1 + libshutdown.o(.ARM.Collect$$libshutdown$$00000000) refers (Special) to libshutdown2.o(.ARM.Collect$$libshutdown$$0000000F) for __rt_lib_shutdown_heap_1 + libshutdown.o(.ARM.Collect$$libshutdown$$00000000) refers (Special) to libshutdown2.o(.ARM.Collect$$libshutdown$$00000010) for __rt_lib_shutdown_return + libshutdown.o(.ARM.Collect$$libshutdown$$00000000) refers (Special) to libshutdown2.o(.ARM.Collect$$libshutdown$$0000000A) for __rt_lib_shutdown_signal_1 + libshutdown.o(.ARM.Collect$$libshutdown$$00000000) refers (Special) to libshutdown2.o(.ARM.Collect$$libshutdown$$00000004) for __rt_lib_shutdown_stdio_1 + libshutdown.o(.ARM.Collect$$libshutdown$$00000000) refers (Special) to libshutdown2.o(.ARM.Collect$$libshutdown$$0000000C) for __rt_lib_shutdown_user_alloc_1 + sys_command.o(.text) refers (Special) to use_no_semi.o(.text) for __I$use$semihosting + sys_command.o(.text) refers (Special) to indicate_semi.o(.text) for __semihosting_library_function + sys_command_hlt.o(.text) refers (Special) to use_no_semi.o(.text) for __I$use$semihosting + sys_command_hlt.o(.text) refers (Special) to indicate_semi.o(.text) for __semihosting_library_function + defsig_abrt_inner.o(.text) refers to defsig_general.o(.text) for __default_signal_display + defsig_rtred_inner.o(.text) refers to defsig_general.o(.text) for __default_signal_display + defsig_rtmem_inner.o(.text) refers to defsig_general.o(.text) for __default_signal_display + defsig_rtmem_outer.o(.text) refers to defsig_rtmem_inner.o(.text) for __rt_SIGRTMEM_inner + defsig_rtmem_outer.o(.text) refers to defsig_exit.o(.text) for __sig_exit + defsig_rtmem_formal.o(.text) refers to rt_raise.o(.text) for __rt_raise + defsig_stak_inner.o(.text) refers to defsig_general.o(.text) for __default_signal_display + defsig_pvfn_inner.o(.text) refers to defsig_general.o(.text) for __default_signal_display + defsig_cppl_inner.o(.text) refers to defsig_general.o(.text) for __default_signal_display + defsig_segv_inner.o(.text) refers to defsig_general.o(.text) for __default_signal_display + defsig_other.o(.text) refers to defsig_general.o(.text) for __default_signal_display + + +============================================================================== + +Removing Unused input sections from the image. + + Removing main.o(.text), (0 bytes). + Removing main.o(.ARM.exidx.text.main), (8 bytes). + Removing main.o(.ARM.exidx.text.SystemClock_Config), (8 bytes). + Removing main.o(.ARM.exidx.text.Error_Handler), (8 bytes). + Removing main.o(.ARM.use_no_argv), (4 bytes). + Removing gpio.o(.text), (0 bytes). + Removing gpio.o(.ARM.exidx.text.MX_GPIO_Init), (8 bytes). + Removing freertos.o(.text), (0 bytes). + Removing freertos.o(.ARM.exidx.text.MX_FREERTOS_Init), (8 bytes). + Removing freertos.o(.ARM.exidx.text.StartDefaultTask), (8 bytes). + Removing dma.o(.text), (0 bytes). + Removing dma.o(.ARM.exidx.text.MX_DMA_Init), (8 bytes). + Removing i2c.o(.text), (0 bytes). + Removing i2c.o(.ARM.exidx.text.MX_I2C2_Init), (8 bytes). + Removing i2c.o(.ARM.exidx.text.MX_I2C3_Init), (8 bytes). + Removing i2c.o(.ARM.exidx.text.HAL_I2C_MspInit), (8 bytes). + Removing i2c.o(.text.HAL_I2C_MspDeInit), (130 bytes). + Removing i2c.o(.ARM.exidx.text.HAL_I2C_MspDeInit), (8 bytes). + Removing spi.o(.text), (0 bytes). + Removing spi.o(.ARM.exidx.text.MX_SPI1_Init), (8 bytes). + Removing spi.o(.ARM.exidx.text.HAL_SPI_MspInit), (8 bytes). + Removing spi.o(.text.HAL_SPI_MspDeInit), (70 bytes). + Removing spi.o(.ARM.exidx.text.HAL_SPI_MspDeInit), (8 bytes). + Removing tim.o(.text), (0 bytes). + Removing tim.o(.ARM.exidx.text.MX_TIM1_Init), (8 bytes). + Removing tim.o(.ARM.exidx.text.HAL_TIM_MspPostInit), (8 bytes). + Removing tim.o(.ARM.exidx.text.MX_TIM4_Init), (8 bytes). + Removing tim.o(.ARM.exidx.text.MX_TIM5_Init), (8 bytes). + Removing tim.o(.ARM.exidx.text.MX_TIM10_Init), (8 bytes). + Removing tim.o(.ARM.exidx.text.HAL_TIM_PWM_MspInit), (8 bytes). + Removing tim.o(.ARM.exidx.text.HAL_TIM_Base_MspInit), (8 bytes). + Removing tim.o(.text.HAL_TIM_PWM_MspDeInit), (92 bytes). + Removing tim.o(.ARM.exidx.text.HAL_TIM_PWM_MspDeInit), (8 bytes). + Removing tim.o(.text.HAL_TIM_Base_MspDeInit), (34 bytes). + Removing tim.o(.ARM.exidx.text.HAL_TIM_Base_MspDeInit), (8 bytes). + Removing usart.o(.text), (0 bytes). + Removing usart.o(.ARM.exidx.text.MX_USART6_UART_Init), (8 bytes). + Removing usart.o(.ARM.exidx.text.HAL_UART_MspInit), (8 bytes). + Removing usart.o(.text.HAL_UART_MspDeInit), (62 bytes). + Removing usart.o(.ARM.exidx.text.HAL_UART_MspDeInit), (8 bytes). + Removing stm32f4xx_it.o(.text), (0 bytes). + Removing stm32f4xx_it.o(.ARM.exidx.text.NMI_Handler), (8 bytes). + Removing stm32f4xx_it.o(.ARM.exidx.text.HardFault_Handler), (8 bytes). + Removing stm32f4xx_it.o(.ARM.exidx.text.MemManage_Handler), (8 bytes). + Removing stm32f4xx_it.o(.ARM.exidx.text.BusFault_Handler), (8 bytes). + Removing stm32f4xx_it.o(.ARM.exidx.text.UsageFault_Handler), (8 bytes). + Removing stm32f4xx_it.o(.ARM.exidx.text.DebugMon_Handler), (8 bytes). + Removing stm32f4xx_it.o(.ARM.exidx.text.SysTick_Handler), (8 bytes). + Removing stm32f4xx_it.o(.ARM.exidx.text.EXTI3_IRQHandler), (8 bytes). + Removing stm32f4xx_it.o(.ARM.exidx.text.EXTI4_IRQHandler), (8 bytes). + Removing stm32f4xx_it.o(.ARM.exidx.text.DMA1_Stream2_IRQHandler), (8 bytes). + Removing stm32f4xx_it.o(.ARM.exidx.text.EXTI9_5_IRQHandler), (8 bytes). + Removing stm32f4xx_it.o(.ARM.exidx.text.DMA2_Stream1_IRQHandler), (8 bytes). + Removing stm32f4xx_it.o(.ARM.exidx.text.DMA2_Stream2_IRQHandler), (8 bytes). + Removing stm32f4xx_it.o(.ARM.exidx.text.DMA2_Stream3_IRQHandler), (8 bytes). + Removing stm32f4xx_it.o(.ARM.exidx.text.USART6_IRQHandler), (8 bytes). + Removing stm32f4xx_hal_msp.o(.text), (0 bytes). + Removing stm32f4xx_hal_msp.o(.ARM.exidx.text.HAL_MspInit), (8 bytes). + Removing stm32f4xx_hal_rcc.o(.text), (0 bytes). + Removing stm32f4xx_hal_rcc.o(.text.HAL_RCC_DeInit), (4 bytes). + Removing stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_DeInit), (8 bytes). + Removing stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_OscConfig), (8 bytes). + Removing stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_ClockConfig), (8 bytes). + Removing stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_GetSysClockFreq), (8 bytes). + Removing stm32f4xx_hal_rcc.o(.text.HAL_RCC_MCOConfig), (158 bytes). + Removing stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_MCOConfig), (8 bytes). + Removing stm32f4xx_hal_rcc.o(.text.HAL_RCC_EnableCSS), (12 bytes). + Removing stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_EnableCSS), (8 bytes). + Removing stm32f4xx_hal_rcc.o(.text.HAL_RCC_DisableCSS), (12 bytes). + Removing stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_DisableCSS), (8 bytes). + Removing stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_GetHCLKFreq), (8 bytes). + Removing stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_GetPCLK1Freq), (8 bytes). + Removing stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_GetPCLK2Freq), (8 bytes). + Removing stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetOscConfig), (152 bytes). + Removing stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_GetOscConfig), (8 bytes). + Removing stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetClockConfig), (62 bytes). + Removing stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_GetClockConfig), (8 bytes). + Removing stm32f4xx_hal_rcc.o(.text.HAL_RCC_NMI_IRQHandler), (28 bytes). + Removing stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_NMI_IRQHandler), (8 bytes). + Removing stm32f4xx_hal_rcc.o(.text.HAL_RCC_CSSCallback), (2 bytes). + Removing stm32f4xx_hal_rcc.o(.ARM.exidx.text.HAL_RCC_CSSCallback), (8 bytes). + Removing stm32f4xx_hal_rcc_ex.o(.text), (0 bytes). + Removing stm32f4xx_hal_rcc_ex.o(.text.HAL_RCCEx_PeriphCLKConfig), (326 bytes). + Removing stm32f4xx_hal_rcc_ex.o(.ARM.exidx.text.HAL_RCCEx_PeriphCLKConfig), (8 bytes). + Removing stm32f4xx_hal_rcc_ex.o(.text.HAL_RCCEx_GetPeriphCLKConfig), (50 bytes). + Removing stm32f4xx_hal_rcc_ex.o(.ARM.exidx.text.HAL_RCCEx_GetPeriphCLKConfig), (8 bytes). + Removing stm32f4xx_hal_rcc_ex.o(.text.HAL_RCCEx_GetPeriphCLKFreq), (88 bytes). + Removing stm32f4xx_hal_rcc_ex.o(.ARM.exidx.text.HAL_RCCEx_GetPeriphCLKFreq), (8 bytes). + Removing stm32f4xx_hal_rcc_ex.o(.text.HAL_RCCEx_EnablePLLI2S), (104 bytes). + Removing stm32f4xx_hal_rcc_ex.o(.ARM.exidx.text.HAL_RCCEx_EnablePLLI2S), (8 bytes). + Removing stm32f4xx_hal_rcc_ex.o(.text.HAL_RCCEx_DisablePLLI2S), (52 bytes). + Removing stm32f4xx_hal_rcc_ex.o(.ARM.exidx.text.HAL_RCCEx_DisablePLLI2S), (8 bytes). + Removing stm32f4xx_hal_rcc_ex.o(.text.HAL_RCC_DeInit), (290 bytes). + Removing stm32f4xx_hal_rcc_ex.o(.ARM.exidx.text.HAL_RCC_DeInit), (8 bytes). + Removing stm32f4xx_hal_flash.o(.text), (0 bytes). + Removing stm32f4xx_hal_flash.o(.text.HAL_FLASH_Program), (134 bytes). + Removing stm32f4xx_hal_flash.o(.ARM.exidx.text.HAL_FLASH_Program), (8 bytes). + Removing stm32f4xx_hal_flash.o(.text.FLASH_WaitForLastOperation), (106 bytes). + Removing stm32f4xx_hal_flash.o(.ARM.exidx.text.FLASH_WaitForLastOperation), (8 bytes). + Removing stm32f4xx_hal_flash.o(.text.FLASH_Program_Byte), (32 bytes). + Removing stm32f4xx_hal_flash.o(.ARM.exidx.text.FLASH_Program_Byte), (8 bytes). + Removing stm32f4xx_hal_flash.o(.text.FLASH_Program_HalfWord), (36 bytes). + Removing stm32f4xx_hal_flash.o(.ARM.exidx.text.FLASH_Program_HalfWord), (8 bytes). + Removing stm32f4xx_hal_flash.o(.text.FLASH_Program_Word), (36 bytes). + Removing stm32f4xx_hal_flash.o(.ARM.exidx.text.FLASH_Program_Word), (8 bytes). + Removing stm32f4xx_hal_flash.o(.text.FLASH_Program_DoubleWord), (56 bytes). + Removing stm32f4xx_hal_flash.o(.ARM.exidx.text.FLASH_Program_DoubleWord), (8 bytes). + Removing stm32f4xx_hal_flash.o(.text.HAL_FLASH_Program_IT), (104 bytes). + Removing stm32f4xx_hal_flash.o(.ARM.exidx.text.HAL_FLASH_Program_IT), (8 bytes). + Removing stm32f4xx_hal_flash.o(.text.HAL_FLASH_IRQHandler), (206 bytes). + Removing stm32f4xx_hal_flash.o(.ARM.exidx.text.HAL_FLASH_IRQHandler), (8 bytes). + Removing stm32f4xx_hal_flash.o(.text.FLASH_SetErrorCode), (110 bytes). + Removing stm32f4xx_hal_flash.o(.ARM.exidx.text.FLASH_SetErrorCode), (8 bytes). + Removing stm32f4xx_hal_flash.o(.text.HAL_FLASH_OperationErrorCallback), (2 bytes). + Removing stm32f4xx_hal_flash.o(.ARM.exidx.text.HAL_FLASH_OperationErrorCallback), (8 bytes). + Removing stm32f4xx_hal_flash.o(.text.HAL_FLASH_EndOfOperationCallback), (2 bytes). + Removing stm32f4xx_hal_flash.o(.ARM.exidx.text.HAL_FLASH_EndOfOperationCallback), (8 bytes). + Removing stm32f4xx_hal_flash.o(.text.HAL_FLASH_Unlock), (46 bytes). + Removing stm32f4xx_hal_flash.o(.ARM.exidx.text.HAL_FLASH_Unlock), (8 bytes). + Removing stm32f4xx_hal_flash.o(.text.HAL_FLASH_Lock), (20 bytes). + Removing stm32f4xx_hal_flash.o(.ARM.exidx.text.HAL_FLASH_Lock), (8 bytes). + Removing stm32f4xx_hal_flash.o(.text.HAL_FLASH_OB_Unlock), (42 bytes). + Removing stm32f4xx_hal_flash.o(.ARM.exidx.text.HAL_FLASH_OB_Unlock), (8 bytes). + Removing stm32f4xx_hal_flash.o(.text.HAL_FLASH_OB_Lock), (20 bytes). + Removing stm32f4xx_hal_flash.o(.ARM.exidx.text.HAL_FLASH_OB_Lock), (8 bytes). + Removing stm32f4xx_hal_flash.o(.text.HAL_FLASH_OB_Launch), (28 bytes). + Removing stm32f4xx_hal_flash.o(.ARM.exidx.text.HAL_FLASH_OB_Launch), (8 bytes). + Removing stm32f4xx_hal_flash.o(.text.HAL_FLASH_GetError), (12 bytes). + Removing stm32f4xx_hal_flash.o(.ARM.exidx.text.HAL_FLASH_GetError), (8 bytes). + Removing stm32f4xx_hal_flash.o(.data.pFlash), (32 bytes). + Removing stm32f4xx_hal_flash_ex.o(.text), (0 bytes). + Removing stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_Erase), (178 bytes). + Removing stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.HAL_FLASHEx_Erase), (8 bytes). + Removing stm32f4xx_hal_flash_ex.o(.text.FLASH_MassErase), (38 bytes). + Removing stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_MassErase), (8 bytes). + Removing stm32f4xx_hal_flash_ex.o(.text.FLASH_Erase_Sector), (70 bytes). + Removing stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_Erase_Sector), (8 bytes). + Removing stm32f4xx_hal_flash_ex.o(.text.FLASH_FlushCaches), (88 bytes). + Removing stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_FlushCaches), (8 bytes). + Removing stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_Erase_IT), (98 bytes). + Removing stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.HAL_FLASHEx_Erase_IT), (8 bytes). + Removing stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_OBProgram), (106 bytes). + Removing stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.HAL_FLASHEx_OBProgram), (8 bytes). + Removing stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_EnableWRP), (34 bytes). + Removing stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_OB_EnableWRP), (8 bytes). + Removing stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_DisableWRP), (34 bytes). + Removing stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_OB_DisableWRP), (8 bytes). + Removing stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_RDP_LevelConfig), (30 bytes). + Removing stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_OB_RDP_LevelConfig), (8 bytes). + Removing stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_UserConfig), (48 bytes). + Removing stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_OB_UserConfig), (8 bytes). + Removing stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_BOR_LevelConfig), (24 bytes). + Removing stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_OB_BOR_LevelConfig), (8 bytes). + Removing stm32f4xx_hal_flash_ex.o(.text.HAL_FLASHEx_OBGetConfig), (34 bytes). + Removing stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.HAL_FLASHEx_OBGetConfig), (8 bytes). + Removing stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_GetWRP), (12 bytes). + Removing stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_OB_GetWRP), (8 bytes). + Removing stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_GetRDP), (28 bytes). + Removing stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_OB_GetRDP), (8 bytes). + Removing stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_GetUser), (16 bytes). + Removing stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_OB_GetUser), (8 bytes). + Removing stm32f4xx_hal_flash_ex.o(.text.FLASH_OB_GetBOR), (16 bytes). + Removing stm32f4xx_hal_flash_ex.o(.ARM.exidx.text.FLASH_OB_GetBOR), (8 bytes). + Removing stm32f4xx_hal_flash_ramfunc.o(.text), (0 bytes). + Removing stm32f4xx_hal_gpio.o(.text), (0 bytes). + Removing stm32f4xx_hal_gpio.o(.ARM.exidx.text.HAL_GPIO_Init), (8 bytes). + Removing stm32f4xx_hal_gpio.o(.text.HAL_GPIO_DeInit), (262 bytes). + Removing stm32f4xx_hal_gpio.o(.ARM.exidx.text.HAL_GPIO_DeInit), (8 bytes). + Removing stm32f4xx_hal_gpio.o(.text.HAL_GPIO_ReadPin), (10 bytes). + Removing stm32f4xx_hal_gpio.o(.ARM.exidx.text.HAL_GPIO_ReadPin), (8 bytes). + Removing stm32f4xx_hal_gpio.o(.ARM.exidx.text.HAL_GPIO_WritePin), (8 bytes). + Removing stm32f4xx_hal_gpio.o(.text.HAL_GPIO_TogglePin), (16 bytes). + Removing stm32f4xx_hal_gpio.o(.ARM.exidx.text.HAL_GPIO_TogglePin), (8 bytes). + Removing stm32f4xx_hal_gpio.o(.text.HAL_GPIO_LockPin), (40 bytes). + Removing stm32f4xx_hal_gpio.o(.ARM.exidx.text.HAL_GPIO_LockPin), (8 bytes). + Removing stm32f4xx_hal_gpio.o(.ARM.exidx.text.HAL_GPIO_EXTI_IRQHandler), (8 bytes). + Removing stm32f4xx_hal_gpio.o(.text.HAL_GPIO_EXTI_Callback), (2 bytes). + Removing stm32f4xx_hal_gpio.o(.ARM.exidx.text.HAL_GPIO_EXTI_Callback), (8 bytes). + Removing stm32f4xx_hal_dma_ex.o(.text), (0 bytes). + Removing stm32f4xx_hal_dma_ex.o(.text.HAL_DMAEx_MultiBufferStart), (96 bytes). + Removing stm32f4xx_hal_dma_ex.o(.ARM.exidx.text.HAL_DMAEx_MultiBufferStart), (8 bytes). + Removing stm32f4xx_hal_dma_ex.o(.text.DMA_MultiBufferSetConfig), (30 bytes). + Removing stm32f4xx_hal_dma_ex.o(.ARM.exidx.text.DMA_MultiBufferSetConfig), (8 bytes). + Removing stm32f4xx_hal_dma_ex.o(.text.HAL_DMAEx_MultiBufferStart_IT), (1456 bytes). + Removing stm32f4xx_hal_dma_ex.o(.ARM.exidx.text.HAL_DMAEx_MultiBufferStart_IT), (8 bytes). + Removing stm32f4xx_hal_dma_ex.o(.text.HAL_DMAEx_ChangeMemory), (20 bytes). + Removing stm32f4xx_hal_dma_ex.o(.ARM.exidx.text.HAL_DMAEx_ChangeMemory), (8 bytes). + Removing stm32f4xx_hal_dma.o(.text), (0 bytes). + Removing stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_Init), (8 bytes). + Removing stm32f4xx_hal_dma.o(.ARM.exidx.text.DMA_CheckFifoParam), (8 bytes). + Removing stm32f4xx_hal_dma.o(.ARM.exidx.text.DMA_CalcBaseAndBitshift), (8 bytes). + Removing stm32f4xx_hal_dma.o(.text.HAL_DMA_DeInit), (90 bytes). + Removing stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_DeInit), (8 bytes). + Removing stm32f4xx_hal_dma.o(.text.HAL_DMA_Start), (66 bytes). + Removing stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_Start), (8 bytes). + Removing stm32f4xx_hal_dma.o(.text.DMA_SetConfig), (48 bytes). + Removing stm32f4xx_hal_dma.o(.ARM.exidx.text.DMA_SetConfig), (8 bytes). + Removing stm32f4xx_hal_dma.o(.text.HAL_DMA_Start_IT), (98 bytes). + Removing stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_Start_IT), (8 bytes). + Removing stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_Abort), (8 bytes). + Removing stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_Abort_IT), (8 bytes). + Removing stm32f4xx_hal_dma.o(.text.HAL_DMA_PollForTransfer), (340 bytes). + Removing stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_PollForTransfer), (8 bytes). + Removing stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_IRQHandler), (8 bytes). + Removing stm32f4xx_hal_dma.o(.text.HAL_DMA_RegisterCallback), (84 bytes). + Removing stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_RegisterCallback), (8 bytes). + Removing stm32f4xx_hal_dma.o(.text.HAL_DMA_UnRegisterCallback), (104 bytes). + Removing stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_UnRegisterCallback), (8 bytes). + Removing stm32f4xx_hal_dma.o(.text.HAL_DMA_GetState), (6 bytes). + Removing stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_GetState), (8 bytes). + Removing stm32f4xx_hal_dma.o(.text.HAL_DMA_GetError), (4 bytes). + Removing stm32f4xx_hal_dma.o(.ARM.exidx.text.HAL_DMA_GetError), (8 bytes). + Removing stm32f4xx_hal_pwr.o(.text), (0 bytes). + Removing stm32f4xx_hal_pwr.o(.text.HAL_PWR_DeInit), (26 bytes). + Removing stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_DeInit), (8 bytes). + Removing stm32f4xx_hal_pwr.o(.text.HAL_PWR_EnableBkUpAccess), (30 bytes). + Removing stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_EnableBkUpAccess), (8 bytes). + Removing stm32f4xx_hal_pwr.o(.text.HAL_PWR_DisableBkUpAccess), (30 bytes). + Removing stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_DisableBkUpAccess), (8 bytes). + Removing stm32f4xx_hal_pwr.o(.text.HAL_PWR_ConfigPVD), (128 bytes). + Removing stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_ConfigPVD), (8 bytes). + Removing stm32f4xx_hal_pwr.o(.text.HAL_PWR_EnablePVD), (12 bytes). + Removing stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_EnablePVD), (8 bytes). + Removing stm32f4xx_hal_pwr.o(.text.HAL_PWR_DisablePVD), (12 bytes). + Removing stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_DisablePVD), (8 bytes). + Removing stm32f4xx_hal_pwr.o(.text.HAL_PWR_EnableWakeUpPin), (16 bytes). + Removing stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_EnableWakeUpPin), (8 bytes). + Removing stm32f4xx_hal_pwr.o(.text.HAL_PWR_DisableWakeUpPin), (18 bytes). + Removing stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_DisableWakeUpPin), (8 bytes). + Removing stm32f4xx_hal_pwr.o(.text.HAL_PWR_EnterSLEEPMode), (36 bytes). + Removing stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_EnterSLEEPMode), (8 bytes). + Removing stm32f4xx_hal_pwr.o(.text.HAL_PWR_EnterSTOPMode), (70 bytes). + Removing stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_EnterSTOPMode), (8 bytes). + Removing stm32f4xx_hal_pwr.o(.text.HAL_PWR_EnterSTANDBYMode), (36 bytes). + Removing stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_EnterSTANDBYMode), (8 bytes). + Removing stm32f4xx_hal_pwr.o(.text.HAL_PWR_PVD_IRQHandler), (30 bytes). + Removing stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_PVD_IRQHandler), (8 bytes). + Removing stm32f4xx_hal_pwr.o(.text.HAL_PWR_PVDCallback), (2 bytes). + Removing stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_PVDCallback), (8 bytes). + Removing stm32f4xx_hal_pwr.o(.text.HAL_PWR_EnableSleepOnExit), (18 bytes). + Removing stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_EnableSleepOnExit), (8 bytes). + Removing stm32f4xx_hal_pwr.o(.text.HAL_PWR_DisableSleepOnExit), (18 bytes). + Removing stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_DisableSleepOnExit), (8 bytes). + Removing stm32f4xx_hal_pwr.o(.text.HAL_PWR_EnableSEVOnPend), (18 bytes). + Removing stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_EnableSEVOnPend), (8 bytes). + Removing stm32f4xx_hal_pwr.o(.text.HAL_PWR_DisableSEVOnPend), (18 bytes). + Removing stm32f4xx_hal_pwr.o(.ARM.exidx.text.HAL_PWR_DisableSEVOnPend), (8 bytes). + Removing stm32f4xx_hal_pwr_ex.o(.text), (0 bytes). + Removing stm32f4xx_hal_pwr_ex.o(.text.HAL_PWREx_EnableBkUpReg), (54 bytes). + Removing stm32f4xx_hal_pwr_ex.o(.ARM.exidx.text.HAL_PWREx_EnableBkUpReg), (8 bytes). + Removing stm32f4xx_hal_pwr_ex.o(.text.HAL_PWREx_DisableBkUpReg), (54 bytes). + Removing stm32f4xx_hal_pwr_ex.o(.ARM.exidx.text.HAL_PWREx_DisableBkUpReg), (8 bytes). + Removing stm32f4xx_hal_pwr_ex.o(.text.HAL_PWREx_EnableFlashPowerDown), (12 bytes). + Removing stm32f4xx_hal_pwr_ex.o(.ARM.exidx.text.HAL_PWREx_EnableFlashPowerDown), (8 bytes). + Removing stm32f4xx_hal_pwr_ex.o(.text.HAL_PWREx_DisableFlashPowerDown), (12 bytes). + Removing stm32f4xx_hal_pwr_ex.o(.ARM.exidx.text.HAL_PWREx_DisableFlashPowerDown), (8 bytes). + Removing stm32f4xx_hal_pwr_ex.o(.text.HAL_PWREx_GetVoltageRange), (16 bytes). + Removing stm32f4xx_hal_pwr_ex.o(.ARM.exidx.text.HAL_PWREx_GetVoltageRange), (8 bytes). + Removing stm32f4xx_hal_pwr_ex.o(.text.HAL_PWREx_ControlVoltageScaling), (102 bytes). + Removing stm32f4xx_hal_pwr_ex.o(.ARM.exidx.text.HAL_PWREx_ControlVoltageScaling), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text), (0 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_NVIC_SetPriorityGrouping), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.__NVIC_SetPriorityGrouping), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_NVIC_SetPriority), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.__NVIC_GetPriorityGrouping), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.__NVIC_SetPriority), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.NVIC_EncodePriority), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_NVIC_EnableIRQ), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.__NVIC_EnableIRQ), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.HAL_NVIC_DisableIRQ), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_NVIC_DisableIRQ), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.__NVIC_DisableIRQ), (40 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.__NVIC_DisableIRQ), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SystemReset), (4 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_NVIC_SystemReset), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.__NVIC_SystemReset), (36 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.__NVIC_SystemReset), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_SYSTICK_Config), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.SysTick_Config), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.HAL_MPU_Disable), (26 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_MPU_Disable), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.HAL_MPU_Enable), (32 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_MPU_Enable), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.HAL_MPU_EnableRegion), (22 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_MPU_EnableRegion), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.HAL_MPU_DisableRegion), (22 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_MPU_DisableRegion), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.HAL_MPU_ConfigRegion), (94 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_MPU_ConfigRegion), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.HAL_CORTEX_ClearEvent), (6 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_CORTEX_ClearEvent), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.HAL_NVIC_GetPriorityGrouping), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_NVIC_GetPriorityGrouping), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.HAL_NVIC_GetPriority), (24 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_NVIC_GetPriority), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.NVIC_DecodePriority), (56 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.NVIC_DecodePriority), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.__NVIC_GetPriority), (34 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.__NVIC_GetPriority), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SetPendingIRQ), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_NVIC_SetPendingIRQ), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.__NVIC_SetPendingIRQ), (32 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.__NVIC_SetPendingIRQ), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.HAL_NVIC_GetPendingIRQ), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_NVIC_GetPendingIRQ), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.__NVIC_GetPendingIRQ), (36 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.__NVIC_GetPendingIRQ), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.HAL_NVIC_ClearPendingIRQ), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_NVIC_ClearPendingIRQ), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.__NVIC_ClearPendingIRQ), (32 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.__NVIC_ClearPendingIRQ), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.HAL_NVIC_GetActive), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_NVIC_GetActive), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.__NVIC_GetActive), (36 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.__NVIC_GetActive), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.HAL_SYSTICK_CLKSourceConfig), (24 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_SYSTICK_CLKSourceConfig), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.HAL_SYSTICK_IRQHandler), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_SYSTICK_IRQHandler), (8 bytes). + Removing stm32f4xx_hal_cortex.o(.text.HAL_SYSTICK_Callback), (2 bytes). + Removing stm32f4xx_hal_cortex.o(.ARM.exidx.text.HAL_SYSTICK_Callback), (8 bytes). + Removing stm32f4xx_hal.o(.text), (0 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_Init), (8 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_InitTick), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_MspInit), (2 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_MspInit), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_DeInit), (68 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_DeInit), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_MspDeInit), (2 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_MspDeInit), (8 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_IncTick), (8 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_GetTick), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_GetTickPrio), (12 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_GetTickPrio), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_SetTickFreq), (46 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_SetTickFreq), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_GetTickFreq), (12 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_GetTickFreq), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_Delay), (40 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_Delay), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_SuspendTick), (18 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_SuspendTick), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_ResumeTick), (18 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_ResumeTick), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_GetHalVersion), (10 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_GetHalVersion), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_GetREVID), (14 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_GetREVID), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_GetDEVID), (16 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_GetDEVID), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_DBGMCU_EnableDBGSleepMode), (18 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_DBGMCU_EnableDBGSleepMode), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_DBGMCU_DisableDBGSleepMode), (18 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_DBGMCU_DisableDBGSleepMode), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_DBGMCU_EnableDBGStopMode), (18 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_DBGMCU_EnableDBGStopMode), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_DBGMCU_DisableDBGStopMode), (18 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_DBGMCU_DisableDBGStopMode), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_DBGMCU_EnableDBGStandbyMode), (18 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_DBGMCU_EnableDBGStandbyMode), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_DBGMCU_DisableDBGStandbyMode), (18 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_DBGMCU_DisableDBGStandbyMode), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_EnableCompensationCell), (14 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_EnableCompensationCell), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_DisableCompensationCell), (14 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_DisableCompensationCell), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_GetUIDw0), (12 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_GetUIDw0), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_GetUIDw1), (12 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_GetUIDw1), (8 bytes). + Removing stm32f4xx_hal.o(.text.HAL_GetUIDw2), (12 bytes). + Removing stm32f4xx_hal.o(.ARM.exidx.text.HAL_GetUIDw2), (8 bytes). + Removing stm32f4xx_hal_exti.o(.text), (0 bytes). + Removing stm32f4xx_hal_exti.o(.text.HAL_EXTI_SetConfigLine), (180 bytes). + Removing stm32f4xx_hal_exti.o(.ARM.exidx.text.HAL_EXTI_SetConfigLine), (8 bytes). + Removing stm32f4xx_hal_exti.o(.text.HAL_EXTI_GetConfigLine), (156 bytes). + Removing stm32f4xx_hal_exti.o(.ARM.exidx.text.HAL_EXTI_GetConfigLine), (8 bytes). + Removing stm32f4xx_hal_exti.o(.text.HAL_EXTI_ClearConfigLine), (136 bytes). + Removing stm32f4xx_hal_exti.o(.ARM.exidx.text.HAL_EXTI_ClearConfigLine), (8 bytes). + Removing stm32f4xx_hal_exti.o(.text.HAL_EXTI_RegisterCallback), (12 bytes). + Removing stm32f4xx_hal_exti.o(.ARM.exidx.text.HAL_EXTI_RegisterCallback), (8 bytes). + Removing stm32f4xx_hal_exti.o(.text.HAL_EXTI_GetHandle), (12 bytes). + Removing stm32f4xx_hal_exti.o(.ARM.exidx.text.HAL_EXTI_GetHandle), (8 bytes). + Removing stm32f4xx_hal_exti.o(.text.HAL_EXTI_IRQHandler), (44 bytes). + Removing stm32f4xx_hal_exti.o(.ARM.exidx.text.HAL_EXTI_IRQHandler), (8 bytes). + Removing stm32f4xx_hal_exti.o(.text.HAL_EXTI_GetPending), (28 bytes). + Removing stm32f4xx_hal_exti.o(.ARM.exidx.text.HAL_EXTI_GetPending), (8 bytes). + Removing stm32f4xx_hal_exti.o(.text.HAL_EXTI_ClearPending), (24 bytes). + Removing stm32f4xx_hal_exti.o(.ARM.exidx.text.HAL_EXTI_ClearPending), (8 bytes). + Removing stm32f4xx_hal_exti.o(.text.HAL_EXTI_GenerateSWI), (24 bytes). + Removing stm32f4xx_hal_exti.o(.ARM.exidx.text.HAL_EXTI_GenerateSWI), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text), (0 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Init), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_MspInit), (2 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_MspInit), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_DeInit), (54 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_DeInit), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_MspDeInit), (2 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_MspDeInit), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Transmit), (312 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Master_Transmit), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_WaitOnFlagUntilTimeout), (148 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_WaitOnFlagUntilTimeout), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_MasterRequestWrite), (176 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_MasterRequestWrite), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_WaitOnTXEFlagUntilTimeout), (106 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_WaitOnTXEFlagUntilTimeout), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_WaitOnBTFFlagUntilTimeout), (106 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_WaitOnBTFFlagUntilTimeout), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Receive), (536 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Master_Receive), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_MasterRequestRead), (254 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_MasterRequestRead), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_WaitOnRXNEFlagUntilTimeout), (118 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_WaitOnRXNEFlagUntilTimeout), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Transmit), (366 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Slave_Transmit), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Receive), (342 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Slave_Receive), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_WaitOnSTOPFlagUntilTimeout), (98 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_WaitOnSTOPFlagUntilTimeout), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Transmit_IT), (272 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Master_Transmit_IT), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Receive_IT), (284 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Master_Receive_IT), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Transmit_IT), (142 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Slave_Transmit_IT), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Receive_IT), (142 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Slave_Receive_IT), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Transmit_DMA), (352 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Master_Transmit_DMA), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_DMAXferCplt), (298 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_DMAXferCplt), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_DMAError), (74 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_DMAError), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Receive_DMA), (348 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Master_Receive_DMA), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Transmit_DMA), (246 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Slave_Transmit_DMA), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Receive_DMA), (238 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Slave_Receive_DMA), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Write), (298 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Mem_Write), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_RequestMemoryWrite), (192 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_RequestMemoryWrite), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Read), (544 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Mem_Read), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_RequestMemoryRead), (268 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_RequestMemoryRead), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Write_IT), (240 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Mem_Write_IT), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Read_IT), (258 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Mem_Read_IT), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Write_DMA), (426 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Mem_Write_DMA), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Mem_Read_DMA), (496 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Mem_Read_DMA), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_IsDeviceReady), (416 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_IsDeviceReady), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Seq_Transmit_IT), (274 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Master_Seq_Transmit_IT), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Seq_Transmit_DMA), (430 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Master_Seq_Transmit_DMA), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Seq_Receive_IT), (338 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Master_Seq_Receive_IT), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Seq_Receive_DMA), (524 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Master_Seq_Receive_DMA), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Seq_Transmit_IT), (172 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Slave_Seq_Transmit_IT), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Seq_Transmit_DMA), (356 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Slave_Seq_Transmit_DMA), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_DMAAbort), (224 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_DMAAbort), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Seq_Receive_IT), (172 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Slave_Seq_Receive_IT), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Slave_Seq_Receive_DMA), (354 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Slave_Seq_Receive_DMA), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_EnableListen_IT), (54 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_EnableListen_IT), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_DisableListen_IT), (64 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_DisableListen_IT), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_Master_Abort_IT), (86 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_Master_Abort_IT), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_ITError), (336 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_ITError), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_EV_IRQHandler), (412 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_EV_IRQHandler), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_ConvertOtherXferOptions), (30 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_ConvertOtherXferOptions), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_Master_SB), (136 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_Master_SB), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_Master_ADD10), (38 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_Master_ADD10), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_Master_ADDR), (394 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_Master_ADDR), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_MasterTransmit_TXE), (184 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_MasterTransmit_TXE), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_MasterTransmit_BTF), (136 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_MasterTransmit_BTF), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_MemoryTransmit_TXE_BTF), (168 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_MemoryTransmit_TXE_BTF), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_MasterReceive_RXNE), (226 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_MasterReceive_RXNE), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_MasterReceive_BTF), (248 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_MasterReceive_BTF), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_Slave_ADDR), (84 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_Slave_ADDR), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_Slave_STOPF), (354 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_Slave_STOPF), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_SlaveTransmit_TXE), (72 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_SlaveTransmit_TXE), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_SlaveTransmit_BTF), (28 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_SlaveTransmit_BTF), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_SlaveReceive_RXNE), (76 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_SlaveReceive_RXNE), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_SlaveReceive_BTF), (30 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_SlaveReceive_BTF), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_ER_IRQHandler), (164 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_ER_IRQHandler), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_Slave_AF), (156 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_Slave_AF), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_MasterTxCpltCallback), (2 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_MasterTxCpltCallback), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_MasterRxCpltCallback), (2 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_MasterRxCpltCallback), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_SlaveTxCpltCallback), (2 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_SlaveTxCpltCallback), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_SlaveRxCpltCallback), (2 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_SlaveRxCpltCallback), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_AddrCallback), (2 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_AddrCallback), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_ListenCpltCallback), (2 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_ListenCpltCallback), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_MemTxCpltCallback), (2 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_MemTxCpltCallback), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_MemRxCpltCallback), (2 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_MemRxCpltCallback), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_ErrorCallback), (2 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_ErrorCallback), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_AbortCpltCallback), (2 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_AbortCpltCallback), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_GetState), (6 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_GetState), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_GetMode), (6 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_GetMode), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.HAL_I2C_GetError), (4 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.HAL_I2C_GetError), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_Flush_DR), (14 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_Flush_DR), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_WaitOnSTOPRequestThroughIT), (78 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_WaitOnSTOPRequestThroughIT), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_WaitOnMasterAddressFlagUntilTimeout), (150 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_WaitOnMasterAddressFlagUntilTimeout), (8 bytes). + Removing stm32f4xx_hal_i2c.o(.text.I2C_IsAcknowledgeFailed), (48 bytes). + Removing stm32f4xx_hal_i2c.o(.ARM.exidx.text.I2C_IsAcknowledgeFailed), (8 bytes). + Removing stm32f4xx_hal_i2c_ex.o(.text), (0 bytes). + Removing stm32f4xx_hal_spi.o(.text), (0 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_Init), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_MspInit), (2 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_MspInit), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_DeInit), (48 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_DeInit), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_MspDeInit), (2 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_MspDeInit), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_Transmit), (394 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_Transmit), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_EndRxTxTransaction), (138 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_EndRxTxTransaction), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_Receive), (370 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_Receive), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_TransmitReceive), (504 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_TransmitReceive), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_EndRxTransaction), (144 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_EndRxTransaction), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_Transmit_IT), (154 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_Transmit_IT), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_TxISR_16BIT), (32 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_TxISR_16BIT), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_TxISR_8BIT), (34 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_TxISR_8BIT), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_Receive_IT), (196 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_Receive_IT), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_TransmitReceive_IT), (204 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_TransmitReceive_IT), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_RxISR_16BIT), (32 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_RxISR_16BIT), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_RxISR_8BIT), (34 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_RxISR_8BIT), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_2linesRxISR_16BIT), (48 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_2linesRxISR_16BIT), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_2linesTxISR_16BIT), (48 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_2linesTxISR_16BIT), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_2linesRxISR_8BIT), (52 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_2linesRxISR_8BIT), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_2linesTxISR_8BIT), (52 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_2linesTxISR_8BIT), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_Transmit_DMA), (204 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_Transmit_DMA), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_DMAHalfTransmitCplt), (10 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_DMAHalfTransmitCplt), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_DMATransmitCplt), (112 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_DMATransmitCplt), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_DMAError), (34 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_DMAError), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_Receive_DMA), (236 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_Receive_DMA), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_TransmitReceive_DMA), (292 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_TransmitReceive_DMA), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_DMAHalfReceiveCplt), (10 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_DMAHalfReceiveCplt), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_DMAReceiveCplt), (104 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_DMAReceiveCplt), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_DMAHalfTransmitReceiveCplt), (10 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_DMAHalfTransmitReceiveCplt), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_DMATransmitReceiveCplt), (90 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_DMATransmitReceiveCplt), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_Abort), (310 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_Abort), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_AbortTx_ISR), (26 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_AbortTx_ISR), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_AbortRx_ISR), (98 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_AbortRx_ISR), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_Abort_IT), (338 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_Abort_IT), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_DMATxAbortCallback), (142 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_DMATxAbortCallback), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_DMARxAbortCallback), (120 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_DMARxAbortCallback), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_AbortCpltCallback), (2 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_AbortCpltCallback), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_DMAPause), (32 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_DMAPause), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_DMAResume), (32 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_DMAResume), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_DMAStop), (68 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_DMAStop), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_IRQHandler), (262 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_IRQHandler), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_DMAAbortOnError), (16 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_DMAAbortOnError), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_ErrorCallback), (2 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_ErrorCallback), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_TxCpltCallback), (2 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_TxCpltCallback), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_RxCpltCallback), (2 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_RxCpltCallback), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_TxRxCpltCallback), (2 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_TxRxCpltCallback), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_TxHalfCpltCallback), (2 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_TxHalfCpltCallback), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_RxHalfCpltCallback), (2 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_RxHalfCpltCallback), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_TxRxHalfCpltCallback), (2 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_TxRxHalfCpltCallback), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_GetState), (6 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_GetState), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.HAL_SPI_GetError), (4 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.HAL_SPI_GetError), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_CloseRxTx_ISR), (168 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_CloseRxTx_ISR), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_CloseRx_ISR), (90 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_CloseRx_ISR), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_CloseTx_ISR), (150 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_CloseTx_ISR), (8 bytes). + Removing stm32f4xx_hal_spi.o(.text.SPI_WaitFlagStateUntilTimeout), (224 bytes). + Removing stm32f4xx_hal_spi.o(.ARM.exidx.text.SPI_WaitFlagStateUntilTimeout), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text), (0 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Base_Init), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_MspInit), (2 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Base_MspInit), (8 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_Base_SetConfig), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_DeInit), (96 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Base_DeInit), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_MspDeInit), (2 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Base_MspDeInit), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Start), (160 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Base_Start), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Stop), (42 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Base_Stop), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Start_IT), (168 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Base_Start_IT), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Stop_IT), (50 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Base_Stop_IT), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Start_DMA), (264 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Base_Start_DMA), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.TIM_DMAPeriodElapsedCplt), (24 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_DMAPeriodElapsedCplt), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.TIM_DMAPeriodElapsedHalfCplt), (10 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_DMAPeriodElapsedHalfCplt), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.TIM_DMAError), (92 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_DMAError), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Stop_DMA), (60 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Base_Stop_DMA), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Init), (90 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_Init), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_MspInit), (2 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_MspInit), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_DeInit), (96 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_DeInit), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_MspDeInit), (2 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_MspDeInit), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Start), (290 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_Start), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.TIM_CCxChannelCmd), (36 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_CCxChannelCmd), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Stop), (130 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_Stop), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Start_IT), (336 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_Start_IT), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Stop_IT), (188 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_Stop_IT), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Start_DMA), (622 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_Start_DMA), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.TIM_DMADelayPulseCplt), (104 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_DMADelayPulseCplt), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.TIM_DMADelayPulseHalfCplt), (56 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_DMADelayPulseHalfCplt), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_Stop_DMA), (230 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_Stop_DMA), (8 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_Init), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_MspInit), (2 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_MspInit), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_DeInit), (96 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_DeInit), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_MspDeInit), (2 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_MspDeInit), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Start), (290 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_Start), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Stop), (130 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_Stop), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Start_IT), (336 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_Start_IT), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Stop_IT), (188 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_Stop_IT), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Start_DMA), (622 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_Start_DMA), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Stop_DMA), (230 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_Stop_DMA), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Init), (90 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_Init), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_MspInit), (2 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_MspInit), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_DeInit), (96 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_DeInit), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_MspDeInit), (2 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_MspDeInit), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Start), (296 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_Start), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Stop), (116 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_Stop), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Start_IT), (348 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_Start_IT), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Stop_IT), (176 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_Stop_IT), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Start_DMA), (604 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_Start_DMA), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.TIM_DMACaptureCplt), (116 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_DMACaptureCplt), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.TIM_DMACaptureHalfCplt), (56 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_DMACaptureHalfCplt), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_Stop_DMA), (206 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_Stop_DMA), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_Init), (92 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OnePulse_Init), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_MspInit), (2 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OnePulse_MspInit), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_DeInit), (80 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OnePulse_DeInit), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_MspDeInit), (2 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OnePulse_MspDeInit), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_Start), (116 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OnePulse_Start), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_Stop), (120 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OnePulse_Stop), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_Start_IT), (132 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OnePulse_Start_IT), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_Stop_IT), (136 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OnePulse_Stop_IT), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Init), (178 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Encoder_Init), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_MspInit), (2 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Encoder_MspInit), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_DeInit), (80 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Encoder_DeInit), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_MspDeInit), (2 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Encoder_MspDeInit), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Start), (164 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Encoder_Start), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Stop), (160 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Encoder_Stop), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Start_IT), (210 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Encoder_Start_IT), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Stop_IT), (212 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Encoder_Stop_IT), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Start_DMA), (562 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Encoder_Start_DMA), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_Stop_DMA), (240 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Encoder_Stop_DMA), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_IRQHandler), (308 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IRQHandler), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_CaptureCallback), (2 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_CaptureCallback), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_DelayElapsedCallback), (2 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_DelayElapsedCallback), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_PulseFinishedCallback), (2 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_PulseFinishedCallback), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_PeriodElapsedCallback), (2 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PeriodElapsedCallback), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_TriggerCallback), (2 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_TriggerCallback), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_ConfigChannel), (78 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_ConfigChannel), (8 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_OC1_SetConfig), (8 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_OC2_SetConfig), (8 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_OC3_SetConfig), (8 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_OC4_SetConfig), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_ConfigChannel), (152 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_ConfigChannel), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.TIM_TI1_SetConfig), (168 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_TI1_SetConfig), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.TIM_TI2_SetConfig), (60 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_TI2_SetConfig), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.TIM_TI3_SetConfig), (52 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_TI3_SetConfig), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.TIM_TI4_SetConfig), (60 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_TI4_SetConfig), (8 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_ConfigChannel), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_ConfigChannel), (220 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OnePulse_ConfigChannel), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_WriteStart), (28 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_DMABurst_WriteStart), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiWriteStart), (456 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_DMABurst_MultiWriteStart), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.TIM_DMATriggerCplt), (24 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_DMATriggerCplt), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.TIM_DMATriggerHalfCplt), (10 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_DMATriggerHalfCplt), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_WriteStop), (134 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_DMABurst_WriteStop), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_ReadStart), (28 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_DMABurst_ReadStart), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_MultiReadStart), (454 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_DMABurst_MultiReadStart), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurst_ReadStop), (134 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_DMABurst_ReadStop), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_GenerateEvent), (36 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_GenerateEvent), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_ConfigOCrefClear), (204 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_ConfigOCrefClear), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.TIM_ETR_SetConfig), (22 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_ETR_SetConfig), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_ConfigClockSource), (222 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_ConfigClockSource), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.TIM_TI1_ConfigInputStage), (34 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_TI1_ConfigInputStage), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.TIM_ITRx_SetConfig), (16 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_ITRx_SetConfig), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.TIM_TI2_ConfigInputStage), (36 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_TI2_ConfigInputStage), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_ConfigTI1Input), (16 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_ConfigTI1Input), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_SlaveConfigSynchro), (74 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_SlaveConfigSynchro), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.TIM_SlaveTimer_SetConfig), (150 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.TIM_SlaveTimer_SetConfig), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_SlaveConfigSynchro_IT), (74 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_SlaveConfigSynchro_IT), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_ReadCapturedValue), (52 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_ReadCapturedValue), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_PeriodElapsedHalfCpltCallback), (2 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PeriodElapsedHalfCpltCallback), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_CaptureHalfCpltCallback), (2 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_CaptureHalfCpltCallback), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_PulseFinishedHalfCpltCallback), (2 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_PulseFinishedHalfCpltCallback), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_TriggerHalfCpltCallback), (2 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_TriggerHalfCpltCallback), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_ErrorCallback), (2 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_ErrorCallback), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_GetState), (6 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Base_GetState), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OC_GetState), (6 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OC_GetState), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_GetState), (6 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_PWM_GetState), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_IC_GetState), (6 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_IC_GetState), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_OnePulse_GetState), (6 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_OnePulse_GetState), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_Encoder_GetState), (6 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_Encoder_GetState), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_GetActiveChannel), (4 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_GetActiveChannel), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_GetChannelState), (32 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_GetChannelState), (8 bytes). + Removing stm32f4xx_hal_tim.o(.text.HAL_TIM_DMABurstState), (6 bytes). + Removing stm32f4xx_hal_tim.o(.ARM.exidx.text.HAL_TIM_DMABurstState), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text), (0 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Init), (194 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_HallSensor_Init), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_MspInit), (2 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_HallSensor_MspInit), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_DeInit), (80 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_HallSensor_DeInit), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_MspDeInit), (2 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_HallSensor_MspDeInit), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Start), (214 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_HallSensor_Start), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Stop), (66 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_HallSensor_Stop), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Start_IT), (222 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_HallSensor_Start_IT), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Stop_IT), (74 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_HallSensor_Stop_IT), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Start_DMA), (298 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_HallSensor_Start_DMA), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_Stop_DMA), (74 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_HallSensor_Stop_DMA), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Start), (234 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_OCN_Start), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.TIM_CCxNChannelCmd), (36 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.TIM_CCxNChannelCmd), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Stop), (110 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_OCN_Stop), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Start_IT), (290 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_OCN_Start_IT), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Stop_IT), (184 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_OCN_Stop_IT), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Start_DMA), (516 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_OCN_Start_DMA), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.TIM_DMADelayPulseNCplt), (82 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.TIM_DMADelayPulseNCplt), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.TIM_DMAErrorCCxN), (66 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.TIM_DMAErrorCCxN), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OCN_Stop_DMA), (190 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_OCN_Stop_DMA), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Start), (234 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_PWMN_Start), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Stop), (110 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_PWMN_Stop), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Start_IT), (290 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_PWMN_Start_IT), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Stop_IT), (184 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_PWMN_Stop_IT), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Start_DMA), (516 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_PWMN_Start_DMA), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_PWMN_Stop_DMA), (190 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_PWMN_Stop_DMA), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OnePulseN_Start), (102 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_OnePulseN_Start), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OnePulseN_Stop), (106 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_OnePulseN_Stop), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OnePulseN_Start_IT), (118 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_OnePulseN_Start_IT), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_OnePulseN_Stop_IT), (122 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_OnePulseN_Stop_IT), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_ConfigCommutEvent), (104 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_ConfigCommutEvent), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_ConfigCommutEvent_IT), (104 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_ConfigCommutEvent_IT), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_ConfigCommutEvent_DMA), (144 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_ConfigCommutEvent_DMA), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.TIMEx_DMACommutationCplt), (16 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.TIMEx_DMACommutationCplt), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.TIMEx_DMACommutationHalfCplt), (16 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.TIMEx_DMACommutationHalfCplt), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_MasterConfigSynchronization), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_ConfigBreakDeadTime), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_RemapConfig), (26 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_RemapConfig), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_CommutCallback), (2 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_CommutCallback), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_CommutHalfCpltCallback), (2 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_CommutHalfCpltCallback), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_BreakCallback), (2 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_BreakCallback), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_HallSensor_GetState), (6 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_HallSensor_GetState), (8 bytes). + Removing stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_GetChannelNState), (32 bytes). + Removing stm32f4xx_hal_tim_ex.o(.ARM.exidx.text.HAL_TIMEx_GetChannelNState), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text), (0 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_Init), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_MspInit), (2 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_MspInit), (8 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_SetConfig), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_HalfDuplex_Init), (104 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_HalfDuplex_Init), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_LIN_Init), (120 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_LIN_Init), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_MultiProcessor_Init), (128 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_MultiProcessor_Init), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_DeInit), (56 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_DeInit), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_MspDeInit), (2 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_MspDeInit), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_Transmit), (180 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_Transmit), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.UART_WaitOnFlagUntilTimeout), (136 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_WaitOnFlagUntilTimeout), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_Receive), (194 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_Receive), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_Transmit_IT), (56 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_Transmit_IT), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_Receive_IT), (42 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_Receive_IT), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.UART_Start_Receive_IT), (52 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_Start_Receive_IT), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_Transmit_DMA), (140 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_Transmit_DMA), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.UART_DMATransmitCplt), (64 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_DMATransmitCplt), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.UART_DMATxHalfCplt), (10 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_DMATxHalfCplt), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.UART_DMAError), (76 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_DMAError), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_Receive_DMA), (44 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_Receive_DMA), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.UART_Start_Receive_DMA), (170 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_Start_Receive_DMA), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_DMAPause), (124 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_DMAPause), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_DMAResume), (126 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_DMAResume), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_DMAStop), (120 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_DMAStop), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.UART_EndTxTransfer), (28 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_EndTxTransfer), (8 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_EndRxTransfer), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UARTEx_ReceiveToIdle), (296 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UARTEx_ReceiveToIdle), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UARTEx_ReceiveToIdle_IT), (92 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UARTEx_ReceiveToIdle_IT), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UARTEx_ReceiveToIdle_DMA), (92 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UARTEx_ReceiveToIdle_DMA), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UARTEx_GetRxEventType), (4 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UARTEx_GetRxEventType), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_Abort), (206 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_Abort), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_AbortTransmit), (96 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_AbortTransmit), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_AbortReceive), (146 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_AbortReceive), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_Abort_IT), (248 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_Abort_IT), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.UART_DMATxAbortCallback), (46 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_DMATxAbortCallback), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.UART_DMARxAbortCallback), (46 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_DMARxAbortCallback), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_AbortCpltCallback), (2 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_AbortCpltCallback), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_AbortTransmit_IT), (124 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_AbortTransmit_IT), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.UART_DMATxOnlyAbortCallback), (20 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_DMATxOnlyAbortCallback), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_AbortTransmitCpltCallback), (2 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_AbortTransmitCpltCallback), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_AbortReceive_IT), (178 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_AbortReceive_IT), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.UART_DMARxOnlyAbortCallback), (22 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_DMARxOnlyAbortCallback), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_AbortReceiveCpltCallback), (2 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_AbortReceiveCpltCallback), (8 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_IRQHandler), (8 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_Receive_IT), (8 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_DMAAbortOnError), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_ErrorCallback), (2 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_ErrorCallback), (8 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UARTEx_RxEventCallback), (8 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_Transmit_IT), (8 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_EndTransmit_IT), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_TxCpltCallback), (2 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_TxCpltCallback), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_TxHalfCpltCallback), (2 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_TxHalfCpltCallback), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_RxCpltCallback), (2 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_RxCpltCallback), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_RxHalfCpltCallback), (2 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_RxHalfCpltCallback), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_LIN_SendBreak), (60 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_LIN_SendBreak), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_MultiProcessor_EnterMuteMode), (62 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_MultiProcessor_EnterMuteMode), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_MultiProcessor_ExitMuteMode), (62 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_MultiProcessor_ExitMuteMode), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_HalfDuplex_EnableTransmitter), (44 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_HalfDuplex_EnableTransmitter), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_HalfDuplex_EnableReceiver), (46 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_HalfDuplex_EnableReceiver), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_GetState), (14 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_GetState), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.HAL_UART_GetError), (4 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.HAL_UART_GetError), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.UART_DMAReceiveCplt), (132 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_DMAReceiveCplt), (8 bytes). + Removing stm32f4xx_hal_uart.o(.text.UART_DMARxHalfCplt), (30 bytes). + Removing stm32f4xx_hal_uart.o(.ARM.exidx.text.UART_DMARxHalfCplt), (8 bytes). + Removing system_stm32f4xx.o(.text), (0 bytes). + Removing system_stm32f4xx.o(.ARM.exidx.text.SystemInit), (8 bytes). + Removing system_stm32f4xx.o(.text.SystemCoreClockUpdate), (126 bytes). + Removing system_stm32f4xx.o(.ARM.exidx.text.SystemCoreClockUpdate), (8 bytes). + Removing croutine.o(.text), (0 bytes). + Removing event_groups.o(.text), (0 bytes). + Removing event_groups.o(.text.xEventGroupCreateStatic), (78 bytes). + Removing event_groups.o(.ARM.exidx.text.xEventGroupCreateStatic), (8 bytes). + Removing event_groups.o(.text.xEventGroupCreate), (28 bytes). + Removing event_groups.o(.ARM.exidx.text.xEventGroupCreate), (8 bytes). + Removing event_groups.o(.text.xEventGroupSync), (220 bytes). + Removing event_groups.o(.ARM.exidx.text.xEventGroupSync), (8 bytes). + Removing event_groups.o(.text.xEventGroupSetBits), (158 bytes). + Removing event_groups.o(.ARM.exidx.text.xEventGroupSetBits), (8 bytes). + Removing event_groups.o(.text.xEventGroupWaitBits), (288 bytes). + Removing event_groups.o(.ARM.exidx.text.xEventGroupWaitBits), (8 bytes). + Removing event_groups.o(.text.prvTestWaitCondition), (24 bytes). + Removing event_groups.o(.ARM.exidx.text.prvTestWaitCondition), (8 bytes). + Removing event_groups.o(.text.xEventGroupClearBits), (72 bytes). + Removing event_groups.o(.ARM.exidx.text.xEventGroupClearBits), (8 bytes). + Removing event_groups.o(.text.xEventGroupClearBitsFromISR), (22 bytes). + Removing event_groups.o(.ARM.exidx.text.xEventGroupClearBitsFromISR), (8 bytes). + Removing event_groups.o(.text.vEventGroupClearBitsCallback), (8 bytes). + Removing event_groups.o(.ARM.exidx.text.vEventGroupClearBitsCallback), (8 bytes). + Removing event_groups.o(.text.xEventGroupGetBitsFromISR), (28 bytes). + Removing event_groups.o(.ARM.exidx.text.xEventGroupGetBitsFromISR), (8 bytes). + Removing event_groups.o(.text.vEventGroupDelete), (78 bytes). + Removing event_groups.o(.ARM.exidx.text.vEventGroupDelete), (8 bytes). + Removing event_groups.o(.text.vEventGroupSetBitsCallback), (8 bytes). + Removing event_groups.o(.ARM.exidx.text.vEventGroupSetBitsCallback), (8 bytes). + Removing event_groups.o(.text.xEventGroupSetBitsFromISR), (22 bytes). + Removing event_groups.o(.ARM.exidx.text.xEventGroupSetBitsFromISR), (8 bytes). + Removing event_groups.o(.text.uxEventGroupGetNumber), (10 bytes). + Removing event_groups.o(.ARM.exidx.text.uxEventGroupGetNumber), (8 bytes). + Removing event_groups.o(.text.vEventGroupSetNumber), (4 bytes). + Removing event_groups.o(.ARM.exidx.text.vEventGroupSetNumber), (8 bytes). + Removing list.o(.text), (0 bytes). + Removing list.o(.ARM.exidx.text.vListInitialise), (8 bytes). + Removing list.o(.ARM.exidx.text.vListInitialiseItem), (8 bytes). + Removing list.o(.ARM.exidx.text.vListInsertEnd), (8 bytes). + Removing list.o(.ARM.exidx.text.vListInsert), (8 bytes). + Removing list.o(.ARM.exidx.text.uxListRemove), (8 bytes). + Removing queue.o(.text), (0 bytes). + Removing queue.o(.ARM.exidx.text.xQueueGenericReset), (8 bytes). + Removing queue.o(.ARM.exidx.text.xQueueGenericCreateStatic), (8 bytes). + Removing queue.o(.ARM.exidx.text.prvInitialiseNewQueue), (8 bytes). + Removing queue.o(.text.xQueueGenericCreate), (70 bytes). + Removing queue.o(.ARM.exidx.text.xQueueGenericCreate), (8 bytes). + Removing queue.o(.text.xQueueCreateMutex), (22 bytes). + Removing queue.o(.ARM.exidx.text.xQueueCreateMutex), (8 bytes). + Removing queue.o(.text.prvInitialiseMutex), (32 bytes). + Removing queue.o(.ARM.exidx.text.prvInitialiseMutex), (8 bytes). + Removing queue.o(.text.xQueueCreateMutexStatic), (34 bytes). + Removing queue.o(.ARM.exidx.text.xQueueCreateMutexStatic), (8 bytes). + Removing queue.o(.text.xQueueGetMutexHolder), (26 bytes). + Removing queue.o(.ARM.exidx.text.xQueueGetMutexHolder), (8 bytes). + Removing queue.o(.text.xQueueGetMutexHolderFromISR), (34 bytes). + Removing queue.o(.ARM.exidx.text.xQueueGetMutexHolderFromISR), (8 bytes). + Removing queue.o(.text.xQueueGiveMutexRecursive), (66 bytes). + Removing queue.o(.ARM.exidx.text.xQueueGiveMutexRecursive), (8 bytes). + Removing queue.o(.ARM.exidx.text.xQueueGenericSend), (8 bytes). + Removing queue.o(.text.xQueueTakeMutexRecursive), (60 bytes). + Removing queue.o(.ARM.exidx.text.xQueueTakeMutexRecursive), (8 bytes). + Removing queue.o(.text.xQueueSemaphoreTake), (454 bytes). + Removing queue.o(.ARM.exidx.text.xQueueSemaphoreTake), (8 bytes). + Removing queue.o(.text.xQueueCreateCountingSemaphoreStatic), (78 bytes). + Removing queue.o(.ARM.exidx.text.xQueueCreateCountingSemaphoreStatic), (8 bytes). + Removing queue.o(.text.xQueueCreateCountingSemaphore), (66 bytes). + Removing queue.o(.ARM.exidx.text.xQueueCreateCountingSemaphore), (8 bytes). + Removing queue.o(.ARM.exidx.text.prvCopyDataToQueue), (8 bytes). + Removing queue.o(.ARM.exidx.text.prvIsQueueFull), (8 bytes). + Removing queue.o(.ARM.exidx.text.prvUnlockQueue), (8 bytes). + Removing queue.o(.ARM.exidx.text.xQueueGenericSendFromISR), (8 bytes). + Removing queue.o(.text.xQueueGiveFromISR), (192 bytes). + Removing queue.o(.ARM.exidx.text.xQueueGiveFromISR), (8 bytes). + Removing queue.o(.ARM.exidx.text.xQueueReceive), (8 bytes). + Removing queue.o(.ARM.exidx.text.prvCopyDataFromQueue), (8 bytes). + Removing queue.o(.ARM.exidx.text.prvIsQueueEmpty), (8 bytes). + Removing queue.o(.text.prvGetDisinheritPriorityAfterTimeout), (18 bytes). + Removing queue.o(.ARM.exidx.text.prvGetDisinheritPriorityAfterTimeout), (8 bytes). + Removing queue.o(.text.xQueuePeek), (376 bytes). + Removing queue.o(.ARM.exidx.text.xQueuePeek), (8 bytes). + Removing queue.o(.text.xQueueReceiveFromISR), (170 bytes). + Removing queue.o(.ARM.exidx.text.xQueueReceiveFromISR), (8 bytes). + Removing queue.o(.text.xQueuePeekFromISR), (132 bytes). + Removing queue.o(.ARM.exidx.text.xQueuePeekFromISR), (8 bytes). + Removing queue.o(.text.uxQueueMessagesWaiting), (38 bytes). + Removing queue.o(.ARM.exidx.text.uxQueueMessagesWaiting), (8 bytes). + Removing queue.o(.text.uxQueueSpacesAvailable), (42 bytes). + Removing queue.o(.ARM.exidx.text.uxQueueSpacesAvailable), (8 bytes). + Removing queue.o(.text.uxQueueMessagesWaitingFromISR), (26 bytes). + Removing queue.o(.ARM.exidx.text.uxQueueMessagesWaitingFromISR), (8 bytes). + Removing queue.o(.text.vQueueDelete), (46 bytes). + Removing queue.o(.ARM.exidx.text.vQueueDelete), (8 bytes). + Removing queue.o(.text.vQueueUnregisterQueue), (42 bytes). + Removing queue.o(.ARM.exidx.text.vQueueUnregisterQueue), (8 bytes). + Removing queue.o(.text.uxQueueGetQueueNumber), (4 bytes). + Removing queue.o(.ARM.exidx.text.uxQueueGetQueueNumber), (8 bytes). + Removing queue.o(.text.vQueueSetQueueNumber), (4 bytes). + Removing queue.o(.ARM.exidx.text.vQueueSetQueueNumber), (8 bytes). + Removing queue.o(.text.ucQueueGetQueueType), (6 bytes). + Removing queue.o(.ARM.exidx.text.ucQueueGetQueueType), (8 bytes). + Removing queue.o(.text.xQueueIsQueueEmptyFromISR), (30 bytes). + Removing queue.o(.ARM.exidx.text.xQueueIsQueueEmptyFromISR), (8 bytes). + Removing queue.o(.text.xQueueIsQueueFullFromISR), (34 bytes). + Removing queue.o(.ARM.exidx.text.xQueueIsQueueFullFromISR), (8 bytes). + Removing queue.o(.ARM.exidx.text.vQueueAddToRegistry), (8 bytes). + Removing queue.o(.text.pcQueueGetName), (40 bytes). + Removing queue.o(.ARM.exidx.text.pcQueueGetName), (8 bytes). + Removing queue.o(.ARM.exidx.text.vQueueWaitForMessageRestricted), (8 bytes). + Removing stream_buffer.o(.text), (0 bytes). + Removing stream_buffer.o(.text.xStreamBufferGenericCreate), (126 bytes). + Removing stream_buffer.o(.ARM.exidx.text.xStreamBufferGenericCreate), (8 bytes). + Removing stream_buffer.o(.text.prvInitialiseNewStreamBuffer), (48 bytes). + Removing stream_buffer.o(.ARM.exidx.text.prvInitialiseNewStreamBuffer), (8 bytes). + Removing stream_buffer.o(.text.xStreamBufferGenericCreateStatic), (178 bytes). + Removing stream_buffer.o(.ARM.exidx.text.xStreamBufferGenericCreateStatic), (8 bytes). + Removing stream_buffer.o(.text.vStreamBufferDelete), (42 bytes). + Removing stream_buffer.o(.ARM.exidx.text.vStreamBufferDelete), (8 bytes). + Removing stream_buffer.o(.text.xStreamBufferReset), (84 bytes). + Removing stream_buffer.o(.ARM.exidx.text.xStreamBufferReset), (8 bytes). + Removing stream_buffer.o(.text.xStreamBufferSetTriggerLevel), (42 bytes). + Removing stream_buffer.o(.ARM.exidx.text.xStreamBufferSetTriggerLevel), (8 bytes). + Removing stream_buffer.o(.text.xStreamBufferSpacesAvailable), (42 bytes). + Removing stream_buffer.o(.ARM.exidx.text.xStreamBufferSpacesAvailable), (8 bytes). + Removing stream_buffer.o(.text.xStreamBufferBytesAvailable), (30 bytes). + Removing stream_buffer.o(.ARM.exidx.text.xStreamBufferBytesAvailable), (8 bytes). + Removing stream_buffer.o(.text.prvBytesInBuffer), (18 bytes). + Removing stream_buffer.o(.ARM.exidx.text.prvBytesInBuffer), (8 bytes). + Removing stream_buffer.o(.text.xStreamBufferSend), (290 bytes). + Removing stream_buffer.o(.ARM.exidx.text.xStreamBufferSend), (8 bytes). + Removing stream_buffer.o(.text.prvWriteMessageToBuffer), (70 bytes). + Removing stream_buffer.o(.ARM.exidx.text.prvWriteMessageToBuffer), (8 bytes). + Removing stream_buffer.o(.text.xStreamBufferSendFromISR), (162 bytes). + Removing stream_buffer.o(.ARM.exidx.text.xStreamBufferSendFromISR), (8 bytes). + Removing stream_buffer.o(.text.xStreamBufferReceive), (226 bytes). + Removing stream_buffer.o(.ARM.exidx.text.xStreamBufferReceive), (8 bytes). + Removing stream_buffer.o(.text.prvReadMessageFromBuffer), (68 bytes). + Removing stream_buffer.o(.ARM.exidx.text.prvReadMessageFromBuffer), (8 bytes). + Removing stream_buffer.o(.text.xStreamBufferNextMessageLengthBytes), (94 bytes). + Removing stream_buffer.o(.ARM.exidx.text.xStreamBufferNextMessageLengthBytes), (8 bytes). + Removing stream_buffer.o(.text.prvReadBytesFromBuffer), (142 bytes). + Removing stream_buffer.o(.ARM.exidx.text.prvReadBytesFromBuffer), (8 bytes). + Removing stream_buffer.o(.text.xStreamBufferReceiveFromISR), (160 bytes). + Removing stream_buffer.o(.ARM.exidx.text.xStreamBufferReceiveFromISR), (8 bytes). + Removing stream_buffer.o(.text.xStreamBufferIsEmpty), (34 bytes). + Removing stream_buffer.o(.ARM.exidx.text.xStreamBufferIsEmpty), (8 bytes). + Removing stream_buffer.o(.text.xStreamBufferIsFull), (46 bytes). + Removing stream_buffer.o(.ARM.exidx.text.xStreamBufferIsFull), (8 bytes). + Removing stream_buffer.o(.text.xStreamBufferSendCompletedFromISR), (86 bytes). + Removing stream_buffer.o(.ARM.exidx.text.xStreamBufferSendCompletedFromISR), (8 bytes). + Removing stream_buffer.o(.text.xStreamBufferReceiveCompletedFromISR), (86 bytes). + Removing stream_buffer.o(.ARM.exidx.text.xStreamBufferReceiveCompletedFromISR), (8 bytes). + Removing stream_buffer.o(.text.uxStreamBufferGetStreamBufferNumber), (4 bytes). + Removing stream_buffer.o(.ARM.exidx.text.uxStreamBufferGetStreamBufferNumber), (8 bytes). + Removing stream_buffer.o(.text.vStreamBufferSetStreamBufferNumber), (4 bytes). + Removing stream_buffer.o(.ARM.exidx.text.vStreamBufferSetStreamBufferNumber), (8 bytes). + Removing stream_buffer.o(.text.ucStreamBufferGetStreamBufferType), (8 bytes). + Removing stream_buffer.o(.ARM.exidx.text.ucStreamBufferGetStreamBufferType), (8 bytes). + Removing stream_buffer.o(.text.prvWriteBytesToBuffer), (154 bytes). + Removing stream_buffer.o(.ARM.exidx.text.prvWriteBytesToBuffer), (8 bytes). + Removing tasks.o(.text), (0 bytes). + Removing tasks.o(.ARM.exidx.text.xTaskCreateStatic), (8 bytes). + Removing tasks.o(.ARM.exidx.text.prvInitialiseNewTask), (8 bytes). + Removing tasks.o(.ARM.exidx.text.prvAddNewTaskToReadyList), (8 bytes). + Removing tasks.o(.ARM.exidx.text.xTaskCreate), (8 bytes). + Removing tasks.o(.text.vTaskDelete), (194 bytes). + Removing tasks.o(.ARM.exidx.text.vTaskDelete), (8 bytes). + Removing tasks.o(.ARM.exidx.text.prvDeleteTCB), (8 bytes). + Removing tasks.o(.ARM.exidx.text.prvResetNextTaskUnblockTime), (8 bytes). + Removing tasks.o(.text.vTaskDelayUntil), (168 bytes). + Removing tasks.o(.ARM.exidx.text.vTaskDelayUntil), (8 bytes). + Removing tasks.o(.ARM.exidx.text.vTaskSuspendAll), (8 bytes). + Removing tasks.o(.ARM.exidx.text.prvAddCurrentTaskToDelayedList), (8 bytes). + Removing tasks.o(.ARM.exidx.text.xTaskResumeAll), (8 bytes). + Removing tasks.o(.ARM.exidx.text.vTaskDelay), (8 bytes). + Removing tasks.o(.text.eTaskGetState), (156 bytes). + Removing tasks.o(.ARM.exidx.text.eTaskGetState), (8 bytes). + Removing tasks.o(.text.uxTaskPriorityGet), (30 bytes). + Removing tasks.o(.ARM.exidx.text.uxTaskPriorityGet), (8 bytes). + Removing tasks.o(.text.uxTaskPriorityGetFromISR), (48 bytes). + Removing tasks.o(.ARM.exidx.text.uxTaskPriorityGetFromISR), (8 bytes). + Removing tasks.o(.text.vTaskPrioritySet), (214 bytes). + Removing tasks.o(.ARM.exidx.text.vTaskPrioritySet), (8 bytes). + Removing tasks.o(.text.vTaskSuspend), (204 bytes). + Removing tasks.o(.ARM.exidx.text.vTaskSuspend), (8 bytes). + Removing tasks.o(.ARM.exidx.text.vTaskSwitchContext), (8 bytes). + Removing tasks.o(.text.vTaskResume), (138 bytes). + Removing tasks.o(.ARM.exidx.text.vTaskResume), (8 bytes). + Removing tasks.o(.text.prvTaskIsTaskSuspended), (50 bytes). + Removing tasks.o(.ARM.exidx.text.prvTaskIsTaskSuspended), (8 bytes). + Removing tasks.o(.text.xTaskResumeFromISR), (174 bytes). + Removing tasks.o(.ARM.exidx.text.xTaskResumeFromISR), (8 bytes). + Removing tasks.o(.ARM.exidx.text.vTaskStartScheduler), (8 bytes). + Removing tasks.o(.ARM.exidx.text.prvIdleTask), (8 bytes). + Removing tasks.o(.text.vTaskEndScheduler), (36 bytes). + Removing tasks.o(.ARM.exidx.text.vTaskEndScheduler), (8 bytes). + Removing tasks.o(.ARM.exidx.text.xTaskIncrementTick), (8 bytes). + Removing tasks.o(.ARM.exidx.text.xTaskGetTickCount), (8 bytes). + Removing tasks.o(.text.xTaskGetTickCountFromISR), (18 bytes). + Removing tasks.o(.ARM.exidx.text.xTaskGetTickCountFromISR), (8 bytes). + Removing tasks.o(.text.uxTaskGetNumberOfTasks), (12 bytes). + Removing tasks.o(.ARM.exidx.text.uxTaskGetNumberOfTasks), (8 bytes). + Removing tasks.o(.text.pcTaskGetName), (38 bytes). + Removing tasks.o(.ARM.exidx.text.pcTaskGetName), (8 bytes). + Removing tasks.o(.text.uxTaskGetSystemState), (196 bytes). + Removing tasks.o(.ARM.exidx.text.uxTaskGetSystemState), (8 bytes). + Removing tasks.o(.text.prvListTasksWithinSingleList), (100 bytes). + Removing tasks.o(.ARM.exidx.text.prvListTasksWithinSingleList), (8 bytes). + Removing tasks.o(.text.xTaskCatchUpTicks), (60 bytes). + Removing tasks.o(.ARM.exidx.text.xTaskCatchUpTicks), (8 bytes). + Removing tasks.o(.ARM.exidx.text.vTaskPlaceOnEventList), (8 bytes). + Removing tasks.o(.text.vTaskPlaceOnUnorderedEventList), (90 bytes). + Removing tasks.o(.ARM.exidx.text.vTaskPlaceOnUnorderedEventList), (8 bytes). + Removing tasks.o(.ARM.exidx.text.vTaskPlaceOnEventListRestricted), (8 bytes). + Removing tasks.o(.ARM.exidx.text.xTaskRemoveFromEventList), (8 bytes). + Removing tasks.o(.text.vTaskRemoveFromUnorderedEventList), (150 bytes). + Removing tasks.o(.ARM.exidx.text.vTaskRemoveFromUnorderedEventList), (8 bytes). + Removing tasks.o(.text.vTaskSetTimeOutState), (58 bytes). + Removing tasks.o(.ARM.exidx.text.vTaskSetTimeOutState), (8 bytes). + Removing tasks.o(.ARM.exidx.text.vTaskInternalSetTimeOutState), (8 bytes). + Removing tasks.o(.ARM.exidx.text.xTaskCheckForTimeOut), (8 bytes). + Removing tasks.o(.ARM.exidx.text.vTaskMissedYield), (8 bytes). + Removing tasks.o(.text.uxTaskGetTaskNumber), (10 bytes). + Removing tasks.o(.ARM.exidx.text.uxTaskGetTaskNumber), (8 bytes). + Removing tasks.o(.text.vTaskSetTaskNumber), (8 bytes). + Removing tasks.o(.ARM.exidx.text.vTaskSetTaskNumber), (8 bytes). + Removing tasks.o(.text.vTaskGetInfo), (126 bytes). + Removing tasks.o(.ARM.exidx.text.vTaskGetInfo), (8 bytes). + Removing tasks.o(.text.prvTaskCheckFreeStackSpace), (32 bytes). + Removing tasks.o(.ARM.exidx.text.prvTaskCheckFreeStackSpace), (8 bytes). + Removing tasks.o(.text.uxTaskGetStackHighWaterMark), (22 bytes). + Removing tasks.o(.ARM.exidx.text.uxTaskGetStackHighWaterMark), (8 bytes). + Removing tasks.o(.text.xTaskGetCurrentTaskHandle), (12 bytes). + Removing tasks.o(.ARM.exidx.text.xTaskGetCurrentTaskHandle), (8 bytes). + Removing tasks.o(.ARM.exidx.text.xTaskGetSchedulerState), (8 bytes). + Removing tasks.o(.text.xTaskPriorityInherit), (146 bytes). + Removing tasks.o(.ARM.exidx.text.xTaskPriorityInherit), (8 bytes). + Removing tasks.o(.ARM.exidx.text.xTaskPriorityDisinherit), (8 bytes). + Removing tasks.o(.text.vTaskPriorityDisinheritAfterTimeout), (164 bytes). + Removing tasks.o(.ARM.exidx.text.vTaskPriorityDisinheritAfterTimeout), (8 bytes). + Removing tasks.o(.text.uxTaskResetEventItemValue), (26 bytes). + Removing tasks.o(.ARM.exidx.text.uxTaskResetEventItemValue), (8 bytes). + Removing tasks.o(.text.pvTaskIncrementMutexHeldCount), (24 bytes). + Removing tasks.o(.ARM.exidx.text.pvTaskIncrementMutexHeldCount), (8 bytes). + Removing tasks.o(.text.ulTaskNotifyTake), (106 bytes). + Removing tasks.o(.ARM.exidx.text.ulTaskNotifyTake), (8 bytes). + Removing tasks.o(.text.xTaskNotifyWait), (144 bytes). + Removing tasks.o(.ARM.exidx.text.xTaskNotifyWait), (8 bytes). + Removing tasks.o(.text.xTaskGenericNotify), (252 bytes). + Removing tasks.o(.ARM.exidx.text.xTaskGenericNotify), (8 bytes). + Removing tasks.o(.text.xTaskGenericNotifyFromISR), (298 bytes). + Removing tasks.o(.ARM.exidx.text.xTaskGenericNotifyFromISR), (8 bytes). + Removing tasks.o(.text.vTaskNotifyGiveFromISR), (218 bytes). + Removing tasks.o(.ARM.exidx.text.vTaskNotifyGiveFromISR), (8 bytes). + Removing tasks.o(.text.xTaskNotifyStateClear), (44 bytes). + Removing tasks.o(.ARM.exidx.text.xTaskNotifyStateClear), (8 bytes). + Removing tasks.o(.text.ulTaskNotifyValueClear), (42 bytes). + Removing tasks.o(.ARM.exidx.text.ulTaskNotifyValueClear), (8 bytes). + Removing tasks.o(.ARM.exidx.text.prvInitialiseTaskLists), (8 bytes). + Removing tasks.o(.ARM.exidx.text.prvCheckTasksWaitingTermination), (8 bytes). + Removing timers.o(.text), (0 bytes). + Removing timers.o(.ARM.exidx.text.xTimerCreateTimerTask), (8 bytes). + Removing timers.o(.ARM.exidx.text.prvCheckForValidListAndQueue), (8 bytes). + Removing timers.o(.ARM.exidx.text.prvTimerTask), (8 bytes). + Removing timers.o(.text.xTimerCreate), (56 bytes). + Removing timers.o(.ARM.exidx.text.xTimerCreate), (8 bytes). + Removing timers.o(.text.prvInitialiseNewTimer), (86 bytes). + Removing timers.o(.ARM.exidx.text.prvInitialiseNewTimer), (8 bytes). + Removing timers.o(.text.xTimerCreateStatic), (82 bytes). + Removing timers.o(.ARM.exidx.text.xTimerCreateStatic), (8 bytes). + Removing timers.o(.ARM.exidx.text.xTimerGenericCommand), (8 bytes). + Removing timers.o(.text.xTimerGetTimerDaemonTaskHandle), (34 bytes). + Removing timers.o(.ARM.exidx.text.xTimerGetTimerDaemonTaskHandle), (8 bytes). + Removing timers.o(.text.xTimerGetPeriod), (26 bytes). + Removing timers.o(.ARM.exidx.text.xTimerGetPeriod), (8 bytes). + Removing timers.o(.text.vTimerSetReloadMode), (58 bytes). + Removing timers.o(.ARM.exidx.text.vTimerSetReloadMode), (8 bytes). + Removing timers.o(.text.uxTimerGetReloadMode), (46 bytes). + Removing timers.o(.ARM.exidx.text.uxTimerGetReloadMode), (8 bytes). + Removing timers.o(.text.xTimerGetExpiryTime), (26 bytes). + Removing timers.o(.ARM.exidx.text.xTimerGetExpiryTime), (8 bytes). + Removing timers.o(.text.pcTimerGetName), (26 bytes). + Removing timers.o(.ARM.exidx.text.pcTimerGetName), (8 bytes). + Removing timers.o(.text.xTimerIsTimerActive), (46 bytes). + Removing timers.o(.ARM.exidx.text.xTimerIsTimerActive), (8 bytes). + Removing timers.o(.text.pvTimerGetTimerID), (38 bytes). + Removing timers.o(.ARM.exidx.text.pvTimerGetTimerID), (8 bytes). + Removing timers.o(.text.vTimerSetTimerID), (38 bytes). + Removing timers.o(.ARM.exidx.text.vTimerSetTimerID), (8 bytes). + Removing timers.o(.text.xTimerPendFunctionCallFromISR), (42 bytes). + Removing timers.o(.ARM.exidx.text.xTimerPendFunctionCallFromISR), (8 bytes). + Removing timers.o(.text.xTimerPendFunctionCall), (70 bytes). + Removing timers.o(.ARM.exidx.text.xTimerPendFunctionCall), (8 bytes). + Removing timers.o(.text.uxTimerGetTimerNumber), (4 bytes). + Removing timers.o(.ARM.exidx.text.uxTimerGetTimerNumber), (8 bytes). + Removing timers.o(.text.vTimerSetTimerNumber), (4 bytes). + Removing timers.o(.ARM.exidx.text.vTimerSetTimerNumber), (8 bytes). + Removing timers.o(.ARM.exidx.text.prvGetNextExpireTime), (8 bytes). + Removing timers.o(.ARM.exidx.text.prvProcessTimerOrBlockTask), (8 bytes). + Removing timers.o(.ARM.exidx.text.prvProcessReceivedCommands), (8 bytes). + Removing timers.o(.ARM.exidx.text.prvSampleTimeNow), (8 bytes). + Removing timers.o(.ARM.exidx.text.prvProcessExpiredTimer), (8 bytes). + Removing timers.o(.ARM.exidx.text.prvSwitchTimerLists), (8 bytes). + Removing timers.o(.ARM.exidx.text.prvInsertTimerInActiveList), (8 bytes). + Removing cmsis_os2.o(.text), (0 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osKernelInitialize), (8 bytes). + Removing cmsis_os2.o(.text.osKernelGetInfo), (56 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osKernelGetInfo), (8 bytes). + Removing cmsis_os2.o(.text.osKernelGetState), (38 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osKernelGetState), (8 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osKernelStart), (8 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.SVC_Setup), (8 bytes). + Removing cmsis_os2.o(.text.osKernelLock), (44 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osKernelLock), (8 bytes). + Removing cmsis_os2.o(.text.osKernelUnlock), (68 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osKernelUnlock), (8 bytes). + Removing cmsis_os2.o(.text.osKernelRestoreLock), (76 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osKernelRestoreLock), (8 bytes). + Removing cmsis_os2.o(.text.osKernelGetTickCount), (20 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osKernelGetTickCount), (8 bytes). + Removing cmsis_os2.o(.text.osKernelGetTickFreq), (6 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osKernelGetTickFreq), (8 bytes). + Removing cmsis_os2.o(.text.osKernelGetSysTimerCount), (70 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osKernelGetSysTimerCount), (8 bytes). + Removing cmsis_os2.o(.text.OS_Tick_GetCount), (16 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.OS_Tick_GetCount), (8 bytes). + Removing cmsis_os2.o(.text.OS_Tick_GetOverflow), (16 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.OS_Tick_GetOverflow), (8 bytes). + Removing cmsis_os2.o(.text.OS_Tick_GetInterval), (14 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.OS_Tick_GetInterval), (8 bytes). + Removing cmsis_os2.o(.text.osKernelGetSysTimerFreq), (12 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osKernelGetSysTimerFreq), (8 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osThreadNew), (8 bytes). + Removing cmsis_os2.o(.text.osThreadGetName), (34 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osThreadGetName), (8 bytes). + Removing cmsis_os2.o(.text.osThreadGetId), (8 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osThreadGetId), (8 bytes). + Removing cmsis_os2.o(.text.osThreadGetState), (56 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osThreadGetState), (8 bytes). + Removing cmsis_os2.o(.text.osThreadGetStackSpace), (36 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osThreadGetStackSpace), (8 bytes). + Removing cmsis_os2.o(.text.osThreadSetPriority), (48 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osThreadSetPriority), (8 bytes). + Removing cmsis_os2.o(.text.osThreadGetPriority), (34 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osThreadGetPriority), (8 bytes). + Removing cmsis_os2.o(.text.osThreadYield), (40 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osThreadYield), (8 bytes). + Removing cmsis_os2.o(.text.osThreadSuspend), (34 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osThreadSuspend), (8 bytes). + Removing cmsis_os2.o(.text.osThreadResume), (34 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osThreadResume), (8 bytes). + Removing cmsis_os2.o(.text.osThreadExit), (10 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osThreadExit), (8 bytes). + Removing cmsis_os2.o(.text.osThreadTerminate), (52 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osThreadTerminate), (8 bytes). + Removing cmsis_os2.o(.text.osThreadGetCount), (20 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osThreadGetCount), (8 bytes). + Removing cmsis_os2.o(.text.osThreadEnumerate), (118 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osThreadEnumerate), (8 bytes). + Removing cmsis_os2.o(.text.osThreadFlagsSet), (126 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osThreadFlagsSet), (8 bytes). + Removing cmsis_os2.o(.text.osThreadFlagsClear), (82 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osThreadFlagsClear), (8 bytes). + Removing cmsis_os2.o(.text.osThreadFlagsGet), (48 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osThreadFlagsGet), (8 bytes). + Removing cmsis_os2.o(.text.osThreadFlagsWait), (186 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osThreadFlagsWait), (8 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osDelay), (8 bytes). + Removing cmsis_os2.o(.text.osDelayUntil), (52 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osDelayUntil), (8 bytes). + Removing cmsis_os2.o(.text.osTimerNew), (176 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osTimerNew), (8 bytes). + Removing cmsis_os2.o(.text.TimerCallback), (20 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.TimerCallback), (8 bytes). + Removing cmsis_os2.o(.text.osTimerGetName), (34 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osTimerGetName), (8 bytes). + Removing cmsis_os2.o(.text.osTimerStart), (58 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osTimerStart), (8 bytes). + Removing cmsis_os2.o(.text.osTimerStop), (78 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osTimerStop), (8 bytes). + Removing cmsis_os2.o(.text.osTimerIsRunning), (34 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osTimerIsRunning), (8 bytes). + Removing cmsis_os2.o(.text.osTimerDelete), (82 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osTimerDelete), (8 bytes). + Removing cmsis_os2.o(.text.osEventFlagsNew), (74 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osEventFlagsNew), (8 bytes). + Removing cmsis_os2.o(.text.osEventFlagsSet), (94 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osEventFlagsSet), (8 bytes). + Removing cmsis_os2.o(.text.osEventFlagsClear), (68 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osEventFlagsClear), (8 bytes). + Removing cmsis_os2.o(.text.osEventFlagsGet), (28 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osEventFlagsGet), (8 bytes). + Removing cmsis_os2.o(.text.osEventFlagsWait), (94 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osEventFlagsWait), (8 bytes). + Removing cmsis_os2.o(.text.osEventFlagsDelete), (34 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osEventFlagsDelete), (8 bytes). + Removing cmsis_os2.o(.text.osMutexNew), (150 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMutexNew), (8 bytes). + Removing cmsis_os2.o(.text.osMutexAcquire), (82 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMutexAcquire), (8 bytes). + Removing cmsis_os2.o(.text.osMutexRelease), (62 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMutexRelease), (8 bytes). + Removing cmsis_os2.o(.text.osMutexGetOwner), (34 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMutexGetOwner), (8 bytes). + Removing cmsis_os2.o(.text.osMutexDelete), (44 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMutexDelete), (8 bytes). + Removing cmsis_os2.o(.text.osSemaphoreNew), (196 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osSemaphoreNew), (8 bytes). + Removing cmsis_os2.o(.text.osSemaphoreAcquire), (106 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osSemaphoreAcquire), (8 bytes). + Removing cmsis_os2.o(.text.osSemaphoreRelease), (96 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osSemaphoreRelease), (8 bytes). + Removing cmsis_os2.o(.text.osSemaphoreGetCount), (26 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osSemaphoreGetCount), (8 bytes). + Removing cmsis_os2.o(.text.osSemaphoreDelete), (42 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osSemaphoreDelete), (8 bytes). + Removing cmsis_os2.o(.text.osMessageQueueNew), (160 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMessageQueueNew), (8 bytes). + Removing cmsis_os2.o(.text.osMessageQueuePut), (142 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMessageQueuePut), (8 bytes). + Removing cmsis_os2.o(.text.osMessageQueueGet), (134 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMessageQueueGet), (8 bytes). + Removing cmsis_os2.o(.text.osMessageQueueGetCapacity), (10 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMessageQueueGetCapacity), (8 bytes). + Removing cmsis_os2.o(.text.osMessageQueueGetMsgSize), (10 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMessageQueueGetMsgSize), (8 bytes). + Removing cmsis_os2.o(.text.osMessageQueueGetCount), (26 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMessageQueueGetCount), (8 bytes). + Removing cmsis_os2.o(.text.osMessageQueueGetSpace), (52 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMessageQueueGetSpace), (8 bytes). + Removing cmsis_os2.o(.text.osMessageQueueReset), (36 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMessageQueueReset), (8 bytes). + Removing cmsis_os2.o(.text.osMessageQueueDelete), (42 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMessageQueueDelete), (8 bytes). + Removing cmsis_os2.o(.text.osMemoryPoolNew), (284 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMemoryPoolNew), (8 bytes). + Removing cmsis_os2.o(.text.osMemoryPoolGetName), (24 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMemoryPoolGetName), (8 bytes). + Removing cmsis_os2.o(.text.osMemoryPoolAlloc), (156 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMemoryPoolAlloc), (8 bytes). + Removing cmsis_os2.o(.text.AllocBlock), (16 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.AllocBlock), (8 bytes). + Removing cmsis_os2.o(.text.CreateBlock), (28 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.CreateBlock), (8 bytes). + Removing cmsis_os2.o(.text.osMemoryPoolFree), (216 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMemoryPoolFree), (8 bytes). + Removing cmsis_os2.o(.text.FreeBlock), (8 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.FreeBlock), (8 bytes). + Removing cmsis_os2.o(.text.osMemoryPoolGetCapacity), (24 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMemoryPoolGetCapacity), (8 bytes). + Removing cmsis_os2.o(.text.osMemoryPoolGetBlockSize), (24 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMemoryPoolGetBlockSize), (8 bytes). + Removing cmsis_os2.o(.text.osMemoryPoolGetCount), (48 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMemoryPoolGetCount), (8 bytes). + Removing cmsis_os2.o(.text.osMemoryPoolGetSpace), (42 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMemoryPoolGetSpace), (8 bytes). + Removing cmsis_os2.o(.text.osMemoryPoolDelete), (94 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.osMemoryPoolDelete), (8 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.vApplicationGetIdleTaskMemory), (8 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.vApplicationGetTimerTaskMemory), (8 bytes). + Removing cmsis_os2.o(.ARM.exidx.text.__NVIC_SetPriority), (8 bytes). + Removing cmsis_os2.o(.rodata.str1.4), (17 bytes). + Removing heap_4.o(.text), (0 bytes). + Removing heap_4.o(.ARM.exidx.text.pvPortMalloc), (8 bytes). + Removing heap_4.o(.ARM.exidx.text.prvHeapInit), (8 bytes). + Removing heap_4.o(.ARM.exidx.text.prvInsertBlockIntoFreeList), (8 bytes). + Removing heap_4.o(.ARM.exidx.text.vPortFree), (8 bytes). + Removing heap_4.o(.text.xPortGetFreeHeapSize), (12 bytes). + Removing heap_4.o(.ARM.exidx.text.xPortGetFreeHeapSize), (8 bytes). + Removing heap_4.o(.text.xPortGetMinimumEverFreeHeapSize), (12 bytes). + Removing heap_4.o(.ARM.exidx.text.xPortGetMinimumEverFreeHeapSize), (8 bytes). + Removing heap_4.o(.text.vPortInitialiseBlocks), (2 bytes). + Removing heap_4.o(.ARM.exidx.text.vPortInitialiseBlocks), (8 bytes). + Removing heap_4.o(.text.vPortGetHeapStats), (142 bytes). + Removing heap_4.o(.ARM.exidx.text.vPortGetHeapStats), (8 bytes). + Removing port.o(.text), (0 bytes). + Removing port.o(.ARM.exidx.text.pxPortInitialiseStack), (8 bytes). + Removing port.o(.ARM.exidx.text.prvTaskExitError), (8 bytes). + Removing port.o(.ARM.exidx.text.SVC_Handler), (8 bytes). + Removing port.o(.ARM.exidx.text.xPortStartScheduler), (8 bytes). + Removing port.o(.ARM.exidx.text.vPortSetupTimerInterrupt), (8 bytes). + Removing port.o(.ARM.exidx.text.vPortEnableVFP), (8 bytes). + Removing port.o(.ARM.exidx.text.prvPortStartFirstTask), (8 bytes). + Removing port.o(.text.vPortEndScheduler), (38 bytes). + Removing port.o(.ARM.exidx.text.vPortEndScheduler), (8 bytes). + Removing port.o(.ARM.exidx.text.vPortEnterCritical), (8 bytes). + Removing port.o(.ARM.exidx.text.vPortExitCritical), (8 bytes). + Removing port.o(.ARM.exidx.text.PendSV_Handler), (8 bytes). + Removing port.o(.ARM.exidx.text.xPortSysTickHandler), (8 bytes). + Removing port.o(.ARM.exidx.text.vPortValidateInterruptPriority), (8 bytes). + Removing buzzer_pwm.o(.text), (0 bytes). + Removing buzzer_pwm.o(.text.BSP_BUZ_GetTIMxFrequency), (54 bytes). + Removing buzzer_pwm.o(.ARM.exidx.text.BSP_BUZ_GetTIMxFrequency), (8 bytes). + Removing buzzer_pwm.o(.text.BSP_BUZZER_Start), (28 bytes). + Removing buzzer_pwm.o(.ARM.exidx.text.BSP_BUZZER_Start), (8 bytes). + Removing buzzer_pwm.o(.text.BSP_BUZZER_Stop), (28 bytes). + Removing buzzer_pwm.o(.ARM.exidx.text.BSP_BUZZER_Stop), (8 bytes). + Removing buzzer_pwm.o(.text.BSP_BUZZER_Set_Duty_Cycle), (84 bytes). + Removing buzzer_pwm.o(.ARM.exidx.text.BSP_BUZZER_Set_Duty_Cycle), (8 bytes). + Removing buzzer_pwm.o(.text.BSP_BUZZER_Set_Freq), (176 bytes). + Removing buzzer_pwm.o(.ARM.exidx.text.BSP_BUZZER_Set_Freq), (8 bytes). + Removing buzzer_pwm.o(.text.BSP_BUZZER_Set), (568 bytes). + Removing buzzer_pwm.o(.ARM.exidx.text.BSP_BUZZER_Set), (8 bytes). + Removing buzzer_pwm.o(.text.Buzzer_On), (58 bytes). + Removing buzzer_pwm.o(.ARM.exidx.text.Buzzer_On), (8 bytes). + Removing buzzer_pwm.o(.text.Buzzer_Off), (18 bytes). + Removing buzzer_pwm.o(.ARM.exidx.text.Buzzer_Off), (8 bytes). + Removing buzzer_pwm.o(.data.bsp_buzzer_ch), (8 bytes). + Removing buzzer_pwm.o(.bss.bsp_buzzer_s_flag), (1 bytes). + Removing delay.o(.text), (0 bytes). + Removing delay.o(.text.BSP_Delay), (88 bytes). + Removing delay.o(.ARM.exidx.text.BSP_Delay), (8 bytes). + Removing delay.o(.text.BSP_Delay_Init), (72 bytes). + Removing delay.o(.ARM.exidx.text.BSP_Delay_Init), (8 bytes). + Removing delay.o(.text.BSP_Delay_us), (32 bytes). + Removing delay.o(.ARM.exidx.text.BSP_Delay_us), (8 bytes). + Removing delay.o(.text.delay_ticks), (50 bytes). + Removing delay.o(.ARM.exidx.text.delay_ticks), (8 bytes). + Removing delay.o(.text.BSP_Delay_ms), (32 bytes). + Removing delay.o(.ARM.exidx.text.BSP_Delay_ms), (8 bytes). + Removing delay.o(.bss.fac_us), (1 bytes). + Removing delay.o(.bss.fac_ms), (4 bytes). + Removing dwt.o(.text), (0 bytes). + Removing dwt.o(.text.DWT_Init), (130 bytes). + Removing dwt.o(.ARM.exidx.text.DWT_Init), (8 bytes). + Removing dwt.o(.text.DWT_GetDeltaT), (74 bytes). + Removing dwt.o(.ARM.exidx.text.DWT_GetDeltaT), (8 bytes). + Removing dwt.o(.text.DWT_CNT_Update), (52 bytes). + Removing dwt.o(.ARM.exidx.text.DWT_CNT_Update), (8 bytes). + Removing dwt.o(.text.DWT_GetDeltaT64), (82 bytes). + Removing dwt.o(.ARM.exidx.text.DWT_GetDeltaT64), (8 bytes). + Removing dwt.o(.text.DWT_SysTimeUpdate), (154 bytes). + Removing dwt.o(.ARM.exidx.text.DWT_SysTimeUpdate), (8 bytes). + Removing dwt.o(.text.DWT_GetTimeline_s), (76 bytes). + Removing dwt.o(.ARM.exidx.text.DWT_GetTimeline_s), (8 bytes). + Removing dwt.o(.text.DWT_GetTimeline_ms), (64 bytes). + Removing dwt.o(.ARM.exidx.text.DWT_GetTimeline_ms), (8 bytes). + Removing dwt.o(.text.DWT_GetTimeline_us), (42 bytes). + Removing dwt.o(.ARM.exidx.text.DWT_GetTimeline_us), (8 bytes). + Removing dwt.o(.text.DWT_Delay), (56 bytes). + Removing dwt.o(.ARM.exidx.text.DWT_Delay), (8 bytes). + Removing dwt.o(.bss.CPU_FREQ_Hz), (4 bytes). + Removing dwt.o(.bss.CPU_FREQ_Hz_ms), (4 bytes). + Removing dwt.o(.bss.CPU_FREQ_Hz_us), (4 bytes). + Removing dwt.o(.bss.CYCCNT_RountCount), (4 bytes). + Removing dwt.o(.bss.CYCCNT64), (8 bytes). + Removing dwt.o(.bss.SysTime), (8 bytes). + Removing dwt.o(.bss.CYCCNT_LAST), (4 bytes). + Removing gpio_1.o(.text), (0 bytes). + Removing gpio_1.o(.ARM.exidx.text.HAL_GPIO_EXTI_Callback), (8 bytes). + Removing gpio_1.o(.text.BSP_GPIO_RegisterCallback), (54 bytes). + Removing gpio_1.o(.ARM.exidx.text.BSP_GPIO_RegisterCallback), (8 bytes). + Removing gpio_1.o(.text.BSP_GPIO_EnableIRQ), (36 bytes). + Removing gpio_1.o(.ARM.exidx.text.BSP_GPIO_EnableIRQ), (8 bytes). + Removing gpio_1.o(.text.BSP_GPIO_DisableIRQ), (36 bytes). + Removing gpio_1.o(.ARM.exidx.text.BSP_GPIO_DisableIRQ), (8 bytes). + Removing i2c_1.o(.text), (0 bytes). + Removing i2c_1.o(.text.HAL_I2C_MasterTxCpltCallback), (36 bytes). + Removing i2c_1.o(.ARM.exidx.text.HAL_I2C_MasterTxCpltCallback), (8 bytes). + Removing i2c_1.o(.text.I2C_Get), (20 bytes). + Removing i2c_1.o(.ARM.exidx.text.I2C_Get), (8 bytes). + Removing i2c_1.o(.text.HAL_I2C_MasterRxCpltCallback), (38 bytes). + Removing i2c_1.o(.ARM.exidx.text.HAL_I2C_MasterRxCpltCallback), (8 bytes). + Removing i2c_1.o(.text.HAL_I2C_SlaveTxCpltCallback), (38 bytes). + Removing i2c_1.o(.ARM.exidx.text.HAL_I2C_SlaveTxCpltCallback), (8 bytes). + Removing i2c_1.o(.text.HAL_I2C_SlaveRxCpltCallback), (38 bytes). + Removing i2c_1.o(.ARM.exidx.text.HAL_I2C_SlaveRxCpltCallback), (8 bytes). + Removing i2c_1.o(.text.HAL_I2C_ListenCpltCallback), (38 bytes). + Removing i2c_1.o(.ARM.exidx.text.HAL_I2C_ListenCpltCallback), (8 bytes). + Removing i2c_1.o(.text.HAL_I2C_MemTxCpltCallback), (38 bytes). + Removing i2c_1.o(.ARM.exidx.text.HAL_I2C_MemTxCpltCallback), (8 bytes). + Removing i2c_1.o(.text.HAL_I2C_MemRxCpltCallback), (38 bytes). + Removing i2c_1.o(.ARM.exidx.text.HAL_I2C_MemRxCpltCallback), (8 bytes). + Removing i2c_1.o(.text.HAL_I2C_ErrorCallback), (38 bytes). + Removing i2c_1.o(.ARM.exidx.text.HAL_I2C_ErrorCallback), (8 bytes). + Removing i2c_1.o(.text.HAL_I2C_AbortCpltCallback), (38 bytes). + Removing i2c_1.o(.ARM.exidx.text.HAL_I2C_AbortCpltCallback), (8 bytes). + Removing i2c_1.o(.text.BSP_I2C_GetHandle), (18 bytes). + Removing i2c_1.o(.ARM.exidx.text.BSP_I2C_GetHandle), (8 bytes). + Removing i2c_1.o(.text.BSP_I2C_RegisterCallback), (34 bytes). + Removing i2c_1.o(.ARM.exidx.text.BSP_I2C_RegisterCallback), (8 bytes). + Removing i2c_1.o(.bss.I2C_Callback), (36 bytes). + Removing led_pwm.o(.text), (0 bytes). + Removing led_pwm.o(.text.BSP_LED_Start), (38 bytes). + Removing led_pwm.o(.ARM.exidx.text.BSP_LED_Start), (8 bytes). + Removing led_pwm.o(.text.BSP_LED_Stop), (38 bytes). + Removing led_pwm.o(.ARM.exidx.text.BSP_LED_Stop), (8 bytes). + Removing led_pwm.o(.text.BSP_LED_Set), (258 bytes). + Removing led_pwm.o(.ARM.exidx.text.BSP_LED_Set), (8 bytes). + Removing led_pwm.o(.data.bsp_led_channel_config), (36 bytes). + Removing pwm.o(.text), (0 bytes). + Removing pwm.o(.text.BSP_PWM_Start), (88 bytes). + Removing pwm.o(.ARM.exidx.text.BSP_PWM_Start), (8 bytes). + Removing pwm.o(.text.BSP_PWM_Set), (192 bytes). + Removing pwm.o(.ARM.exidx.text.BSP_PWM_Set), (8 bytes). + Removing pwm.o(.text.BSP_PWM_Stop), (88 bytes). + Removing pwm.o(.ARM.exidx.text.BSP_PWM_Stop), (8 bytes). + Removing spi_1.o(.text), (0 bytes). + Removing spi_1.o(.text.HAL_SPI_TxCpltCallback), (32 bytes). + Removing spi_1.o(.ARM.exidx.text.HAL_SPI_TxCpltCallback), (8 bytes). + Removing spi_1.o(.text.SPI_Get), (20 bytes). + Removing spi_1.o(.ARM.exidx.text.SPI_Get), (8 bytes). + Removing spi_1.o(.text.HAL_SPI_RxCpltCallback), (34 bytes). + Removing spi_1.o(.ARM.exidx.text.HAL_SPI_RxCpltCallback), (8 bytes). + Removing spi_1.o(.text.HAL_SPI_TxRxCpltCallback), (34 bytes). + Removing spi_1.o(.ARM.exidx.text.HAL_SPI_TxRxCpltCallback), (8 bytes). + Removing spi_1.o(.text.HAL_SPI_TxHalfCpltCallback), (34 bytes). + Removing spi_1.o(.ARM.exidx.text.HAL_SPI_TxHalfCpltCallback), (8 bytes). + Removing spi_1.o(.text.HAL_SPI_RxHalfCpltCallback), (34 bytes). + Removing spi_1.o(.ARM.exidx.text.HAL_SPI_RxHalfCpltCallback), (8 bytes). + Removing spi_1.o(.text.HAL_SPI_TxRxHalfCpltCallback), (34 bytes). + Removing spi_1.o(.ARM.exidx.text.HAL_SPI_TxRxHalfCpltCallback), (8 bytes). + Removing spi_1.o(.text.HAL_SPI_ErrorCallback), (34 bytes). + Removing spi_1.o(.ARM.exidx.text.HAL_SPI_ErrorCallback), (8 bytes). + Removing spi_1.o(.text.HAL_SPI_AbortCpltCallback), (34 bytes). + Removing spi_1.o(.ARM.exidx.text.HAL_SPI_AbortCpltCallback), (8 bytes). + Removing spi_1.o(.text.BSP_SPI_GetHandle), (18 bytes). + Removing spi_1.o(.ARM.exidx.text.BSP_SPI_GetHandle), (8 bytes). + Removing spi_1.o(.text.BSP_SPI_RegisterCallback), (30 bytes). + Removing spi_1.o(.ARM.exidx.text.BSP_SPI_RegisterCallback), (8 bytes). + Removing spi_1.o(.bss.SPI_Callback), (32 bytes). + Removing time.o(.text), (0 bytes). + Removing time.o(.text.BSP_TIME_Get_ms), (8 bytes). + Removing time.o(.ARM.exidx.text.BSP_TIME_Get_ms), (8 bytes). + Removing time.o(.text.BSP_TIME_Get_us), (80 bytes). + Removing time.o(.ARM.exidx.text.BSP_TIME_Get_us), (8 bytes). + Removing time.o(.text.BSP_TIME_Delay_ms), (88 bytes). + Removing time.o(.ARM.exidx.text.BSP_TIME_Delay_ms), (8 bytes). + Removing time.o(.text.BSP_TIME_Delay_us), (32 bytes). + Removing time.o(.ARM.exidx.text.BSP_TIME_Delay_us), (8 bytes). + Removing uart.o(.text), (0 bytes). + Removing uart.o(.ARM.exidx.text.HAL_UART_TxCpltCallback), (8 bytes). + Removing uart.o(.ARM.exidx.text.UART_Get), (8 bytes). + Removing uart.o(.text.HAL_UART_TxHalfCpltCallback), (36 bytes). + Removing uart.o(.ARM.exidx.text.HAL_UART_TxHalfCpltCallback), (8 bytes). + Removing uart.o(.ARM.exidx.text.HAL_UART_RxCpltCallback), (8 bytes). + Removing uart.o(.text.HAL_UART_RxHalfCpltCallback), (38 bytes). + Removing uart.o(.ARM.exidx.text.HAL_UART_RxHalfCpltCallback), (8 bytes). + Removing uart.o(.ARM.exidx.text.HAL_UART_ErrorCallback), (8 bytes). + Removing uart.o(.text.HAL_UART_AbortCpltCallback), (38 bytes). + Removing uart.o(.ARM.exidx.text.HAL_UART_AbortCpltCallback), (8 bytes). + Removing uart.o(.text.HAL_UART_AbortTransmitCpltCallback), (38 bytes). + Removing uart.o(.ARM.exidx.text.HAL_UART_AbortTransmitCpltCallback), (8 bytes). + Removing uart.o(.text.HAL_UART_AbortReceiveCpltCallback), (38 bytes). + Removing uart.o(.ARM.exidx.text.HAL_UART_AbortReceiveCpltCallback), (8 bytes). + Removing uart.o(.text.BSP_UART_IRQHandler), (58 bytes). + Removing uart.o(.ARM.exidx.text.BSP_UART_IRQHandler), (8 bytes). + Removing uart.o(.text.BSP_UART_GetHandle), (18 bytes). + Removing uart.o(.ARM.exidx.text.BSP_UART_GetHandle), (8 bytes). + Removing uart.o(.text.BSP_UART_RegisterCallback), (44 bytes). + Removing uart.o(.ARM.exidx.text.BSP_UART_RegisterCallback), (8 bytes). + Removing uart.o(.text.BSP_UART_Transmit), (62 bytes). + Removing uart.o(.ARM.exidx.text.BSP_UART_Transmit), (8 bytes). + Removing uart.o(.text.BSP_UART_Receive), (62 bytes). + Removing uart.o(.ARM.exidx.text.BSP_UART_Receive), (8 bytes). + Removing bmi088.o(.text), (0 bytes). + Removing bmi088.o(.text.BMI088_Init), (322 bytes). + Removing bmi088.o(.ARM.exidx.text.BMI088_Init), (8 bytes). + Removing bmi088.o(.text.BMI_WriteSingle), (108 bytes). + Removing bmi088.o(.ARM.exidx.text.BMI_WriteSingle), (8 bytes). + Removing bmi088.o(.text.BMI_ReadSingle), (128 bytes). + Removing bmi088.o(.ARM.exidx.text.BMI_ReadSingle), (8 bytes). + Removing bmi088.o(.text.BMI088_RxCpltCallback), (90 bytes). + Removing bmi088.o(.ARM.exidx.text.BMI088_RxCpltCallback), (8 bytes). + Removing bmi088.o(.text.BMI088_AcclIntCallback), (20 bytes). + Removing bmi088.o(.ARM.exidx.text.BMI088_AcclIntCallback), (8 bytes). + Removing bmi088.o(.text.BMI088_GyroIntCallback), (20 bytes). + Removing bmi088.o(.ARM.exidx.text.BMI088_GyroIntCallback), (8 bytes). + Removing bmi088.o(.text.BMI088_GyroStable), (68 bytes). + Removing bmi088.o(.ARM.exidx.text.BMI088_GyroStable), (8 bytes). + Removing bmi088.o(.text.BMI088_WaitNew), (16 bytes). + Removing bmi088.o(.ARM.exidx.text.BMI088_WaitNew), (8 bytes). + Removing bmi088.o(.text.BMI088_AcclStartDmaRecv), (24 bytes). + Removing bmi088.o(.ARM.exidx.text.BMI088_AcclStartDmaRecv), (8 bytes). + Removing bmi088.o(.text.BMI_Read), (98 bytes). + Removing bmi088.o(.ARM.exidx.text.BMI_Read), (8 bytes). + Removing bmi088.o(.text.BMI088_AcclWaitDmaCplt), (16 bytes). + Removing bmi088.o(.ARM.exidx.text.BMI088_AcclWaitDmaCplt), (8 bytes). + Removing bmi088.o(.text.BMI088_GyroStartDmaRecv), (26 bytes). + Removing bmi088.o(.ARM.exidx.text.BMI088_GyroStartDmaRecv), (8 bytes). + Removing bmi088.o(.text.BMI088_GyroWaitDmaCplt), (16 bytes). + Removing bmi088.o(.ARM.exidx.text.BMI088_GyroWaitDmaCplt), (8 bytes). + Removing bmi088.o(.text.BMI088_ParseAccl), (144 bytes). + Removing bmi088.o(.ARM.exidx.text.BMI088_ParseAccl), (8 bytes). + Removing bmi088.o(.text.BMI088_ParseGyro), (128 bytes). + Removing bmi088.o(.ARM.exidx.text.BMI088_ParseGyro), (8 bytes). + Removing bmi088.o(.text.BMI088_GetUpdateFreq), (12 bytes). + Removing bmi088.o(.ARM.exidx.text.BMI088_GetUpdateFreq), (8 bytes). + Removing bmi088.o(.bss.inited), (1 bytes). + Removing bmi088.o(.bss.thread_alert), (4 bytes). + Removing bmi088.o(.bss.bmi088_rxbuf), (19 bytes). + Removing bmi088.o(.bss.buffer), (2 bytes). + Removing ist8310.o(.text), (0 bytes). + Removing ist8310.o(.text.IST8310_Init), (204 bytes). + Removing ist8310.o(.ARM.exidx.text.IST8310_Init), (8 bytes). + Removing ist8310.o(.text.IST8310_ReadSingle), (52 bytes). + Removing ist8310.o(.ARM.exidx.text.IST8310_ReadSingle), (8 bytes). + Removing ist8310.o(.text.IST8310_MemRxCpltCallback), (22 bytes). + Removing ist8310.o(.ARM.exidx.text.IST8310_MemRxCpltCallback), (8 bytes). + Removing ist8310.o(.text.IST8310_IntCallback), (22 bytes). + Removing ist8310.o(.ARM.exidx.text.IST8310_IntCallback), (8 bytes). + Removing ist8310.o(.text.IST8310_WriteSingle), (48 bytes). + Removing ist8310.o(.ARM.exidx.text.IST8310_WriteSingle), (8 bytes). + Removing ist8310.o(.text.IST8310_WaitNew), (26 bytes). + Removing ist8310.o(.ARM.exidx.text.IST8310_WaitNew), (8 bytes). + Removing ist8310.o(.text.IST8310_StartDmaRecv), (10 bytes). + Removing ist8310.o(.ARM.exidx.text.IST8310_StartDmaRecv), (8 bytes). + Removing ist8310.o(.text.IST8310_Read), (42 bytes). + Removing ist8310.o(.ARM.exidx.text.IST8310_Read), (8 bytes). + Removing ist8310.o(.text.IST8310_WaitDmaCplt), (18 bytes). + Removing ist8310.o(.ARM.exidx.text.IST8310_WaitDmaCplt), (8 bytes). + Removing ist8310.o(.text.IST8310_Parse), (140 bytes). + Removing ist8310.o(.ARM.exidx.text.IST8310_Parse), (8 bytes). + Removing ist8310.o(.bss.inited), (1 bytes). + Removing ist8310.o(.bss.thread_alert), (4 bytes). + Removing ist8310.o(.bss.ist8310_rxbuf), (6 bytes). + Removing ps2.o(.text), (0 bytes). + Removing ps2.o(.text.PS2_CS), (28 bytes). + Removing ps2.o(.ARM.exidx.text.PS2_CS), (8 bytes). + Removing ps2.o(.text.PS2_CLK), (28 bytes). + Removing ps2.o(.ARM.exidx.text.PS2_CLK), (8 bytes). + Removing ps2.o(.text.PS2_DO), (28 bytes). + Removing ps2.o(.ARM.exidx.text.PS2_DO), (8 bytes). + Removing ps2.o(.text.PS2_Read_DI), (20 bytes). + Removing ps2.o(.ARM.exidx.text.PS2_Read_DI), (8 bytes). + Removing ps2.o(.text.PS2_ReadWrite_Byte), (82 bytes). + Removing ps2.o(.ARM.exidx.text.PS2_ReadWrite_Byte), (8 bytes). + Removing ps2.o(.text.PS2_Decode), (326 bytes). + Removing ps2.o(.ARM.exidx.text.PS2_Decode), (8 bytes). + Removing ps2.o(.text.PS2_Read_Data), (62 bytes). + Removing ps2.o(.ARM.exidx.text.PS2_Read_Data), (8 bytes). + Removing ps2.o(.text.StickToThrottle_Optimized), (96 bytes). + Removing ps2.o(.ARM.exidx.text.StickToThrottle_Optimized), (8 bytes). + Removing ps2.o(.bss.PS2_RawData), (9 bytes). + Removing ps2.o(.bss.PS2_Data), (36 bytes). + Removing spl06.o(.text), (0 bytes). + Removing spl06.o(.text.spl06_write_reg), (54 bytes). + Removing spl06.o(.ARM.exidx.text.spl06_write_reg), (8 bytes). + Removing spl06.o(.text.spl06_read_reg), (54 bytes). + Removing spl06.o(.ARM.exidx.text.spl06_read_reg), (8 bytes). + Removing spl06.o(.text.spl06_start), (12 bytes). + Removing spl06.o(.ARM.exidx.text.spl06_start), (8 bytes). + Removing spl06.o(.text.spl06_config_temperature), (96 bytes). + Removing spl06.o(.ARM.exidx.text.spl06_config_temperature), (8 bytes). + Removing spl06.o(.text.spl06_config_pressure), (92 bytes). + Removing spl06.o(.ARM.exidx.text.spl06_config_pressure), (8 bytes). + Removing spl06.o(.text.spl06_get_pressure_adc), (42 bytes). + Removing spl06.o(.ARM.exidx.text.spl06_get_pressure_adc), (8 bytes). + Removing spl06.o(.text.spl06_get_temperature_adc), (42 bytes). + Removing spl06.o(.ARM.exidx.text.spl06_get_temperature_adc), (8 bytes). + Removing spl06.o(.text.spl06_update), (304 bytes). + Removing spl06.o(.ARM.exidx.text.spl06_update), (8 bytes). + Removing spl06.o(.text.spl06_get_measure_status), (10 bytes). + Removing spl06.o(.ARM.exidx.text.spl06_get_measure_status), (8 bytes). + Removing spl06.o(.text.spl06_set_measure_mode), (12 bytes). + Removing spl06.o(.ARM.exidx.text.spl06_set_measure_mode), (8 bytes). + Removing spl06.o(.text.spl06_start_temperature), (12 bytes). + Removing spl06.o(.ARM.exidx.text.spl06_start_temperature), (8 bytes). + Removing spl06.o(.text.spl06_start_pressure), (12 bytes). + Removing spl06.o(.ARM.exidx.text.spl06_start_pressure), (8 bytes). + Removing spl06.o(.text.spl06_enter_standby), (12 bytes). + Removing spl06.o(.ARM.exidx.text.spl06_enter_standby), (8 bytes). + Removing spl06.o(.text.spl06_get_calib_param), (262 bytes). + Removing spl06.o(.ARM.exidx.text.spl06_get_calib_param), (8 bytes). + Removing spl06.o(.text.spl06_init), (102 bytes). + Removing spl06.o(.ARM.exidx.text.spl06_init), (8 bytes). + Removing spl06.o(.text.Caculate_height), (128 bytes). + Removing spl06.o(.ARM.exidx.text.Caculate_height), (8 bytes). + Removing spl06.o(.bss.spl06), (20 bytes). + Removing spl06.o(.bss.spl06_calib_param), (24 bytes). + Removing ahrs.o(.text), (0 bytes). + Removing ahrs.o(.text.AHRS_Init), (388 bytes). + Removing ahrs.o(.ARM.exidx.text.AHRS_Init), (8 bytes). + Removing ahrs.o(.text.AHRS_Update), (1422 bytes). + Removing ahrs.o(.ARM.exidx.text.AHRS_Update), (8 bytes). + Removing ahrs.o(.text.AHRS_UpdateIMU), (752 bytes). + Removing ahrs.o(.ARM.exidx.text.AHRS_UpdateIMU), (8 bytes). + Removing ahrs.o(.text.AHRS_GetEulr), (220 bytes). + Removing ahrs.o(.ARM.exidx.text.AHRS_GetEulr), (8 bytes). + Removing ahrs.o(.text.copysignf), (22 bytes). + Removing ahrs.o(.ARM.exidx.text.copysignf), (8 bytes). + Removing ahrs.o(.text.AHRS_ResetEulr), (10 bytes). + Removing ahrs.o(.ARM.exidx.text.AHRS_ResetEulr), (8 bytes). + Removing ahrs.o(.data.beta), (4 bytes). + Removing filter.o(.text), (0 bytes). + Removing filter.o(.text.LowPassFilter2p_Init), (164 bytes). + Removing filter.o(.ARM.exidx.text.LowPassFilter2p_Init), (8 bytes). + Removing filter.o(.text.LowPassFilter2p_Apply), (124 bytes). + Removing filter.o(.ARM.exidx.text.LowPassFilter2p_Apply), (8 bytes). + Removing filter.o(.text.__ARM_isinff), (16 bytes). + Removing filter.o(.ARM.exidx.text.__ARM_isinff), (8 bytes). + Removing filter.o(.text.LowPassFilter2p_Reset), (92 bytes). + Removing filter.o(.ARM.exidx.text.LowPassFilter2p_Reset), (8 bytes). + Removing filter.o(.text.__ARM_isfinitef), (14 bytes). + Removing filter.o(.ARM.exidx.text.__ARM_isfinitef), (8 bytes). + Removing filter.o(.text.NotchFilter_Init), (176 bytes). + Removing filter.o(.ARM.exidx.text.NotchFilter_Init), (8 bytes). + Removing filter.o(.text.NotchFilter_Apply), (88 bytes). + Removing filter.o(.ARM.exidx.text.NotchFilter_Apply), (8 bytes). + Removing filter.o(.text.NotchFilter_Reset), (84 bytes). + Removing filter.o(.ARM.exidx.text.NotchFilter_Reset), (8 bytes). + Removing fixed_height.o(.text), (0 bytes). + Removing fixed_height.o(.text.AltKalman_Init), (48 bytes). + Removing fixed_height.o(.ARM.exidx.text.AltKalman_Init), (8 bytes). + Removing fixed_height.o(.text.AltKalman_Update), (202 bytes). + Removing fixed_height.o(.ARM.exidx.text.AltKalman_Update), (8 bytes). + Removing pid.o(.text), (0 bytes). + Removing pid.o(.text.PID_Init), (144 bytes). + Removing pid.o(.ARM.exidx.text.PID_Init), (8 bytes). + Removing pid.o(.text.__ARM_isfinitef), (14 bytes). + Removing pid.o(.ARM.exidx.text.__ARM_isfinitef), (8 bytes). + Removing pid.o(.text.PID_Reset), (44 bytes). + Removing pid.o(.ARM.exidx.text.PID_Reset), (8 bytes). + Removing pid.o(.text.PID_Calc), (368 bytes). + Removing pid.o(.ARM.exidx.text.PID_Calc), (8 bytes). + Removing pid.o(.text.PID_ResetIntegral), (14 bytes). + Removing pid.o(.ARM.exidx.text.PID_ResetIntegral), (8 bytes). + Removing user_math.o(.text), (0 bytes). + Removing user_math.o(.text.InvSqrt), (66 bytes). + Removing user_math.o(.ARM.exidx.text.InvSqrt), (8 bytes). + Removing user_math.o(.text.AbsClip), (34 bytes). + Removing user_math.o(.ARM.exidx.text.AbsClip), (8 bytes). + Removing user_math.o(.text.fAbs), (6 bytes). + Removing user_math.o(.ARM.exidx.text.fAbs), (8 bytes). + Removing user_math.o(.text.Clip), (38 bytes). + Removing user_math.o(.ARM.exidx.text.Clip), (8 bytes). + Removing user_math.o(.text.Sign), (32 bytes). + Removing user_math.o(.ARM.exidx.text.Sign), (8 bytes). + Removing user_math.o(.text.CircleError), (60 bytes). + Removing user_math.o(.ARM.exidx.text.CircleError), (8 bytes). + Removing user_math.o(.text.CircleAdd), (58 bytes). + Removing user_math.o(.ARM.exidx.text.CircleAdd), (8 bytes). + Removing user_math.o(.text.CircleReverse), (24 bytes). + Removing user_math.o(.ARM.exidx.text.CircleReverse), (8 bytes). + Removing config.o(.text), (0 bytes). + Removing easy_control.o(.text), (0 bytes). + Removing easy_control.o(.text.Kalman_Init), (46 bytes). + Removing easy_control.o(.ARM.exidx.text.Kalman_Init), (8 bytes). + Removing easy_control.o(.text.Kalman_Update), (178 bytes). + Removing easy_control.o(.ARM.exidx.text.Kalman_Update), (8 bytes). + Removing easy_control.o(.text.FlightController_Init), (268 bytes). + Removing easy_control.o(.ARM.exidx.text.FlightController_Init), (8 bytes). + Removing easy_control.o(.text.FlightController_Update), (964 bytes). + Removing easy_control.o(.ARM.exidx.text.FlightController_Update), (8 bytes). + Removing easy_control.o(.text.FlightController_Reset), (112 bytes). + Removing easy_control.o(.ARM.exidx.text.FlightController_Reset), (8 bytes). + Removing easy_control.o(.text.MotorMixer_Init), (48 bytes). + Removing easy_control.o(.ARM.exidx.text.MotorMixer_Init), (8 bytes). + Removing easy_control.o(.text.Apply_Motor_Outputs), (320 bytes). + Removing easy_control.o(.ARM.exidx.text.Apply_Motor_Outputs), (8 bytes). + Removing easy_control.o(.text.MotorMixer_OutStop), (28 bytes). + Removing easy_control.o(.ARM.exidx.text.MotorMixer_OutStop), (8 bytes). + Removing easy_control.o(.data.angle_pid_params), (32 bytes). + Removing easy_control.o(.data.rate_pid_params), (32 bytes). + Removing easy_control.o(.data.alt_pos_pid_params), (32 bytes). + Removing easy_control.o(.data.alt_vel_pid_params), (32 bytes). + Removing easy_control.o(.bss.roll_kf), (36 bytes). + Removing easy_control.o(.bss.pitch_kf), (36 bytes). + Removing easy_control.o(.bss.roll_angle_pid), (60 bytes). + Removing easy_control.o(.bss.pitch_angle_pid), (60 bytes). + Removing easy_control.o(.bss.roll_rate_pid), (60 bytes). + Removing easy_control.o(.bss.pitch_rate_pid), (60 bytes). + Removing easy_control.o(.bss.yaw_rate_pid), (60 bytes). + Removing easy_control.o(.bss.altitude_pos_pid), (60 bytes). + Removing easy_control.o(.bss.altitude_vel_pid), (60 bytes). + Removing easy_control.o(.data.base_throttle), (4 bytes). + Removing easy_control.o(.bss.target_altitude), (4 bytes). + Removing easy_control.o(.bss.roll_angle), (4 bytes). + Removing easy_control.o(.bss.pitch_angle), (4 bytes). + Removing easy_control.o(.bss.target_yaw_rate), (4 bytes). + Removing easy_control.o(.bss.expected_speed), (4 bytes). + Removing easy_control.o(.bss.expect_thrust), (4 bytes). + Removing easy_control.o(.bss.target_roll_rate), (4 bytes). + Removing easy_control.o(.bss.target_pitch_rate), (4 bytes). + Removing easy_control.o(.bss.mixer), (48 bytes). + Removing easy_control.o(.bss.mix), (16 bytes). + Removing atti_esti.o(.text), (0 bytes). + Removing atti_esti.o(.text.Task_atti_esti), (376 bytes). + Removing atti_esti.o(.ARM.exidx.text.Task_atti_esti), (8 bytes). + Removing atti_esti.o(.bss.N), (2 bytes). + Removing atti_esti.o(.bss.sum_x), (4 bytes). + Removing atti_esti.o(.bss.sum_y), (4 bytes). + Removing atti_esti.o(.bss.sum_z), (4 bytes). + Removing atti_esti.o(.data.bmi_cali), (12 bytes). + Removing atti_esti.o(.bss.ist_cali), (24 bytes). + Removing atti_esti.o(.bss.bmi088), (32 bytes). + Removing atti_esti.o(.bss.gimbal_ahrs), (20 bytes). + Removing atti_esti.o(.bss.ist8310), (16 bytes). + Removing atti_esti.o(.bss.imu_temp_ctrl_pid), (60 bytes). + Removing atti_esti.o(.rodata.imu_temp_ctrl_pid_param), (32 bytes). + Removing atti_esti.o(.bss.eulr_to_send), (12 bytes). + Removing height_cal.o(.text), (0 bytes). + Removing height_cal.o(.text.Task_height_cal), (532 bytes). + Removing height_cal.o(.ARM.exidx.text.Task_height_cal), (8 bytes). + Removing height_cal.o(.bss.height_cal_running_states), (1 bytes). + Removing height_cal.o(.bss.Task_height_cal.accl_rx_flag), (1 bytes). + Removing height_cal.o(.bss.Task_height_cal.baro_rx_flag), (1 bytes). + Removing height_cal.o(.bss.alt_kf), (36 bytes). + Removing height_cal.o(.bss.height_cal_cnt_last), (4 bytes). + Removing height_cal.o(.bss.height_cal_dt), (4 bytes). + Removing height_cal.o(.bss.height_cal_accl_buffer), (12 bytes). + Removing height_cal.o(.bss.initial_gravity), (4 bytes). + Removing height_cal.o(.bss.baro_height_buffer), (4 bytes). + Removing height_cal.o(.bss.initial_baro_height), (4 bytes). + Removing height_cal.o(.bss.baro_height_m), (4 bytes). + Removing height_cal.o(.bss.height_cal_accl_without_gravity), (4 bytes). + Removing height_cal.o(.bss.height_to_send), (4 bytes). + Removing init.o(.text), (0 bytes). + Removing init.o(.text.Task_Init), (238 bytes). + Removing init.o(.ARM.exidx.text.Task_Init), (8 bytes). + Removing main_control.o(.text), (0 bytes). + Removing main_control.o(.text.Task_main_control), (760 bytes). + Removing main_control.o(.ARM.exidx.text.Task_main_control), (8 bytes). + Removing main_control.o(.bss.sensors), (32 bytes). + Removing main_control.o(.bss.main_control_rc), (36 bytes). + Removing main_control.o(.bss.main_control_cnt_last), (4 bytes). + Removing main_control.o(.bss.main_control_dt), (4 bytes). + Removing main_control.o(.bss.ctrl), (32 bytes). + Removing main_control.o(.bss.main_control_running_states), (1 bytes). + Removing ps2_1.o(.text), (0 bytes). + Removing ps2_1.o(.text.Task_ps2), (172 bytes). + Removing ps2_1.o(.ARM.exidx.text.Task_ps2), (8 bytes). + Removing ps2_1.o(.bss.rc_to_send), (36 bytes). + Removing test1.o(.text), (0 bytes). + Removing test1.o(.text.UART_IdleCallback_test), (88 bytes). + Removing test1.o(.ARM.exidx.text.UART_IdleCallback_test), (8 bytes). + Removing test1.o(.text.Task_test1), (178 bytes). + Removing test1.o(.ARM.exidx.text.Task_test1), (8 bytes). + Removing test1.o(.bss.rx_index), (2 bytes). + Removing test1.o(.bss.rx_complete), (1 bytes). + Removing test1.o(.bss.rx_buffer), (256 bytes). + Removing test1.o(.bss.height), (4 bytes). + Removing user_task.o(.text), (0 bytes). + Removing user_task.o(.rodata.str1.1), (54 bytes). + Removing user_task.o(.rodata.attr_init), (36 bytes). + Removing user_task.o(.rodata.attr_ps2), (36 bytes). + Removing user_task.o(.rodata.attr_test1), (36 bytes). + Removing user_task.o(.rodata.attr_atti_esti), (36 bytes). + Removing user_task.o(.rodata.attr_height_cal), (36 bytes). + Removing user_task.o(.rodata.attr_main_control), (36 bytes). + Removing user_task.o(.bss.task_runtime), (112 bytes). + +2038 unused section(s) (total 94062 bytes) removed from the image. + +============================================================================== + +Image Symbol Table + + Local Symbols + + Symbol Name Value Ov Type Size Object(Section) + + ../clib/angel/boardlib.s 0x00000000 Number 0 boardinit1.o ABSOLUTE + ../clib/angel/boardlib.s 0x00000000 Number 0 boardinit2.o ABSOLUTE + ../clib/angel/boardlib.s 0x00000000 Number 0 boardinit3.o ABSOLUTE + ../clib/angel/boardlib.s 0x00000000 Number 0 boardshut.o ABSOLUTE + ../clib/angel/handlers.s 0x00000000 Number 0 __scatter_copy.o ABSOLUTE + ../clib/angel/handlers.s 0x00000000 Number 0 __scatter_zi.o ABSOLUTE + ../clib/angel/kernel.s 0x00000000 Number 0 __rtentry.o ABSOLUTE + ../clib/angel/kernel.s 0x00000000 Number 0 __rtentry2.o ABSOLUTE + ../clib/angel/kernel.s 0x00000000 Number 0 __rtentry4.o ABSOLUTE + ../clib/angel/kernel.s 0x00000000 Number 0 rtexit.o ABSOLUTE + ../clib/angel/kernel.s 0x00000000 Number 0 rtexit2.o ABSOLUTE + ../clib/angel/rt.s 0x00000000 Number 0 aeabi_ldiv0.o ABSOLUTE + ../clib/angel/rt.s 0x00000000 Number 0 aeabi_ldiv0_sigfpe.o ABSOLUTE + ../clib/angel/rt.s 0x00000000 Number 0 rt_div0.o ABSOLUTE + ../clib/angel/rt.s 0x00000000 Number 0 rt_errno_addr.o ABSOLUTE + ../clib/angel/rt.s 0x00000000 Number 0 rt_errno_addr_intlibspace.o ABSOLUTE + ../clib/angel/rt.s 0x00000000 Number 0 rt_raise.o ABSOLUTE + ../clib/angel/scatter.s 0x00000000 Number 0 __scatter.o ABSOLUTE + ../clib/angel/startup.s 0x00000000 Number 0 __main.o ABSOLUTE + ../clib/angel/sys.s 0x00000000 Number 0 libspace.o ABSOLUTE + ../clib/angel/sys.s 0x00000000 Number 0 sys_stackheap_outer.o ABSOLUTE + ../clib/angel/sys.s 0x00000000 Number 0 use_no_semi.o ABSOLUTE + ../clib/angel/sys.s 0x00000000 Number 0 indicate_semi.o ABSOLUTE + ../clib/angel/sysapp.c 0x00000000 Number 0 sys_exit.o ABSOLUTE + ../clib/angel/sysapp.c 0x00000000 Number 0 sys_exit_hlt.o ABSOLUTE + ../clib/angel/sysapp.c 0x00000000 Number 0 sys_wrch.o ABSOLUTE + ../clib/angel/sysapp.c 0x00000000 Number 0 sys_wrch_hlt.o ABSOLUTE + ../clib/angel/sysapp.c 0x00000000 Number 0 sys_command.o ABSOLUTE + ../clib/angel/sysapp.c 0x00000000 Number 0 sys_command_hlt.o ABSOLUTE + ../clib/armsys.c 0x00000000 Number 0 argv_veneer.o ABSOLUTE + ../clib/armsys.c 0x00000000 Number 0 argv_veneer.o ABSOLUTE + ../clib/armsys.c 0x00000000 Number 0 _get_argv_nomalloc.o ABSOLUTE + ../clib/armsys.c 0x00000000 Number 0 no_argv.o ABSOLUTE + ../clib/fenv.c 0x00000000 Number 0 _rserrno.o ABSOLUTE + ../clib/heapalloc.c 0x00000000 Number 0 hrguard.o ABSOLUTE + ../clib/heapaux.c 0x00000000 Number 0 heapauxi.o ABSOLUTE + ../clib/libinit.s 0x00000000 Number 0 libinit.o ABSOLUTE + ../clib/libinit.s 0x00000000 Number 0 libinit2.o ABSOLUTE + ../clib/libinit.s 0x00000000 Number 0 libshutdown.o ABSOLUTE + ../clib/libinit.s 0x00000000 Number 0 libshutdown2.o ABSOLUTE + ../clib/longlong.s 0x00000000 Number 0 lludivv7m.o ABSOLUTE + ../clib/memcpset.s 0x00000000 Number 0 rt_memcpy_v6.o ABSOLUTE + ../clib/memcpset.s 0x00000000 Number 0 aeabi_memset.o ABSOLUTE + ../clib/memcpset.s 0x00000000 Number 0 aeabi_memset4.o ABSOLUTE + ../clib/memcpset.s 0x00000000 Number 0 rt_memclr.o ABSOLUTE + ../clib/memcpset.s 0x00000000 Number 0 rt_memclr_w.o ABSOLUTE + ../clib/memcpset.s 0x00000000 Number 0 rt_memcpy_w.o ABSOLUTE + ../clib/signal.c 0x00000000 Number 0 defsig_fpe_outer.o ABSOLUTE + ../clib/signal.c 0x00000000 Number 0 defsig_fpe_formal.o ABSOLUTE + ../clib/signal.c 0x00000000 Number 0 defsig_exit.o ABSOLUTE + ../clib/signal.c 0x00000000 Number 0 defsig_fpe_inner.o ABSOLUTE + ../clib/signal.c 0x00000000 Number 0 __raise.o ABSOLUTE + ../clib/signal.c 0x00000000 Number 0 defsig_general.o ABSOLUTE + ../clib/signal.c 0x00000000 Number 0 defsig_abrt_inner.o ABSOLUTE + ../clib/signal.c 0x00000000 Number 0 defsig_rtred_inner.o ABSOLUTE + ../clib/signal.c 0x00000000 Number 0 defsig_rtmem_inner.o ABSOLUTE + ../clib/signal.c 0x00000000 Number 0 defsig_rtmem_outer.o ABSOLUTE + ../clib/signal.c 0x00000000 Number 0 defsig_rtmem_formal.o ABSOLUTE + ../clib/signal.c 0x00000000 Number 0 defsig_stak_inner.o ABSOLUTE + ../clib/signal.c 0x00000000 Number 0 defsig_pvfn_inner.o ABSOLUTE + ../clib/signal.c 0x00000000 Number 0 defsig_cppl_inner.o ABSOLUTE + ../clib/signal.c 0x00000000 Number 0 defsig_segv_inner.o ABSOLUTE + ../clib/signal.c 0x00000000 Number 0 defsig_other.o ABSOLUTE + ../clib/signal.s 0x00000000 Number 0 defsig.o ABSOLUTE + ../clib/stdlib.c 0x00000000 Number 0 exit.o ABSOLUTE + ../fplib/basic.s 0x00000000 Number 0 basic.o ABSOLUTE + ../fplib/d2f.s 0x00000000 Number 0 d2f.o ABSOLUTE + ../fplib/daddsub.s 0x00000000 Number 0 daddsub_clz.o ABSOLUTE + ../fplib/dcheck1.s 0x00000000 Number 0 dcheck1.o ABSOLUTE + ../fplib/dcmpi.s 0x00000000 Number 0 dcmpi.o ABSOLUTE + ../fplib/ddiv.s 0x00000000 Number 0 ddiv.o ABSOLUTE + ../fplib/deqf.s 0x00000000 Number 0 deqf.o ABSOLUTE + ../fplib/dfix.s 0x00000000 Number 0 dfix.o ABSOLUTE + ../fplib/dfixu.s 0x00000000 Number 0 dfixu.o ABSOLUTE + ../fplib/dflt.s 0x00000000 Number 0 dflt_clz.o ABSOLUTE + ../fplib/dleqf.s 0x00000000 Number 0 dleqf.o ABSOLUTE + ../fplib/dmul.s 0x00000000 Number 0 dmul.o ABSOLUTE + ../fplib/dnaninf.s 0x00000000 Number 0 dnaninf.o ABSOLUTE + ../fplib/dretinf.s 0x00000000 Number 0 dretinf.o ABSOLUTE + ../fplib/drleqf.s 0x00000000 Number 0 drleqf.o ABSOLUTE + ../fplib/dsqrt.s 0x00000000 Number 0 dsqrt_umaal.o ABSOLUTE + ../fplib/f2d.s 0x00000000 Number 0 f2d.o ABSOLUTE + ../fplib/fnaninf.s 0x00000000 Number 0 fnaninf.o ABSOLUTE + ../fplib/fpinit.s 0x00000000 Number 0 fpinit.o ABSOLUTE + ../fplib/fretinf.s 0x00000000 Number 0 fretinf.o ABSOLUTE + ../fplib/retnan.s 0x00000000 Number 0 retnan.o ABSOLUTE + ../fplib/scalbn.s 0x00000000 Number 0 scalbn.o ABSOLUTE + ../fplib/trapv.s 0x00000000 Number 0 trapv.o ABSOLUTE + ../fplib/usenofp.s 0x00000000 Number 0 usenofp.o ABSOLUTE + ../mathlib/asinf.c 0x00000000 Number 0 asinf.o ABSOLUTE + ../mathlib/atan.c 0x00000000 Number 0 atan.o ABSOLUTE + ../mathlib/atan2.c 0x00000000 Number 0 atan2.o ABSOLUTE + ../mathlib/atan2f.c 0x00000000 Number 0 atan2f.o ABSOLUTE + ../mathlib/cosf.c 0x00000000 Number 0 cosf.o ABSOLUTE + ../mathlib/dunder.c 0x00000000 Number 0 dunder.o ABSOLUTE + ../mathlib/fabs.c 0x00000000 Number 0 fabs.o ABSOLUTE + ../mathlib/fpclassify.c 0x00000000 Number 0 fpclassify.o ABSOLUTE + ../mathlib/fpclassifyf.c 0x00000000 Number 0 fpclassifyf.o ABSOLUTE + ../mathlib/funder.c 0x00000000 Number 0 funder.o ABSOLUTE + ../mathlib/poly.c 0x00000000 Number 0 poly.o ABSOLUTE + ../mathlib/pow.c 0x00000000 Number 0 pow.o ABSOLUTE + ../mathlib/qnan.c 0x00000000 Number 0 qnan.o ABSOLUTE + ../mathlib/rredf.c 0x00000000 Number 0 rredf.o ABSOLUTE + ../mathlib/sqrt.c 0x00000000 Number 0 sqrt.o ABSOLUTE + ../mathlib/sqrtf.c 0x00000000 Number 0 sqrtf.o ABSOLUTE + ../mathlib/tanf.c 0x00000000 Number 0 tanf.o ABSOLUTE + SPL06.c 0x00000000 Number 0 spl06.o ABSOLUTE + ahrs.c 0x00000000 Number 0 ahrs.o ABSOLUTE + atti_esti.c 0x00000000 Number 0 atti_esti.o ABSOLUTE + bmi088.c 0x00000000 Number 0 bmi088.o ABSOLUTE + buzzer_pwm.c 0x00000000 Number 0 buzzer_pwm.o ABSOLUTE + cmsis_os2.c 0x00000000 Number 0 cmsis_os2.o ABSOLUTE + config.c 0x00000000 Number 0 config.o ABSOLUTE + croutine.c 0x00000000 Number 0 croutine.o ABSOLUTE + dc.s 0x00000000 Number 0 dc.o ABSOLUTE + delay.c 0x00000000 Number 0 delay.o ABSOLUTE + dma.c 0x00000000 Number 0 dma.o ABSOLUTE + dwt.c 0x00000000 Number 0 dwt.o ABSOLUTE + easy_control.c 0x00000000 Number 0 easy_control.o ABSOLUTE + event_groups.c 0x00000000 Number 0 event_groups.o ABSOLUTE + filter.c 0x00000000 Number 0 filter.o ABSOLUTE + fixed_height.c 0x00000000 Number 0 fixed_height.o ABSOLUTE + freertos.c 0x00000000 Number 0 freertos.o ABSOLUTE + gpio.c 0x00000000 Number 0 gpio.o ABSOLUTE + gpio.c 0x00000000 Number 0 gpio_1.o ABSOLUTE + heap_4.c 0x00000000 Number 0 heap_4.o ABSOLUTE + height_cal.c 0x00000000 Number 0 height_cal.o ABSOLUTE + i2c.c 0x00000000 Number 0 i2c.o ABSOLUTE + i2c.c 0x00000000 Number 0 i2c_1.o ABSOLUTE + init.c 0x00000000 Number 0 init.o ABSOLUTE + ist8310.c 0x00000000 Number 0 ist8310.o ABSOLUTE + led_pwm.c 0x00000000 Number 0 led_pwm.o ABSOLUTE + list.c 0x00000000 Number 0 list.o ABSOLUTE + main.c 0x00000000 Number 0 main.o ABSOLUTE + main_control.c 0x00000000 Number 0 main_control.o ABSOLUTE + pid.c 0x00000000 Number 0 pid.o ABSOLUTE + port.c 0x00000000 Number 0 port.o ABSOLUTE + ps2.c 0x00000000 Number 0 ps2.o ABSOLUTE + ps2.c 0x00000000 Number 0 ps2_1.o ABSOLUTE + pwm.c 0x00000000 Number 0 pwm.o ABSOLUTE + queue.c 0x00000000 Number 0 queue.o ABSOLUTE + spi.c 0x00000000 Number 0 spi.o ABSOLUTE + spi.c 0x00000000 Number 0 spi_1.o ABSOLUTE + startup_stm32f407xx.s 0x00000000 Number 0 startup_stm32f407xx.o ABSOLUTE + stm32f4xx_hal.c 0x00000000 Number 0 stm32f4xx_hal.o ABSOLUTE + stm32f4xx_hal_cortex.c 0x00000000 Number 0 stm32f4xx_hal_cortex.o ABSOLUTE + stm32f4xx_hal_dma.c 0x00000000 Number 0 stm32f4xx_hal_dma.o ABSOLUTE + stm32f4xx_hal_dma_ex.c 0x00000000 Number 0 stm32f4xx_hal_dma_ex.o ABSOLUTE + stm32f4xx_hal_exti.c 0x00000000 Number 0 stm32f4xx_hal_exti.o ABSOLUTE + stm32f4xx_hal_flash.c 0x00000000 Number 0 stm32f4xx_hal_flash.o ABSOLUTE + stm32f4xx_hal_flash_ex.c 0x00000000 Number 0 stm32f4xx_hal_flash_ex.o ABSOLUTE + stm32f4xx_hal_flash_ramfunc.c 0x00000000 Number 0 stm32f4xx_hal_flash_ramfunc.o ABSOLUTE + stm32f4xx_hal_gpio.c 0x00000000 Number 0 stm32f4xx_hal_gpio.o ABSOLUTE + stm32f4xx_hal_i2c.c 0x00000000 Number 0 stm32f4xx_hal_i2c.o ABSOLUTE + stm32f4xx_hal_i2c_ex.c 0x00000000 Number 0 stm32f4xx_hal_i2c_ex.o ABSOLUTE + stm32f4xx_hal_msp.c 0x00000000 Number 0 stm32f4xx_hal_msp.o ABSOLUTE + stm32f4xx_hal_pwr.c 0x00000000 Number 0 stm32f4xx_hal_pwr.o ABSOLUTE + stm32f4xx_hal_pwr_ex.c 0x00000000 Number 0 stm32f4xx_hal_pwr_ex.o ABSOLUTE + stm32f4xx_hal_rcc.c 0x00000000 Number 0 stm32f4xx_hal_rcc.o ABSOLUTE + stm32f4xx_hal_rcc_ex.c 0x00000000 Number 0 stm32f4xx_hal_rcc_ex.o ABSOLUTE + stm32f4xx_hal_spi.c 0x00000000 Number 0 stm32f4xx_hal_spi.o ABSOLUTE + stm32f4xx_hal_tim.c 0x00000000 Number 0 stm32f4xx_hal_tim.o ABSOLUTE + stm32f4xx_hal_tim_ex.c 0x00000000 Number 0 stm32f4xx_hal_tim_ex.o ABSOLUTE + stm32f4xx_hal_uart.c 0x00000000 Number 0 stm32f4xx_hal_uart.o ABSOLUTE + stm32f4xx_it.c 0x00000000 Number 0 stm32f4xx_it.o ABSOLUTE + stream_buffer.c 0x00000000 Number 0 stream_buffer.o ABSOLUTE + system_stm32f4xx.c 0x00000000 Number 0 system_stm32f4xx.o ABSOLUTE + tasks.c 0x00000000 Number 0 tasks.o ABSOLUTE + test1.c 0x00000000 Number 0 test1.o ABSOLUTE + tim.c 0x00000000 Number 0 tim.o ABSOLUTE + time.c 0x00000000 Number 0 time.o ABSOLUTE + timers.c 0x00000000 Number 0 timers.o ABSOLUTE + uart.c 0x00000000 Number 0 uart.o ABSOLUTE + usart.c 0x00000000 Number 0 usart.o ABSOLUTE + user_math.c 0x00000000 Number 0 user_math.o ABSOLUTE + user_task.c 0x00000000 Number 0 user_task.o ABSOLUTE + RESET 0x08000000 Section 392 startup_stm32f407xx.o(RESET) + !!!main 0x08000188 Section 8 __main.o(!!!main) + !!!scatter 0x08000190 Section 52 __scatter.o(!!!scatter) + !!handler_copy 0x080001c4 Section 26 __scatter_copy.o(!!handler_copy) + !!handler_zi 0x080001e0 Section 28 __scatter_zi.o(!!handler_zi) + .ARM.Collect$$libinit$$00000000 0x080001fc Section 2 libinit.o(.ARM.Collect$$libinit$$00000000) + .ARM.Collect$$libinit$$00000001 0x080001fe Section 4 libinit2.o(.ARM.Collect$$libinit$$00000001) + .ARM.Collect$$libinit$$00000004 0x08000202 Section 0 libinit2.o(.ARM.Collect$$libinit$$00000004) + .ARM.Collect$$libinit$$0000000A 0x08000202 Section 0 libinit2.o(.ARM.Collect$$libinit$$0000000A) + .ARM.Collect$$libinit$$0000000C 0x08000202 Section 0 libinit2.o(.ARM.Collect$$libinit$$0000000C) + .ARM.Collect$$libinit$$0000000E 0x08000202 Section 0 libinit2.o(.ARM.Collect$$libinit$$0000000E) + .ARM.Collect$$libinit$$00000011 0x08000202 Section 0 libinit2.o(.ARM.Collect$$libinit$$00000011) + .ARM.Collect$$libinit$$00000013 0x08000202 Section 0 libinit2.o(.ARM.Collect$$libinit$$00000013) + .ARM.Collect$$libinit$$00000015 0x08000202 Section 0 libinit2.o(.ARM.Collect$$libinit$$00000015) + .ARM.Collect$$libinit$$00000017 0x08000202 Section 0 libinit2.o(.ARM.Collect$$libinit$$00000017) + .ARM.Collect$$libinit$$00000019 0x08000202 Section 0 libinit2.o(.ARM.Collect$$libinit$$00000019) + .ARM.Collect$$libinit$$0000001B 0x08000202 Section 0 libinit2.o(.ARM.Collect$$libinit$$0000001B) + .ARM.Collect$$libinit$$0000001D 0x08000202 Section 0 libinit2.o(.ARM.Collect$$libinit$$0000001D) + .ARM.Collect$$libinit$$0000001F 0x08000202 Section 0 libinit2.o(.ARM.Collect$$libinit$$0000001F) + .ARM.Collect$$libinit$$00000021 0x08000202 Section 0 libinit2.o(.ARM.Collect$$libinit$$00000021) + .ARM.Collect$$libinit$$00000023 0x08000202 Section 0 libinit2.o(.ARM.Collect$$libinit$$00000023) + .ARM.Collect$$libinit$$00000025 0x08000202 Section 0 libinit2.o(.ARM.Collect$$libinit$$00000025) + .ARM.Collect$$libinit$$0000002C 0x08000202 Section 0 libinit2.o(.ARM.Collect$$libinit$$0000002C) + .ARM.Collect$$libinit$$0000002E 0x08000202 Section 0 libinit2.o(.ARM.Collect$$libinit$$0000002E) + .ARM.Collect$$libinit$$00000030 0x08000202 Section 0 libinit2.o(.ARM.Collect$$libinit$$00000030) + .ARM.Collect$$libinit$$00000032 0x08000202 Section 0 libinit2.o(.ARM.Collect$$libinit$$00000032) + .ARM.Collect$$libinit$$00000033 0x08000202 Section 2 libinit2.o(.ARM.Collect$$libinit$$00000033) + .ARM.Collect$$libshutdown$$00000000 0x08000204 Section 2 libshutdown.o(.ARM.Collect$$libshutdown$$00000000) + .ARM.Collect$$libshutdown$$00000002 0x08000206 Section 0 libshutdown2.o(.ARM.Collect$$libshutdown$$00000002) + .ARM.Collect$$libshutdown$$00000004 0x08000206 Section 0 libshutdown2.o(.ARM.Collect$$libshutdown$$00000004) + .ARM.Collect$$libshutdown$$00000007 0x08000206 Section 0 libshutdown2.o(.ARM.Collect$$libshutdown$$00000007) + .ARM.Collect$$libshutdown$$0000000A 0x08000206 Section 0 libshutdown2.o(.ARM.Collect$$libshutdown$$0000000A) + .ARM.Collect$$libshutdown$$0000000C 0x08000206 Section 0 libshutdown2.o(.ARM.Collect$$libshutdown$$0000000C) + .ARM.Collect$$libshutdown$$0000000F 0x08000206 Section 0 libshutdown2.o(.ARM.Collect$$libshutdown$$0000000F) + .ARM.Collect$$libshutdown$$00000010 0x08000206 Section 2 libshutdown2.o(.ARM.Collect$$libshutdown$$00000010) + .ARM.Collect$$rtentry$$00000000 0x08000208 Section 0 __rtentry.o(.ARM.Collect$$rtentry$$00000000) + .ARM.Collect$$rtentry$$00000002 0x08000208 Section 0 __rtentry2.o(.ARM.Collect$$rtentry$$00000002) + .ARM.Collect$$rtentry$$00000004 0x08000208 Section 6 __rtentry4.o(.ARM.Collect$$rtentry$$00000004) + .ARM.Collect$$rtentry$$00000009 0x0800020e Section 0 __rtentry2.o(.ARM.Collect$$rtentry$$00000009) + .ARM.Collect$$rtentry$$0000000A 0x0800020e Section 4 __rtentry2.o(.ARM.Collect$$rtentry$$0000000A) + .ARM.Collect$$rtentry$$0000000C 0x08000212 Section 0 __rtentry2.o(.ARM.Collect$$rtentry$$0000000C) + .ARM.Collect$$rtentry$$0000000D 0x08000212 Section 8 __rtentry2.o(.ARM.Collect$$rtentry$$0000000D) + .ARM.Collect$$rtexit$$00000000 0x0800021a Section 2 rtexit.o(.ARM.Collect$$rtexit$$00000000) + .ARM.Collect$$rtexit$$00000002 0x0800021c Section 0 rtexit2.o(.ARM.Collect$$rtexit$$00000002) + .ARM.Collect$$rtexit$$00000003 0x0800021c Section 4 rtexit2.o(.ARM.Collect$$rtexit$$00000003) + .ARM.Collect$$rtexit$$00000004 0x08000220 Section 6 rtexit2.o(.ARM.Collect$$rtexit$$00000004) + $v0 0x08000228 Number 0 startup_stm32f407xx.o(.text) + .text 0x08000228 Section 64 startup_stm32f407xx.o(.text) + .text 0x08000268 Section 240 lludivv7m.o(.text) + .text 0x08000358 Section 138 rt_memcpy_v6.o(.text) + .text 0x080003e2 Section 16 aeabi_memset4.o(.text) + .text 0x080003f2 Section 78 rt_memclr_w.o(.text) + .text 0x08000440 Section 0 heapauxi.o(.text) + .text 0x08000446 Section 100 rt_memcpy_w.o(.text) + .text 0x080004ac Section 8 libspace.o(.text) + .text 0x080004b4 Section 74 sys_stackheap_outer.o(.text) + .text 0x080004fe Section 0 exit.o(.text) + .text 0x08000510 Section 0 sys_exit.o(.text) + .text 0x0800051c Section 2 use_no_semi.o(.text) + .text 0x0800051e Section 0 indicate_semi.o(.text) + [Anonymous Symbol] 0x08000520 Section 0 stm32f4xx_it.o(.text.BusFault_Handler) + [Anonymous Symbol] 0x08000524 Section 0 stm32f4xx_it.o(.text.DMA1_Stream2_IRQHandler) + [Anonymous Symbol] 0x08000534 Section 0 stm32f4xx_it.o(.text.DMA2_Stream1_IRQHandler) + [Anonymous Symbol] 0x08000544 Section 0 stm32f4xx_it.o(.text.DMA2_Stream2_IRQHandler) + [Anonymous Symbol] 0x08000554 Section 0 stm32f4xx_it.o(.text.DMA2_Stream3_IRQHandler) + DMA_CalcBaseAndBitshift 0x08000565 Thumb Code 52 stm32f4xx_hal_dma.o(.text.DMA_CalcBaseAndBitshift) + [Anonymous Symbol] 0x08000564 Section 0 stm32f4xx_hal_dma.o(.text.DMA_CalcBaseAndBitshift) + DMA_CalcBaseAndBitshift.flagBitshiftOffset 0x08000598 Number 0 stm32f4xx_hal_dma.o(.text.DMA_CalcBaseAndBitshift) + DMA_CheckFifoParam 0x080005a1 Thumb Code 80 stm32f4xx_hal_dma.o(.text.DMA_CheckFifoParam) + [Anonymous Symbol] 0x080005a0 Section 0 stm32f4xx_hal_dma.o(.text.DMA_CheckFifoParam) + [Anonymous Symbol] 0x080005f0 Section 0 stm32f4xx_it.o(.text.DebugMon_Handler) + [Anonymous Symbol] 0x080005f4 Section 0 stm32f4xx_it.o(.text.EXTI3_IRQHandler) + [Anonymous Symbol] 0x08000600 Section 0 stm32f4xx_it.o(.text.EXTI4_IRQHandler) + [Anonymous Symbol] 0x0800060c Section 0 stm32f4xx_it.o(.text.EXTI9_5_IRQHandler) + [Anonymous Symbol] 0x08000618 Section 0 main.o(.text.Error_Handler) + [Anonymous Symbol] 0x08000620 Section 0 stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort) + [Anonymous Symbol] 0x080006a0 Section 0 stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) + [Anonymous Symbol] 0x080006c4 Section 0 stm32f4xx_hal_dma.o(.text.HAL_DMA_IRQHandler) + [Anonymous Symbol] 0x08000850 Section 0 stm32f4xx_hal_dma.o(.text.HAL_DMA_Init) + [Anonymous Symbol] 0x08000920 Section 0 gpio_1.o(.text.HAL_GPIO_EXTI_Callback) + [Anonymous Symbol] 0x0800094c Section 0 stm32f4xx_hal_gpio.o(.text.HAL_GPIO_EXTI_IRQHandler) + [Anonymous Symbol] 0x08000968 Section 0 stm32f4xx_hal_gpio.o(.text.HAL_GPIO_Init) + [Anonymous Symbol] 0x08000b04 Section 0 stm32f4xx_hal_gpio.o(.text.HAL_GPIO_WritePin) + [Anonymous Symbol] 0x08000b10 Section 0 stm32f4xx_hal.o(.text.HAL_GetTick) + [Anonymous Symbol] 0x08000b1c Section 0 stm32f4xx_hal_i2c.o(.text.HAL_I2C_Init) + [Anonymous Symbol] 0x08000cb4 Section 0 i2c.o(.text.HAL_I2C_MspInit) + [Anonymous Symbol] 0x08000e0c Section 0 stm32f4xx_hal.o(.text.HAL_IncTick) + [Anonymous Symbol] 0x08000e28 Section 0 stm32f4xx_hal.o(.text.HAL_Init) + [Anonymous Symbol] 0x08000e60 Section 0 stm32f4xx_hal.o(.text.HAL_InitTick) + [Anonymous Symbol] 0x08000eb0 Section 0 stm32f4xx_hal_msp.o(.text.HAL_MspInit) + [Anonymous Symbol] 0x08000ef8 Section 0 stm32f4xx_hal_cortex.o(.text.HAL_NVIC_EnableIRQ) + [Anonymous Symbol] 0x08000f00 Section 0 stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SetPriority) + [Anonymous Symbol] 0x08000f20 Section 0 stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SetPriorityGrouping) + [Anonymous Symbol] 0x08000f28 Section 0 stm32f4xx_hal_rcc.o(.text.HAL_RCC_ClockConfig) + [Anonymous Symbol] 0x08001088 Section 0 stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetHCLKFreq) + [Anonymous Symbol] 0x08001094 Section 0 stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetPCLK1Freq) + [Anonymous Symbol] 0x080010b8 Section 0 stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetPCLK2Freq) + [Anonymous Symbol] 0x080010dc Section 0 stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetSysClockFreq) + [Anonymous Symbol] 0x08001144 Section 0 stm32f4xx_hal_rcc.o(.text.HAL_RCC_OscConfig) + [Anonymous Symbol] 0x0800148c Section 0 stm32f4xx_hal_spi.o(.text.HAL_SPI_Init) + [Anonymous Symbol] 0x08001540 Section 0 spi.o(.text.HAL_SPI_MspInit) + [Anonymous Symbol] 0x08001670 Section 0 stm32f4xx_hal_cortex.o(.text.HAL_SYSTICK_Config) + [Anonymous Symbol] 0x08001678 Section 0 stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_ConfigBreakDeadTime) + [Anonymous Symbol] 0x080016c4 Section 0 stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_MasterConfigSynchronization) + [Anonymous Symbol] 0x0800177c Section 0 stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Init) + [Anonymous Symbol] 0x080017d8 Section 0 tim.o(.text.HAL_TIM_Base_MspInit) + [Anonymous Symbol] 0x08001810 Section 0 tim.o(.text.HAL_TIM_MspPostInit) + [Anonymous Symbol] 0x08001954 Section 0 stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_ConfigChannel) + [Anonymous Symbol] 0x080019ec Section 0 stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Init) + [Anonymous Symbol] 0x08001a48 Section 0 tim.o(.text.HAL_TIM_PWM_MspInit) + [Anonymous Symbol] 0x08001ad4 Section 0 stm32f4xx_hal_uart.o(.text.HAL_UARTEx_RxEventCallback) + [Anonymous Symbol] 0x08001ad8 Section 0 uart.o(.text.HAL_UART_ErrorCallback) + [Anonymous Symbol] 0x08001b00 Section 0 stm32f4xx_hal_uart.o(.text.HAL_UART_IRQHandler) + [Anonymous Symbol] 0x08001d5c Section 0 stm32f4xx_hal_uart.o(.text.HAL_UART_Init) + [Anonymous Symbol] 0x08001dbc Section 0 usart.o(.text.HAL_UART_MspInit) + [Anonymous Symbol] 0x08001e80 Section 0 uart.o(.text.HAL_UART_RxCpltCallback) + [Anonymous Symbol] 0x08001ea8 Section 0 uart.o(.text.HAL_UART_TxCpltCallback) + [Anonymous Symbol] 0x08001ed0 Section 0 stm32f4xx_it.o(.text.HardFault_Handler) + [Anonymous Symbol] 0x08001ed4 Section 0 dma.o(.text.MX_DMA_Init) + [Anonymous Symbol] 0x08001f50 Section 0 freertos.o(.text.MX_FREERTOS_Init) + [Anonymous Symbol] 0x08001f74 Section 0 gpio.o(.text.MX_GPIO_Init) + [Anonymous Symbol] 0x08002130 Section 0 i2c.o(.text.MX_I2C2_Init) + [Anonymous Symbol] 0x08002170 Section 0 i2c.o(.text.MX_I2C3_Init) + [Anonymous Symbol] 0x080021b0 Section 0 spi.o(.text.MX_SPI1_Init) + [Anonymous Symbol] 0x08002200 Section 0 tim.o(.text.MX_TIM10_Init) + [Anonymous Symbol] 0x08002288 Section 0 tim.o(.text.MX_TIM1_Init) + [Anonymous Symbol] 0x080023a4 Section 0 tim.o(.text.MX_TIM4_Init) + [Anonymous Symbol] 0x08002438 Section 0 tim.o(.text.MX_TIM5_Init) + [Anonymous Symbol] 0x080024fc Section 0 usart.o(.text.MX_USART6_UART_Init) + [Anonymous Symbol] 0x08002534 Section 0 stm32f4xx_it.o(.text.MemManage_Handler) + [Anonymous Symbol] 0x08002538 Section 0 stm32f4xx_it.o(.text.NMI_Handler) + NVIC_EncodePriority 0x0800253d Thumb Code 44 stm32f4xx_hal_cortex.o(.text.NVIC_EncodePriority) + [Anonymous Symbol] 0x0800253c Section 0 stm32f4xx_hal_cortex.o(.text.NVIC_EncodePriority) + [Anonymous Symbol] 0x08002570 Section 0 port.o(.text.PendSV_Handler) + pxCurrentTCBConst 0x080025d0 Number 0 port.o(.text.PendSV_Handler) + [Anonymous Symbol] 0x080025e0 Section 0 port.o(.text.SVC_Handler) + pxCurrentTCBConst2 0x08002600 Number 0 port.o(.text.SVC_Handler) + SVC_Setup 0x08002605 Thumb Code 8 cmsis_os2.o(.text.SVC_Setup) + [Anonymous Symbol] 0x08002604 Section 0 cmsis_os2.o(.text.SVC_Setup) + [Anonymous Symbol] 0x0800260c Section 0 freertos.o(.text.StartDefaultTask) + SysTick_Config 0x08002615 Thumb Code 46 stm32f4xx_hal_cortex.o(.text.SysTick_Config) + [Anonymous Symbol] 0x08002614 Section 0 stm32f4xx_hal_cortex.o(.text.SysTick_Config) + [Anonymous Symbol] 0x08002644 Section 0 stm32f4xx_it.o(.text.SysTick_Handler) + [Anonymous Symbol] 0x08002658 Section 0 main.o(.text.SystemClock_Config) + [Anonymous Symbol] 0x080026fc Section 0 system_stm32f4xx.o(.text.SystemInit) + [Anonymous Symbol] 0x08002710 Section 0 stm32f4xx_hal_tim.o(.text.TIM_Base_SetConfig) + TIM_OC1_SetConfig 0x0800283d Thumb Code 100 stm32f4xx_hal_tim.o(.text.TIM_OC1_SetConfig) + [Anonymous Symbol] 0x0800283c Section 0 stm32f4xx_hal_tim.o(.text.TIM_OC1_SetConfig) + [Anonymous Symbol] 0x080028a0 Section 0 stm32f4xx_hal_tim.o(.text.TIM_OC2_SetConfig) + TIM_OC3_SetConfig 0x0800290d Thumb Code 104 stm32f4xx_hal_tim.o(.text.TIM_OC3_SetConfig) + [Anonymous Symbol] 0x0800290c Section 0 stm32f4xx_hal_tim.o(.text.TIM_OC3_SetConfig) + TIM_OC4_SetConfig 0x08002975 Thumb Code 78 stm32f4xx_hal_tim.o(.text.TIM_OC4_SetConfig) + [Anonymous Symbol] 0x08002974 Section 0 stm32f4xx_hal_tim.o(.text.TIM_OC4_SetConfig) + UART_DMAAbortOnError 0x080029c5 Thumb Code 14 stm32f4xx_hal_uart.o(.text.UART_DMAAbortOnError) + [Anonymous Symbol] 0x080029c4 Section 0 stm32f4xx_hal_uart.o(.text.UART_DMAAbortOnError) + UART_EndRxTransfer 0x080029d5 Thumb Code 80 stm32f4xx_hal_uart.o(.text.UART_EndRxTransfer) + [Anonymous Symbol] 0x080029d4 Section 0 stm32f4xx_hal_uart.o(.text.UART_EndRxTransfer) + UART_EndTransmit_IT 0x08002a25 Thumb Code 24 stm32f4xx_hal_uart.o(.text.UART_EndTransmit_IT) + [Anonymous Symbol] 0x08002a24 Section 0 stm32f4xx_hal_uart.o(.text.UART_EndTransmit_IT) + UART_Get 0x08002a3d Thumb Code 20 uart.o(.text.UART_Get) + [Anonymous Symbol] 0x08002a3c Section 0 uart.o(.text.UART_Get) + UART_Receive_IT 0x08002a51 Thumb Code 200 stm32f4xx_hal_uart.o(.text.UART_Receive_IT) + [Anonymous Symbol] 0x08002a50 Section 0 stm32f4xx_hal_uart.o(.text.UART_Receive_IT) + UART_SetConfig 0x08002b19 Thumb Code 220 stm32f4xx_hal_uart.o(.text.UART_SetConfig) + [Anonymous Symbol] 0x08002b18 Section 0 stm32f4xx_hal_uart.o(.text.UART_SetConfig) + UART_Transmit_IT 0x08002bf5 Thumb Code 82 stm32f4xx_hal_uart.o(.text.UART_Transmit_IT) + [Anonymous Symbol] 0x08002bf4 Section 0 stm32f4xx_hal_uart.o(.text.UART_Transmit_IT) + [Anonymous Symbol] 0x08002c48 Section 0 stm32f4xx_it.o(.text.USART6_IRQHandler) + [Anonymous Symbol] 0x08002c58 Section 0 stm32f4xx_it.o(.text.UsageFault_Handler) + __NVIC_EnableIRQ 0x08002c5d Thumb Code 32 stm32f4xx_hal_cortex.o(.text.__NVIC_EnableIRQ) + [Anonymous Symbol] 0x08002c5c Section 0 stm32f4xx_hal_cortex.o(.text.__NVIC_EnableIRQ) + __NVIC_GetPriorityGrouping 0x08002c7d Thumb Code 16 stm32f4xx_hal_cortex.o(.text.__NVIC_GetPriorityGrouping) + [Anonymous Symbol] 0x08002c7c Section 0 stm32f4xx_hal_cortex.o(.text.__NVIC_GetPriorityGrouping) + __NVIC_SetPriority 0x08002c8d Thumb Code 34 stm32f4xx_hal_cortex.o(.text.__NVIC_SetPriority) + [Anonymous Symbol] 0x08002c8c Section 0 stm32f4xx_hal_cortex.o(.text.__NVIC_SetPriority) + __NVIC_SetPriority 0x08002cb1 Thumb Code 14 cmsis_os2.o(.text.__NVIC_SetPriority) + [Anonymous Symbol] 0x08002cb0 Section 0 cmsis_os2.o(.text.__NVIC_SetPriority) + __NVIC_SetPriorityGrouping 0x08002cc1 Thumb Code 32 stm32f4xx_hal_cortex.o(.text.__NVIC_SetPriorityGrouping) + [Anonymous Symbol] 0x08002cc0 Section 0 stm32f4xx_hal_cortex.o(.text.__NVIC_SetPriorityGrouping) + [Anonymous Symbol] 0x08002ce0 Section 0 main.o(.text.main) + [Anonymous Symbol] 0x08002d20 Section 0 cmsis_os2.o(.text.osDelay) + [Anonymous Symbol] 0x08002d40 Section 0 cmsis_os2.o(.text.osKernelInitialize) + [Anonymous Symbol] 0x08002d68 Section 0 cmsis_os2.o(.text.osKernelStart) + [Anonymous Symbol] 0x08002d9c Section 0 cmsis_os2.o(.text.osThreadNew) + prvAddCurrentTaskToDelayedList 0x08002e51 Thumb Code 128 tasks.o(.text.prvAddCurrentTaskToDelayedList) + [Anonymous Symbol] 0x08002e50 Section 0 tasks.o(.text.prvAddCurrentTaskToDelayedList) + prvAddNewTaskToReadyList 0x08002ed1 Thumb Code 172 tasks.o(.text.prvAddNewTaskToReadyList) + [Anonymous Symbol] 0x08002ed0 Section 0 tasks.o(.text.prvAddNewTaskToReadyList) + prvCheckForValidListAndQueue 0x08002f7d Thumb Code 116 timers.o(.text.prvCheckForValidListAndQueue) + [Anonymous Symbol] 0x08002f7c Section 0 timers.o(.text.prvCheckForValidListAndQueue) + prvCheckTasksWaitingTermination 0x08002ff9 Thumb Code 78 tasks.o(.text.prvCheckTasksWaitingTermination) + [Anonymous Symbol] 0x08002ff8 Section 0 tasks.o(.text.prvCheckTasksWaitingTermination) + prvCopyDataFromQueue 0x08003049 Thumb Code 38 queue.o(.text.prvCopyDataFromQueue) + [Anonymous Symbol] 0x08003048 Section 0 queue.o(.text.prvCopyDataFromQueue) + prvCopyDataToQueue 0x08003071 Thumb Code 122 queue.o(.text.prvCopyDataToQueue) + [Anonymous Symbol] 0x08003070 Section 0 queue.o(.text.prvCopyDataToQueue) + prvDeleteTCB 0x080030ed Thumb Code 54 tasks.o(.text.prvDeleteTCB) + [Anonymous Symbol] 0x080030ec Section 0 tasks.o(.text.prvDeleteTCB) + prvGetNextExpireTime 0x08003125 Thumb Code 32 timers.o(.text.prvGetNextExpireTime) + [Anonymous Symbol] 0x08003124 Section 0 timers.o(.text.prvGetNextExpireTime) + prvHeapInit 0x08003145 Thumb Code 118 heap_4.o(.text.prvHeapInit) + [Anonymous Symbol] 0x08003144 Section 0 heap_4.o(.text.prvHeapInit) + prvIdleTask 0x080031bd Thumb Code 42 tasks.o(.text.prvIdleTask) + [Anonymous Symbol] 0x080031bc Section 0 tasks.o(.text.prvIdleTask) + prvInitialiseNewQueue 0x080031e9 Thumb Code 32 queue.o(.text.prvInitialiseNewQueue) + [Anonymous Symbol] 0x080031e8 Section 0 queue.o(.text.prvInitialiseNewQueue) + prvInitialiseNewTask 0x08003209 Thumb Code 152 tasks.o(.text.prvInitialiseNewTask) + [Anonymous Symbol] 0x08003208 Section 0 tasks.o(.text.prvInitialiseNewTask) + prvInitialiseTaskLists 0x080032a1 Thumb Code 112 tasks.o(.text.prvInitialiseTaskLists) + [Anonymous Symbol] 0x080032a0 Section 0 tasks.o(.text.prvInitialiseTaskLists) + prvInsertBlockIntoFreeList 0x08003311 Thumb Code 90 heap_4.o(.text.prvInsertBlockIntoFreeList) + [Anonymous Symbol] 0x08003310 Section 0 heap_4.o(.text.prvInsertBlockIntoFreeList) + prvInsertTimerInActiveList 0x0800336d Thumb Code 64 timers.o(.text.prvInsertTimerInActiveList) + [Anonymous Symbol] 0x0800336c Section 0 timers.o(.text.prvInsertTimerInActiveList) + prvIsQueueEmpty 0x080033ad Thumb Code 24 queue.o(.text.prvIsQueueEmpty) + [Anonymous Symbol] 0x080033ac Section 0 queue.o(.text.prvIsQueueEmpty) + prvIsQueueFull 0x080033c5 Thumb Code 28 queue.o(.text.prvIsQueueFull) + [Anonymous Symbol] 0x080033c4 Section 0 queue.o(.text.prvIsQueueFull) + prvPortStartFirstTask 0x080033e1 Thumb Code 34 port.o(.text.prvPortStartFirstTask) + [Anonymous Symbol] 0x080033e0 Section 0 port.o(.text.prvPortStartFirstTask) + prvProcessExpiredTimer 0x08003409 Thumb Code 110 timers.o(.text.prvProcessExpiredTimer) + [Anonymous Symbol] 0x08003408 Section 0 timers.o(.text.prvProcessExpiredTimer) + prvProcessReceivedCommands 0x08003479 Thumb Code 290 timers.o(.text.prvProcessReceivedCommands) + [Anonymous Symbol] 0x08003478 Section 0 timers.o(.text.prvProcessReceivedCommands) + prvProcessTimerOrBlockTask 0x0800359d Thumb Code 128 timers.o(.text.prvProcessTimerOrBlockTask) + [Anonymous Symbol] 0x0800359c Section 0 timers.o(.text.prvProcessTimerOrBlockTask) + prvResetNextTaskUnblockTime 0x0800361d Thumb Code 40 tasks.o(.text.prvResetNextTaskUnblockTime) + [Anonymous Symbol] 0x0800361c Section 0 tasks.o(.text.prvResetNextTaskUnblockTime) + prvSampleTimeNow 0x08003645 Thumb Code 42 timers.o(.text.prvSampleTimeNow) + [Anonymous Symbol] 0x08003644 Section 0 timers.o(.text.prvSampleTimeNow) + prvSwitchTimerLists 0x08003671 Thumb Code 142 timers.o(.text.prvSwitchTimerLists) + [Anonymous Symbol] 0x08003670 Section 0 timers.o(.text.prvSwitchTimerLists) + prvTaskExitError 0x08003701 Thumb Code 50 port.o(.text.prvTaskExitError) + [Anonymous Symbol] 0x08003700 Section 0 port.o(.text.prvTaskExitError) + prvTimerTask 0x08003735 Thumb Code 22 timers.o(.text.prvTimerTask) + [Anonymous Symbol] 0x08003734 Section 0 timers.o(.text.prvTimerTask) + prvUnlockQueue 0x0800374d Thumb Code 114 queue.o(.text.prvUnlockQueue) + [Anonymous Symbol] 0x0800374c Section 0 queue.o(.text.prvUnlockQueue) + [Anonymous Symbol] 0x080037c0 Section 0 heap_4.o(.text.pvPortMalloc) + [Anonymous Symbol] 0x0800390c Section 0 port.o(.text.pxPortInitialiseStack) + [Anonymous Symbol] 0x08003934 Section 0 list.o(.text.uxListRemove) + [Anonymous Symbol] 0x08003958 Section 0 cmsis_os2.o(.text.vApplicationGetIdleTaskMemory) + [Anonymous Symbol] 0x08003974 Section 0 cmsis_os2.o(.text.vApplicationGetTimerTaskMemory) + [Anonymous Symbol] 0x08003990 Section 0 list.o(.text.vListInitialise) + [Anonymous Symbol] 0x080039a8 Section 0 list.o(.text.vListInitialiseItem) + [Anonymous Symbol] 0x080039b0 Section 0 list.o(.text.vListInsert) + [Anonymous Symbol] 0x080039ec Section 0 list.o(.text.vListInsertEnd) + vPortEnableVFP 0x08003a09 Thumb Code 14 port.o(.text.vPortEnableVFP) + [Anonymous Symbol] 0x08003a08 Section 0 port.o(.text.vPortEnableVFP) + [Anonymous Symbol] 0x08003a1c Section 0 port.o(.text.vPortEnterCritical) + [Anonymous Symbol] 0x08003a64 Section 0 port.o(.text.vPortExitCritical) + [Anonymous Symbol] 0x08003a94 Section 0 heap_4.o(.text.vPortFree) + [Anonymous Symbol] 0x08003b20 Section 0 port.o(.text.vPortSetupTimerInterrupt) + [Anonymous Symbol] 0x08003b54 Section 0 port.o(.text.vPortValidateInterruptPriority) + [Anonymous Symbol] 0x08003bb8 Section 0 queue.o(.text.vQueueAddToRegistry) + [Anonymous Symbol] 0x08003be0 Section 0 queue.o(.text.vQueueWaitForMessageRestricted) + [Anonymous Symbol] 0x08003c24 Section 0 tasks.o(.text.vTaskDelay) + [Anonymous Symbol] 0x08003c78 Section 0 tasks.o(.text.vTaskInternalSetTimeOutState) + [Anonymous Symbol] 0x08003c94 Section 0 tasks.o(.text.vTaskMissedYield) + [Anonymous Symbol] 0x08003ca4 Section 0 tasks.o(.text.vTaskPlaceOnEventList) + [Anonymous Symbol] 0x08003cd8 Section 0 tasks.o(.text.vTaskPlaceOnEventListRestricted) + [Anonymous Symbol] 0x08003d18 Section 0 tasks.o(.text.vTaskStartScheduler) + [Anonymous Symbol] 0x08003dbc Section 0 tasks.o(.text.vTaskSuspendAll) + [Anonymous Symbol] 0x08003dcc Section 0 tasks.o(.text.vTaskSwitchContext) + [Anonymous Symbol] 0x08003e68 Section 0 port.o(.text.xPortStartScheduler) + [Anonymous Symbol] 0x08003f7c Section 0 port.o(.text.xPortSysTickHandler) + [Anonymous Symbol] 0x08003fac Section 0 queue.o(.text.xQueueGenericCreateStatic) + [Anonymous Symbol] 0x08004044 Section 0 queue.o(.text.xQueueGenericReset) + [Anonymous Symbol] 0x080040c4 Section 0 queue.o(.text.xQueueGenericSend) + [Anonymous Symbol] 0x08004268 Section 0 queue.o(.text.xQueueGenericSendFromISR) + [Anonymous Symbol] 0x08004338 Section 0 queue.o(.text.xQueueReceive) + [Anonymous Symbol] 0x080044bc Section 0 tasks.o(.text.xTaskCheckForTimeOut) + [Anonymous Symbol] 0x08004544 Section 0 tasks.o(.text.xTaskCreate) + [Anonymous Symbol] 0x080045ac Section 0 tasks.o(.text.xTaskCreateStatic) + [Anonymous Symbol] 0x08004624 Section 0 tasks.o(.text.xTaskGetSchedulerState) + [Anonymous Symbol] 0x0800464c Section 0 tasks.o(.text.xTaskGetTickCount) + [Anonymous Symbol] 0x08004658 Section 0 tasks.o(.text.xTaskIncrementTick) + [Anonymous Symbol] 0x080047ac Section 0 tasks.o(.text.xTaskPriorityDisinherit) + [Anonymous Symbol] 0x08004840 Section 0 tasks.o(.text.xTaskRemoveFromEventList) + [Anonymous Symbol] 0x080048d0 Section 0 tasks.o(.text.xTaskResumeAll) + [Anonymous Symbol] 0x080049e4 Section 0 timers.o(.text.xTimerCreateTimerTask) + [Anonymous Symbol] 0x08004a58 Section 0 timers.o(.text.xTimerGenericCommand) + $v0 0x08004ac0 Number 0 fpinit.o(x$fpl$fpinit) + x$fpl$fpinit 0x08004ac0 Section 26 fpinit.o(x$fpl$fpinit) + [Anonymous Symbol] 0x08004b18 Section 0 freertos.o(.rodata.str1.1) + uxCriticalNesting 0x2000000c Data 4 port.o(.data.uxCriticalNesting) + [Anonymous Symbol] 0x2000000c Section 0 port.o(.data.uxCriticalNesting) + .bss 0x20000010 Section 96 libspace.o(.bss) + GPIO_Callback 0x20000070 Data 64 gpio_1.o(.bss.GPIO_Callback) + [Anonymous Symbol] 0x20000070 Section 0 gpio_1.o(.bss.GPIO_Callback) + KernelState 0x200000b0 Data 4 cmsis_os2.o(.bss.KernelState) + [Anonymous Symbol] 0x200000b0 Section 0 cmsis_os2.o(.bss.KernelState) + UART_Callback 0x200000b4 Data 36 uart.o(.bss.UART_Callback) + [Anonymous Symbol] 0x200000b4 Section 0 uart.o(.bss.UART_Callback) + prvCheckForValidListAndQueue.ucStaticTimerQueueStorage 0x200004c4 Data 160 timers.o(.bss.prvCheckForValidListAndQueue.ucStaticTimerQueueStorage) + [Anonymous Symbol] 0x200004c4 Section 0 timers.o(.bss.prvCheckForValidListAndQueue.ucStaticTimerQueueStorage) + prvCheckForValidListAndQueue.xStaticTimerQueue 0x20000564 Data 80 timers.o(.bss.prvCheckForValidListAndQueue.xStaticTimerQueue) + [Anonymous Symbol] 0x20000564 Section 0 timers.o(.bss.prvCheckForValidListAndQueue.xStaticTimerQueue) + prvSampleTimeNow.xLastTime 0x200005b4 Data 4 timers.o(.bss.prvSampleTimeNow.xLastTime) + [Anonymous Symbol] 0x200005b4 Section 0 timers.o(.bss.prvSampleTimeNow.xLastTime) + pxCurrentTimerList 0x200005bc Data 4 timers.o(.bss.pxCurrentTimerList) + [Anonymous Symbol] 0x200005bc Section 0 timers.o(.bss.pxCurrentTimerList) + pxDelayedTaskList 0x200005c0 Data 4 tasks.o(.bss.pxDelayedTaskList) + [Anonymous Symbol] 0x200005c0 Section 0 tasks.o(.bss.pxDelayedTaskList) + pxEnd 0x200005c4 Data 4 heap_4.o(.bss.pxEnd) + [Anonymous Symbol] 0x200005c4 Section 0 heap_4.o(.bss.pxEnd) + pxOverflowDelayedTaskList 0x200005c8 Data 4 tasks.o(.bss.pxOverflowDelayedTaskList) + [Anonymous Symbol] 0x200005c8 Section 0 tasks.o(.bss.pxOverflowDelayedTaskList) + pxOverflowTimerList 0x200005cc Data 4 timers.o(.bss.pxOverflowTimerList) + [Anonymous Symbol] 0x200005cc Section 0 timers.o(.bss.pxOverflowTimerList) + pxReadyTasksLists 0x200005d0 Data 1120 tasks.o(.bss.pxReadyTasksLists) + [Anonymous Symbol] 0x200005d0 Section 0 tasks.o(.bss.pxReadyTasksLists) + ucHeap 0x20000a30 Data 15360 heap_4.o(.bss.ucHeap) + [Anonymous Symbol] 0x20000a30 Section 0 heap_4.o(.bss.ucHeap) + ucMaxSysCallPriority 0x20004630 Data 1 port.o(.bss.ucMaxSysCallPriority) + [Anonymous Symbol] 0x20004630 Section 0 port.o(.bss.ucMaxSysCallPriority) + ulMaxPRIGROUPValue 0x20004634 Data 4 port.o(.bss.ulMaxPRIGROUPValue) + [Anonymous Symbol] 0x20004634 Section 0 port.o(.bss.ulMaxPRIGROUPValue) + uxCurrentNumberOfTasks 0x2000463c Data 4 tasks.o(.bss.uxCurrentNumberOfTasks) + [Anonymous Symbol] 0x2000463c Section 0 tasks.o(.bss.uxCurrentNumberOfTasks) + uxDeletedTasksWaitingCleanUp 0x20004640 Data 4 tasks.o(.bss.uxDeletedTasksWaitingCleanUp) + [Anonymous Symbol] 0x20004640 Section 0 tasks.o(.bss.uxDeletedTasksWaitingCleanUp) + uxSchedulerSuspended 0x20004644 Data 4 tasks.o(.bss.uxSchedulerSuspended) + [Anonymous Symbol] 0x20004644 Section 0 tasks.o(.bss.uxSchedulerSuspended) + uxTaskNumber 0x20004648 Data 4 tasks.o(.bss.uxTaskNumber) + [Anonymous Symbol] 0x20004648 Section 0 tasks.o(.bss.uxTaskNumber) + uxTopReadyPriority 0x2000464c Data 4 tasks.o(.bss.uxTopReadyPriority) + [Anonymous Symbol] 0x2000464c Section 0 tasks.o(.bss.uxTopReadyPriority) + vApplicationGetIdleTaskMemory.Idle_Stack 0x20004650 Data 512 cmsis_os2.o(.bss.vApplicationGetIdleTaskMemory.Idle_Stack) + [Anonymous Symbol] 0x20004650 Section 0 cmsis_os2.o(.bss.vApplicationGetIdleTaskMemory.Idle_Stack) + vApplicationGetIdleTaskMemory.Idle_TCB 0x20004850 Data 92 cmsis_os2.o(.bss.vApplicationGetIdleTaskMemory.Idle_TCB) + [Anonymous Symbol] 0x20004850 Section 0 cmsis_os2.o(.bss.vApplicationGetIdleTaskMemory.Idle_TCB) + vApplicationGetTimerTaskMemory.Timer_Stack 0x200048ac Data 1024 cmsis_os2.o(.bss.vApplicationGetTimerTaskMemory.Timer_Stack) + [Anonymous Symbol] 0x200048ac Section 0 cmsis_os2.o(.bss.vApplicationGetTimerTaskMemory.Timer_Stack) + vApplicationGetTimerTaskMemory.Timer_TCB 0x20004cac Data 92 cmsis_os2.o(.bss.vApplicationGetTimerTaskMemory.Timer_TCB) + [Anonymous Symbol] 0x20004cac Section 0 cmsis_os2.o(.bss.vApplicationGetTimerTaskMemory.Timer_TCB) + xActiveTimerList1 0x20004d08 Data 20 timers.o(.bss.xActiveTimerList1) + [Anonymous Symbol] 0x20004d08 Section 0 timers.o(.bss.xActiveTimerList1) + xActiveTimerList2 0x20004d1c Data 20 timers.o(.bss.xActiveTimerList2) + [Anonymous Symbol] 0x20004d1c Section 0 timers.o(.bss.xActiveTimerList2) + xBlockAllocatedBit 0x20004d30 Data 1 heap_4.o(.bss.xBlockAllocatedBit) + [Anonymous Symbol] 0x20004d30 Section 0 heap_4.o(.bss.xBlockAllocatedBit) + xDelayedTaskList1 0x20004d34 Data 20 tasks.o(.bss.xDelayedTaskList1) + [Anonymous Symbol] 0x20004d34 Section 0 tasks.o(.bss.xDelayedTaskList1) + xDelayedTaskList2 0x20004d48 Data 20 tasks.o(.bss.xDelayedTaskList2) + [Anonymous Symbol] 0x20004d48 Section 0 tasks.o(.bss.xDelayedTaskList2) + xFreeBytesRemaining 0x20004d5c Data 4 heap_4.o(.bss.xFreeBytesRemaining) + [Anonymous Symbol] 0x20004d5c Section 0 heap_4.o(.bss.xFreeBytesRemaining) + xIdleTaskHandle 0x20004d60 Data 4 tasks.o(.bss.xIdleTaskHandle) + [Anonymous Symbol] 0x20004d60 Section 0 tasks.o(.bss.xIdleTaskHandle) + xMinimumEverFreeBytesRemaining 0x20004d64 Data 4 heap_4.o(.bss.xMinimumEverFreeBytesRemaining) + [Anonymous Symbol] 0x20004d64 Section 0 heap_4.o(.bss.xMinimumEverFreeBytesRemaining) + xNextTaskUnblockTime 0x20004d68 Data 4 tasks.o(.bss.xNextTaskUnblockTime) + [Anonymous Symbol] 0x20004d68 Section 0 tasks.o(.bss.xNextTaskUnblockTime) + xNumOfOverflows 0x20004d6c Data 4 tasks.o(.bss.xNumOfOverflows) + [Anonymous Symbol] 0x20004d6c Section 0 tasks.o(.bss.xNumOfOverflows) + xNumberOfSuccessfulAllocations 0x20004d70 Data 4 heap_4.o(.bss.xNumberOfSuccessfulAllocations) + [Anonymous Symbol] 0x20004d70 Section 0 heap_4.o(.bss.xNumberOfSuccessfulAllocations) + xNumberOfSuccessfulFrees 0x20004d74 Data 4 heap_4.o(.bss.xNumberOfSuccessfulFrees) + [Anonymous Symbol] 0x20004d74 Section 0 heap_4.o(.bss.xNumberOfSuccessfulFrees) + xPendedTicks 0x20004d78 Data 4 tasks.o(.bss.xPendedTicks) + [Anonymous Symbol] 0x20004d78 Section 0 tasks.o(.bss.xPendedTicks) + xPendingReadyList 0x20004d7c Data 20 tasks.o(.bss.xPendingReadyList) + [Anonymous Symbol] 0x20004d7c Section 0 tasks.o(.bss.xPendingReadyList) + xSchedulerRunning 0x20004dd0 Data 4 tasks.o(.bss.xSchedulerRunning) + [Anonymous Symbol] 0x20004dd0 Section 0 tasks.o(.bss.xSchedulerRunning) + xStart 0x20004dd4 Data 8 heap_4.o(.bss.xStart) + [Anonymous Symbol] 0x20004dd4 Section 0 heap_4.o(.bss.xStart) + xSuspendedTaskList 0x20004ddc Data 20 tasks.o(.bss.xSuspendedTaskList) + [Anonymous Symbol] 0x20004ddc Section 0 tasks.o(.bss.xSuspendedTaskList) + xTasksWaitingTermination 0x20004df0 Data 20 tasks.o(.bss.xTasksWaitingTermination) + [Anonymous Symbol] 0x20004df0 Section 0 tasks.o(.bss.xTasksWaitingTermination) + xTickCount 0x20004e04 Data 4 tasks.o(.bss.xTickCount) + [Anonymous Symbol] 0x20004e04 Section 0 tasks.o(.bss.xTickCount) + xTimerQueue 0x20004e08 Data 4 timers.o(.bss.xTimerQueue) + [Anonymous Symbol] 0x20004e08 Section 0 timers.o(.bss.xTimerQueue) + xTimerTaskHandle 0x20004e0c Data 4 timers.o(.bss.xTimerTaskHandle) + [Anonymous Symbol] 0x20004e0c Section 0 timers.o(.bss.xTimerTaskHandle) + xYieldPending 0x20004e10 Data 4 tasks.o(.bss.xYieldPending) + [Anonymous Symbol] 0x20004e10 Section 0 tasks.o(.bss.xYieldPending) + Heap_Mem 0x20004e18 Data 512 startup_stm32f407xx.o(HEAP) + HEAP 0x20004e18 Section 512 startup_stm32f407xx.o(HEAP) + Stack_Mem 0x20005018 Data 1024 startup_stm32f407xx.o(STACK) + STACK 0x20005018 Section 1024 startup_stm32f407xx.o(STACK) + __initial_sp 0x20005418 Data 0 startup_stm32f407xx.o(STACK) + + Global Symbols + + Symbol Name Value Ov Type Size Object(Section) + + BuildAttributes$$THM_ISAv4$E$P$D$K$B$S$7EM$VFPi3$EXTD16$VFPS$VFMA$PE$A:L22UL41UL21$X:L11$S22US41US21$IEEE1$IW$~IW$USESV6$~STKCKD$USESV7$~SHL$OTIME$ROPI$IEEEX$EBA8$UX$STANDARDLIB$REQ8$PRES8$EABIv2 0x00000000 Number 0 anon$$obj.o ABSOLUTE + __ARM_exceptions_init - Undefined Weak Reference + __alloca_initialize - Undefined Weak Reference + __arm_preinit_ - Undefined Weak Reference + __cpp_initialize__aeabi_ - Undefined Weak Reference + __cxa_finalize - Undefined Weak Reference + __rt_locale - Undefined Weak Reference + __sigvec_lookup - Undefined Weak Reference + _atexit_init - Undefined Weak Reference + _call_atexit_fns - Undefined Weak Reference + _clock_init - Undefined Weak Reference + _fp_trap_init - Undefined Weak Reference + _fp_trap_shutdown - Undefined Weak Reference + _get_lc_collate - Undefined Weak Reference + _get_lc_ctype - Undefined Weak Reference + _get_lc_monetary - Undefined Weak Reference + _get_lc_numeric - Undefined Weak Reference + _get_lc_time - Undefined Weak Reference + _getenv_init - Undefined Weak Reference + _handle_redirection - Undefined Weak Reference + _init_alloc - Undefined Weak Reference + _init_user_alloc - Undefined Weak Reference + _initio - Undefined Weak Reference + _rand_init - Undefined Weak Reference + _signal_finish - Undefined Weak Reference + _signal_init - Undefined Weak Reference + _terminate_alloc - Undefined Weak Reference + _terminate_user_alloc - Undefined Weak Reference + _terminateio - Undefined Weak Reference + __Vectors_Size 0x00000188 Number 0 startup_stm32f407xx.o ABSOLUTE + __Vectors 0x08000000 Data 4 startup_stm32f407xx.o(RESET) + __Vectors_End 0x08000188 Data 0 startup_stm32f407xx.o(RESET) + __main 0x08000189 Thumb Code 8 __main.o(!!!main) + __scatterload 0x08000191 Thumb Code 0 __scatter.o(!!!scatter) + __scatterload_rt2 0x08000191 Thumb Code 44 __scatter.o(!!!scatter) + __scatterload_rt2_thumb_only 0x08000191 Thumb Code 0 __scatter.o(!!!scatter) + __scatterload_null 0x0800019f Thumb Code 0 __scatter.o(!!!scatter) + __scatterload_copy 0x080001c5 Thumb Code 26 __scatter_copy.o(!!handler_copy) + __scatterload_zeroinit 0x080001e1 Thumb Code 28 __scatter_zi.o(!!handler_zi) + __rt_lib_init 0x080001fd Thumb Code 0 libinit.o(.ARM.Collect$$libinit$$00000000) + __rt_lib_init_fp_1 0x080001ff Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$00000001) + __rt_lib_init_alloca_1 0x08000203 Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$0000002E) + __rt_lib_init_argv_1 0x08000203 Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$0000002C) + __rt_lib_init_atexit_1 0x08000203 Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$0000001B) + __rt_lib_init_clock_1 0x08000203 Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$00000021) + __rt_lib_init_cpp_1 0x08000203 Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$00000032) + __rt_lib_init_exceptions_1 0x08000203 Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$00000030) + __rt_lib_init_fp_trap_1 0x08000203 Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$0000001F) + __rt_lib_init_getenv_1 0x08000203 Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$00000023) + __rt_lib_init_heap_1 0x08000203 Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$0000000A) + __rt_lib_init_lc_collate_1 0x08000203 Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$00000011) + __rt_lib_init_lc_ctype_1 0x08000203 Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$00000013) + __rt_lib_init_lc_monetary_1 0x08000203 Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$00000015) + __rt_lib_init_lc_numeric_1 0x08000203 Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$00000017) + __rt_lib_init_lc_time_1 0x08000203 Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$00000019) + __rt_lib_init_preinit_1 0x08000203 Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$00000004) + __rt_lib_init_rand_1 0x08000203 Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$0000000E) + __rt_lib_init_return 0x08000203 Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$00000033) + __rt_lib_init_signal_1 0x08000203 Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$0000001D) + __rt_lib_init_stdio_1 0x08000203 Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$00000025) + __rt_lib_init_user_alloc_1 0x08000203 Thumb Code 0 libinit2.o(.ARM.Collect$$libinit$$0000000C) + __rt_lib_shutdown 0x08000205 Thumb Code 0 libshutdown.o(.ARM.Collect$$libshutdown$$00000000) + __rt_lib_shutdown_cpp_1 0x08000207 Thumb Code 0 libshutdown2.o(.ARM.Collect$$libshutdown$$00000002) + __rt_lib_shutdown_fp_trap_1 0x08000207 Thumb Code 0 libshutdown2.o(.ARM.Collect$$libshutdown$$00000007) + __rt_lib_shutdown_heap_1 0x08000207 Thumb Code 0 libshutdown2.o(.ARM.Collect$$libshutdown$$0000000F) + __rt_lib_shutdown_return 0x08000207 Thumb Code 0 libshutdown2.o(.ARM.Collect$$libshutdown$$00000010) + __rt_lib_shutdown_signal_1 0x08000207 Thumb Code 0 libshutdown2.o(.ARM.Collect$$libshutdown$$0000000A) + __rt_lib_shutdown_stdio_1 0x08000207 Thumb Code 0 libshutdown2.o(.ARM.Collect$$libshutdown$$00000004) + __rt_lib_shutdown_user_alloc_1 0x08000207 Thumb Code 0 libshutdown2.o(.ARM.Collect$$libshutdown$$0000000C) + __rt_entry 0x08000209 Thumb Code 0 __rtentry.o(.ARM.Collect$$rtentry$$00000000) + __rt_entry_presh_1 0x08000209 Thumb Code 0 __rtentry2.o(.ARM.Collect$$rtentry$$00000002) + __rt_entry_sh 0x08000209 Thumb Code 0 __rtentry4.o(.ARM.Collect$$rtentry$$00000004) + __rt_entry_li 0x0800020f Thumb Code 0 __rtentry2.o(.ARM.Collect$$rtentry$$0000000A) + __rt_entry_postsh_1 0x0800020f Thumb Code 0 __rtentry2.o(.ARM.Collect$$rtentry$$00000009) + __rt_entry_main 0x08000213 Thumb Code 0 __rtentry2.o(.ARM.Collect$$rtentry$$0000000D) + __rt_entry_postli_1 0x08000213 Thumb Code 0 __rtentry2.o(.ARM.Collect$$rtentry$$0000000C) + __rt_exit 0x0800021b Thumb Code 0 rtexit.o(.ARM.Collect$$rtexit$$00000000) + __rt_exit_ls 0x0800021d Thumb Code 0 rtexit2.o(.ARM.Collect$$rtexit$$00000003) + __rt_exit_prels_1 0x0800021d Thumb Code 0 rtexit2.o(.ARM.Collect$$rtexit$$00000002) + __rt_exit_exit 0x08000221 Thumb Code 0 rtexit2.o(.ARM.Collect$$rtexit$$00000004) + Reset_Handler 0x08000229 Thumb Code 8 startup_stm32f407xx.o(.text) + ADC_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + CAN1_RX0_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + CAN1_RX1_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + CAN1_SCE_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + CAN1_TX_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + CAN2_RX0_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + CAN2_RX1_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + CAN2_SCE_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + CAN2_TX_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + DCMI_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + DMA1_Stream0_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + DMA1_Stream1_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + DMA1_Stream3_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + DMA1_Stream4_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + DMA1_Stream5_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + DMA1_Stream6_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + DMA1_Stream7_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + DMA2_Stream0_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + DMA2_Stream4_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + DMA2_Stream5_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + DMA2_Stream6_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + DMA2_Stream7_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + ETH_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + ETH_WKUP_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + EXTI0_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + EXTI15_10_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + EXTI1_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + EXTI2_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + FLASH_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + FMC_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + FPU_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + HASH_RNG_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + I2C1_ER_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + I2C1_EV_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + I2C2_ER_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + I2C2_EV_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + I2C3_ER_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + I2C3_EV_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + OTG_FS_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + OTG_FS_WKUP_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + OTG_HS_EP1_IN_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + OTG_HS_EP1_OUT_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + OTG_HS_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + OTG_HS_WKUP_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + PVD_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + RCC_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + RTC_Alarm_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + RTC_WKUP_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + SDIO_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + SPI1_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + SPI2_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + SPI3_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + TAMP_STAMP_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + TIM1_BRK_TIM9_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + TIM1_CC_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + TIM1_TRG_COM_TIM11_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + TIM1_UP_TIM10_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + TIM2_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + TIM3_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + TIM4_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + TIM5_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + TIM6_DAC_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + TIM7_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + TIM8_BRK_TIM12_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + TIM8_CC_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + TIM8_TRG_COM_TIM14_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + TIM8_UP_TIM13_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + UART4_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + UART5_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + USART1_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + USART2_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + USART3_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + WWDG_IRQHandler 0x08000243 Thumb Code 0 startup_stm32f407xx.o(.text) + __user_initial_stackheap 0x08000245 Thumb Code 0 startup_stm32f407xx.o(.text) + __aeabi_uldivmod 0x08000269 Thumb Code 0 lludivv7m.o(.text) + _ll_udiv 0x08000269 Thumb Code 240 lludivv7m.o(.text) + __aeabi_memcpy 0x08000359 Thumb Code 0 rt_memcpy_v6.o(.text) + __rt_memcpy 0x08000359 Thumb Code 138 rt_memcpy_v6.o(.text) + _memcpy_lastbytes 0x080003bf Thumb Code 0 rt_memcpy_v6.o(.text) + __aeabi_memset4 0x080003e3 Thumb Code 16 aeabi_memset4.o(.text) + __aeabi_memset8 0x080003e3 Thumb Code 0 aeabi_memset4.o(.text) + __aeabi_memclr4 0x080003f3 Thumb Code 0 rt_memclr_w.o(.text) + __aeabi_memclr8 0x080003f3 Thumb Code 0 rt_memclr_w.o(.text) + __rt_memclr_w 0x080003f3 Thumb Code 0 rt_memclr_w.o(.text) + _memset_w 0x080003f7 Thumb Code 74 rt_memclr_w.o(.text) + __use_two_region_memory 0x08000441 Thumb Code 2 heapauxi.o(.text) + __rt_heap_escrow$2region 0x08000443 Thumb Code 2 heapauxi.o(.text) + __rt_heap_expand$2region 0x08000445 Thumb Code 2 heapauxi.o(.text) + __aeabi_memcpy4 0x08000447 Thumb Code 0 rt_memcpy_w.o(.text) + __aeabi_memcpy8 0x08000447 Thumb Code 0 rt_memcpy_w.o(.text) + __rt_memcpy_w 0x08000447 Thumb Code 100 rt_memcpy_w.o(.text) + _memcpy_lastbytes_aligned 0x0800048f Thumb Code 0 rt_memcpy_w.o(.text) + __user_libspace 0x080004ad Thumb Code 8 libspace.o(.text) + __user_perproc_libspace 0x080004ad Thumb Code 0 libspace.o(.text) + __user_perthread_libspace 0x080004ad Thumb Code 0 libspace.o(.text) + __user_setup_stackheap 0x080004b5 Thumb Code 74 sys_stackheap_outer.o(.text) + exit 0x080004ff Thumb Code 18 exit.o(.text) + _sys_exit 0x08000511 Thumb Code 8 sys_exit.o(.text) + __I$use$semihosting 0x0800051d Thumb Code 0 use_no_semi.o(.text) + __use_no_semihosting_swi 0x0800051d Thumb Code 2 use_no_semi.o(.text) + __semihosting_library_function 0x0800051f Thumb Code 0 indicate_semi.o(.text) + BusFault_Handler 0x08000521 Thumb Code 2 stm32f4xx_it.o(.text.BusFault_Handler) + DMA1_Stream2_IRQHandler 0x08000525 Thumb Code 16 stm32f4xx_it.o(.text.DMA1_Stream2_IRQHandler) + DMA2_Stream1_IRQHandler 0x08000535 Thumb Code 16 stm32f4xx_it.o(.text.DMA2_Stream1_IRQHandler) + DMA2_Stream2_IRQHandler 0x08000545 Thumb Code 16 stm32f4xx_it.o(.text.DMA2_Stream2_IRQHandler) + DMA2_Stream3_IRQHandler 0x08000555 Thumb Code 16 stm32f4xx_it.o(.text.DMA2_Stream3_IRQHandler) + DebugMon_Handler 0x080005f1 Thumb Code 2 stm32f4xx_it.o(.text.DebugMon_Handler) + EXTI3_IRQHandler 0x080005f5 Thumb Code 10 stm32f4xx_it.o(.text.EXTI3_IRQHandler) + EXTI4_IRQHandler 0x08000601 Thumb Code 10 stm32f4xx_it.o(.text.EXTI4_IRQHandler) + EXTI9_5_IRQHandler 0x0800060d Thumb Code 10 stm32f4xx_it.o(.text.EXTI9_5_IRQHandler) + Error_Handler 0x08000619 Thumb Code 6 main.o(.text.Error_Handler) + HAL_DMA_Abort 0x08000621 Thumb Code 128 stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort) + HAL_DMA_Abort_IT 0x080006a1 Thumb Code 36 stm32f4xx_hal_dma.o(.text.HAL_DMA_Abort_IT) + HAL_DMA_IRQHandler 0x080006c5 Thumb Code 396 stm32f4xx_hal_dma.o(.text.HAL_DMA_IRQHandler) + HAL_DMA_Init 0x08000851 Thumb Code 206 stm32f4xx_hal_dma.o(.text.HAL_DMA_Init) + HAL_GPIO_EXTI_Callback 0x08000921 Thumb Code 44 gpio_1.o(.text.HAL_GPIO_EXTI_Callback) + HAL_GPIO_EXTI_IRQHandler 0x0800094d Thumb Code 26 stm32f4xx_hal_gpio.o(.text.HAL_GPIO_EXTI_IRQHandler) + HAL_GPIO_Init 0x08000969 Thumb Code 410 stm32f4xx_hal_gpio.o(.text.HAL_GPIO_Init) + HAL_GPIO_WritePin 0x08000b05 Thumb Code 10 stm32f4xx_hal_gpio.o(.text.HAL_GPIO_WritePin) + HAL_GetTick 0x08000b11 Thumb Code 12 stm32f4xx_hal.o(.text.HAL_GetTick) + HAL_I2C_Init 0x08000b1d Thumb Code 408 stm32f4xx_hal_i2c.o(.text.HAL_I2C_Init) + HAL_I2C_MspInit 0x08000cb5 Thumb Code 342 i2c.o(.text.HAL_I2C_MspInit) + HAL_IncTick 0x08000e0d Thumb Code 26 stm32f4xx_hal.o(.text.HAL_IncTick) + HAL_Init 0x08000e29 Thumb Code 54 stm32f4xx_hal.o(.text.HAL_Init) + HAL_InitTick 0x08000e61 Thumb Code 80 stm32f4xx_hal.o(.text.HAL_InitTick) + HAL_MspInit 0x08000eb1 Thumb Code 70 stm32f4xx_hal_msp.o(.text.HAL_MspInit) + HAL_NVIC_EnableIRQ 0x08000ef9 Thumb Code 8 stm32f4xx_hal_cortex.o(.text.HAL_NVIC_EnableIRQ) + HAL_NVIC_SetPriority 0x08000f01 Thumb Code 30 stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SetPriority) + HAL_NVIC_SetPriorityGrouping 0x08000f21 Thumb Code 8 stm32f4xx_hal_cortex.o(.text.HAL_NVIC_SetPriorityGrouping) + HAL_RCC_ClockConfig 0x08000f29 Thumb Code 352 stm32f4xx_hal_rcc.o(.text.HAL_RCC_ClockConfig) + HAL_RCC_GetHCLKFreq 0x08001089 Thumb Code 12 stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetHCLKFreq) + HAL_RCC_GetPCLK1Freq 0x08001095 Thumb Code 34 stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetPCLK1Freq) + HAL_RCC_GetPCLK2Freq 0x080010b9 Thumb Code 34 stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetPCLK2Freq) + HAL_RCC_GetSysClockFreq 0x080010dd Thumb Code 104 stm32f4xx_hal_rcc.o(.text.HAL_RCC_GetSysClockFreq) + HAL_RCC_OscConfig 0x08001145 Thumb Code 840 stm32f4xx_hal_rcc.o(.text.HAL_RCC_OscConfig) + HAL_SPI_Init 0x0800148d Thumb Code 180 stm32f4xx_hal_spi.o(.text.HAL_SPI_Init) + HAL_SPI_MspInit 0x08001541 Thumb Code 302 spi.o(.text.HAL_SPI_MspInit) + HAL_SYSTICK_Config 0x08001671 Thumb Code 8 stm32f4xx_hal_cortex.o(.text.HAL_SYSTICK_Config) + HAL_TIMEx_ConfigBreakDeadTime 0x08001679 Thumb Code 76 stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_ConfigBreakDeadTime) + HAL_TIMEx_MasterConfigSynchronization 0x080016c5 Thumb Code 184 stm32f4xx_hal_tim_ex.o(.text.HAL_TIMEx_MasterConfigSynchronization) + HAL_TIM_Base_Init 0x0800177d Thumb Code 90 stm32f4xx_hal_tim.o(.text.HAL_TIM_Base_Init) + HAL_TIM_Base_MspInit 0x080017d9 Thumb Code 54 tim.o(.text.HAL_TIM_Base_MspInit) + HAL_TIM_MspPostInit 0x08001811 Thumb Code 322 tim.o(.text.HAL_TIM_MspPostInit) + HAL_TIM_PWM_ConfigChannel 0x08001955 Thumb Code 152 stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_ConfigChannel) + HAL_TIM_PWM_Init 0x080019ed Thumb Code 90 stm32f4xx_hal_tim.o(.text.HAL_TIM_PWM_Init) + HAL_TIM_PWM_MspInit 0x08001a49 Thumb Code 140 tim.o(.text.HAL_TIM_PWM_MspInit) + HAL_UARTEx_RxEventCallback 0x08001ad5 Thumb Code 2 stm32f4xx_hal_uart.o(.text.HAL_UARTEx_RxEventCallback) + HAL_UART_ErrorCallback 0x08001ad9 Thumb Code 38 uart.o(.text.HAL_UART_ErrorCallback) + HAL_UART_IRQHandler 0x08001b01 Thumb Code 602 stm32f4xx_hal_uart.o(.text.HAL_UART_IRQHandler) + HAL_UART_Init 0x08001d5d Thumb Code 96 stm32f4xx_hal_uart.o(.text.HAL_UART_Init) + HAL_UART_MspInit 0x08001dbd Thumb Code 194 usart.o(.text.HAL_UART_MspInit) + HAL_UART_RxCpltCallback 0x08001e81 Thumb Code 38 uart.o(.text.HAL_UART_RxCpltCallback) + HAL_UART_TxCpltCallback 0x08001ea9 Thumb Code 38 uart.o(.text.HAL_UART_TxCpltCallback) + HardFault_Handler 0x08001ed1 Thumb Code 2 stm32f4xx_it.o(.text.HardFault_Handler) + MX_DMA_Init 0x08001ed5 Thumb Code 122 dma.o(.text.MX_DMA_Init) + MX_FREERTOS_Init 0x08001f51 Thumb Code 36 freertos.o(.text.MX_FREERTOS_Init) + MX_GPIO_Init 0x08001f75 Thumb Code 444 gpio.o(.text.MX_GPIO_Init) + MX_I2C2_Init 0x08002131 Thumb Code 62 i2c.o(.text.MX_I2C2_Init) + MX_I2C3_Init 0x08002171 Thumb Code 62 i2c.o(.text.MX_I2C3_Init) + MX_SPI1_Init 0x080021b1 Thumb Code 78 spi.o(.text.MX_SPI1_Init) + MX_TIM10_Init 0x08002201 Thumb Code 136 tim.o(.text.MX_TIM10_Init) + MX_TIM1_Init 0x08002289 Thumb Code 282 tim.o(.text.MX_TIM1_Init) + MX_TIM4_Init 0x080023a5 Thumb Code 146 tim.o(.text.MX_TIM4_Init) + MX_TIM5_Init 0x08002439 Thumb Code 194 tim.o(.text.MX_TIM5_Init) + MX_USART6_UART_Init 0x080024fd Thumb Code 56 usart.o(.text.MX_USART6_UART_Init) + MemManage_Handler 0x08002535 Thumb Code 2 stm32f4xx_it.o(.text.MemManage_Handler) + NMI_Handler 0x08002539 Thumb Code 2 stm32f4xx_it.o(.text.NMI_Handler) + PendSV_Handler 0x08002571 Thumb Code 100 port.o(.text.PendSV_Handler) + SVC_Handler 0x080025e1 Thumb Code 36 port.o(.text.SVC_Handler) + StartDefaultTask 0x0800260d Thumb Code 8 freertos.o(.text.StartDefaultTask) + SysTick_Handler 0x08002645 Thumb Code 20 stm32f4xx_it.o(.text.SysTick_Handler) + SystemClock_Config 0x08002659 Thumb Code 164 main.o(.text.SystemClock_Config) + SystemInit 0x080026fd Thumb Code 18 system_stm32f4xx.o(.text.SystemInit) + TIM_Base_SetConfig 0x08002711 Thumb Code 300 stm32f4xx_hal_tim.o(.text.TIM_Base_SetConfig) + TIM_OC2_SetConfig 0x080028a1 Thumb Code 106 stm32f4xx_hal_tim.o(.text.TIM_OC2_SetConfig) + USART6_IRQHandler 0x08002c49 Thumb Code 16 stm32f4xx_it.o(.text.USART6_IRQHandler) + UsageFault_Handler 0x08002c59 Thumb Code 2 stm32f4xx_it.o(.text.UsageFault_Handler) + main 0x08002ce1 Thumb Code 62 main.o(.text.main) + osDelay 0x08002d21 Thumb Code 32 cmsis_os2.o(.text.osDelay) + osKernelInitialize 0x08002d41 Thumb Code 40 cmsis_os2.o(.text.osKernelInitialize) + osKernelStart 0x08002d69 Thumb Code 52 cmsis_os2.o(.text.osKernelStart) + osThreadNew 0x08002d9d Thumb Code 180 cmsis_os2.o(.text.osThreadNew) + pvPortMalloc 0x080037c1 Thumb Code 330 heap_4.o(.text.pvPortMalloc) + pxPortInitialiseStack 0x0800390d Thumb Code 40 port.o(.text.pxPortInitialiseStack) + uxListRemove 0x08003935 Thumb Code 36 list.o(.text.uxListRemove) + vApplicationGetIdleTaskMemory 0x08003959 Thumb Code 26 cmsis_os2.o(.text.vApplicationGetIdleTaskMemory) + vApplicationGetTimerTaskMemory 0x08003975 Thumb Code 28 cmsis_os2.o(.text.vApplicationGetTimerTaskMemory) + vListInitialise 0x08003991 Thumb Code 22 list.o(.text.vListInitialise) + vListInitialiseItem 0x080039a9 Thumb Code 6 list.o(.text.vListInitialiseItem) + vListInsert 0x080039b1 Thumb Code 58 list.o(.text.vListInsert) + vListInsertEnd 0x080039ed Thumb Code 28 list.o(.text.vListInsertEnd) + vPortEnterCritical 0x08003a1d Thumb Code 70 port.o(.text.vPortEnterCritical) + vPortExitCritical 0x08003a65 Thumb Code 46 port.o(.text.vPortExitCritical) + vPortFree 0x08003a95 Thumb Code 138 heap_4.o(.text.vPortFree) + vPortSetupTimerInterrupt 0x08003b21 Thumb Code 52 port.o(.text.vPortSetupTimerInterrupt) + vPortValidateInterruptPriority 0x08003b55 Thumb Code 98 port.o(.text.vPortValidateInterruptPriority) + vQueueAddToRegistry 0x08003bb9 Thumb Code 40 queue.o(.text.vQueueAddToRegistry) + vQueueWaitForMessageRestricted 0x08003be1 Thumb Code 68 queue.o(.text.vQueueWaitForMessageRestricted) + vTaskDelay 0x08003c25 Thumb Code 84 tasks.o(.text.vTaskDelay) + vTaskInternalSetTimeOutState 0x08003c79 Thumb Code 26 tasks.o(.text.vTaskInternalSetTimeOutState) + vTaskMissedYield 0x08003c95 Thumb Code 14 tasks.o(.text.vTaskMissedYield) + vTaskPlaceOnEventList 0x08003ca5 Thumb Code 50 tasks.o(.text.vTaskPlaceOnEventList) + vTaskPlaceOnEventListRestricted 0x08003cd9 Thumb Code 62 tasks.o(.text.vTaskPlaceOnEventListRestricted) + vTaskStartScheduler 0x08003d19 Thumb Code 156 tasks.o(.text.vTaskStartScheduler) + vTaskSuspendAll 0x08003dbd Thumb Code 16 tasks.o(.text.vTaskSuspendAll) + vTaskSwitchContext 0x08003dcd Thumb Code 154 tasks.o(.text.vTaskSwitchContext) + xPortStartScheduler 0x08003e69 Thumb Code 274 port.o(.text.xPortStartScheduler) + xPortSysTickHandler 0x08003f7d Thumb Code 46 port.o(.text.xPortSysTickHandler) + xQueueGenericCreateStatic 0x08003fad Thumb Code 150 queue.o(.text.xQueueGenericCreateStatic) + xQueueGenericReset 0x08004045 Thumb Code 126 queue.o(.text.xQueueGenericReset) + xQueueGenericSend 0x080040c5 Thumb Code 418 queue.o(.text.xQueueGenericSend) + xQueueGenericSendFromISR 0x08004269 Thumb Code 206 queue.o(.text.xQueueGenericSendFromISR) + xQueueReceive 0x08004339 Thumb Code 388 queue.o(.text.xQueueReceive) + xTaskCheckForTimeOut 0x080044bd Thumb Code 136 tasks.o(.text.xTaskCheckForTimeOut) + xTaskCreate 0x08004545 Thumb Code 102 tasks.o(.text.xTaskCreate) + xTaskCreateStatic 0x080045ad Thumb Code 118 tasks.o(.text.xTaskCreateStatic) + xTaskGetSchedulerState 0x08004625 Thumb Code 38 tasks.o(.text.xTaskGetSchedulerState) + xTaskGetTickCount 0x0800464d Thumb Code 12 tasks.o(.text.xTaskGetTickCount) + xTaskIncrementTick 0x08004659 Thumb Code 338 tasks.o(.text.xTaskIncrementTick) + xTaskPriorityDisinherit 0x080047ad Thumb Code 146 tasks.o(.text.xTaskPriorityDisinherit) + xTaskRemoveFromEventList 0x08004841 Thumb Code 142 tasks.o(.text.xTaskRemoveFromEventList) + xTaskResumeAll 0x080048d1 Thumb Code 276 tasks.o(.text.xTaskResumeAll) + xTimerCreateTimerTask 0x080049e5 Thumb Code 108 timers.o(.text.xTimerCreateTimerTask) + xTimerGenericCommand 0x08004a59 Thumb Code 104 timers.o(.text.xTimerGenericCommand) + _fp_init 0x08004ac1 Thumb Code 26 fpinit.o(x$fpl$fpinit) + __fplib_config_fpu_vfp 0x08004ad9 Thumb Code 0 fpinit.o(x$fpl$fpinit) + __fplib_config_pureend_doubles 0x08004ad9 Thumb Code 0 fpinit.o(x$fpl$fpinit) + AHBPrescTable 0x08004ada Data 16 system_stm32f4xx.o(.rodata.AHBPrescTable) + APBPrescTable 0x08004aea Data 8 system_stm32f4xx.o(.rodata.APBPrescTable) + defaultTask_attributes 0x08004af4 Data 36 freertos.o(.rodata.defaultTask_attributes) + Region$$Table$$Base 0x08004b24 Number 0 anon$$obj.o(Region$$Table) + Region$$Table$$Limit 0x08004b44 Number 0 anon$$obj.o(Region$$Table) + SystemCoreClock 0x20000000 Data 4 system_stm32f4xx.o(.data.SystemCoreClock) + uwTickFreq 0x20000004 Data 1 stm32f4xx_hal.o(.data.uwTickFreq) + uwTickPrio 0x20000008 Data 4 stm32f4xx_hal.o(.data.uwTickPrio) + __libspace_start 0x20000010 Data 96 libspace.o(.bss) + __temporary_stack_top$libspace 0x20000070 Data 0 libspace.o(.bss) + defaultTaskHandle 0x200000d8 Data 4 freertos.o(.bss.defaultTaskHandle) + hdma_i2c3_rx 0x200000dc Data 96 i2c.o(.bss.hdma_i2c3_rx) + hdma_spi1_rx 0x2000013c Data 96 spi.o(.bss.hdma_spi1_rx) + hdma_spi1_tx 0x2000019c Data 96 spi.o(.bss.hdma_spi1_tx) + hdma_usart6_rx 0x200001fc Data 96 usart.o(.bss.hdma_usart6_rx) + hi2c2 0x2000025c Data 84 i2c.o(.bss.hi2c2) + hi2c3 0x200002b0 Data 84 i2c.o(.bss.hi2c3) + hspi1 0x20000304 Data 88 spi.o(.bss.hspi1) + htim1 0x2000035c Data 72 tim.o(.bss.htim1) + htim10 0x200003a4 Data 72 tim.o(.bss.htim10) + htim4 0x200003ec Data 72 tim.o(.bss.htim4) + htim5 0x20000434 Data 72 tim.o(.bss.htim5) + huart6 0x2000047c Data 72 usart.o(.bss.huart6) + pxCurrentTCB 0x200005b8 Data 4 tasks.o(.bss.pxCurrentTCB) + uwTick 0x20004638 Data 4 stm32f4xx_hal.o(.bss.uwTick) + xQueueRegistry 0x20004d90 Data 64 queue.o(.bss.xQueueRegistry) + + + +============================================================================== + +Memory Map of the image + + Image Entry point : 0x08000189 + + Load Region LR_IROM1 (Base: 0x08000000, Size: 0x00004b58, Max: 0x00100000, ABSOLUTE) + + Execution Region ER_IROM1 (Exec base: 0x08000000, Load base: 0x08000000, Size: 0x00004b44, Max: 0x00100000, ABSOLUTE) + + Exec Addr Load Addr Size Type Attr Idx E Section Name Object + + 0x08000000 0x08000000 0x00000188 Data RO 3 RESET startup_stm32f407xx.o + 0x08000188 0x08000188 0x00000008 Code RO 2740 * !!!main c_w.l(__main.o) + 0x08000190 0x08000190 0x00000034 Code RO 3081 !!!scatter c_w.l(__scatter.o) + 0x080001c4 0x080001c4 0x0000001a Code RO 3083 !!handler_copy c_w.l(__scatter_copy.o) + 0x080001de 0x080001de 0x00000002 PAD + 0x080001e0 0x080001e0 0x0000001c Code RO 3085 !!handler_zi c_w.l(__scatter_zi.o) + 0x080001fc 0x080001fc 0x00000002 Code RO 2944 .ARM.Collect$$libinit$$00000000 c_w.l(libinit.o) + 0x080001fe 0x080001fe 0x00000004 Code RO 2955 .ARM.Collect$$libinit$$00000001 c_w.l(libinit2.o) + 0x08000202 0x08000202 0x00000000 Code RO 2958 .ARM.Collect$$libinit$$00000004 c_w.l(libinit2.o) + 0x08000202 0x08000202 0x00000000 Code RO 2961 .ARM.Collect$$libinit$$0000000A c_w.l(libinit2.o) + 0x08000202 0x08000202 0x00000000 Code RO 2963 .ARM.Collect$$libinit$$0000000C c_w.l(libinit2.o) + 0x08000202 0x08000202 0x00000000 Code RO 2965 .ARM.Collect$$libinit$$0000000E c_w.l(libinit2.o) + 0x08000202 0x08000202 0x00000000 Code RO 2968 .ARM.Collect$$libinit$$00000011 c_w.l(libinit2.o) + 0x08000202 0x08000202 0x00000000 Code RO 2970 .ARM.Collect$$libinit$$00000013 c_w.l(libinit2.o) + 0x08000202 0x08000202 0x00000000 Code RO 2972 .ARM.Collect$$libinit$$00000015 c_w.l(libinit2.o) + 0x08000202 0x08000202 0x00000000 Code RO 2974 .ARM.Collect$$libinit$$00000017 c_w.l(libinit2.o) + 0x08000202 0x08000202 0x00000000 Code RO 2976 .ARM.Collect$$libinit$$00000019 c_w.l(libinit2.o) + 0x08000202 0x08000202 0x00000000 Code RO 2978 .ARM.Collect$$libinit$$0000001B c_w.l(libinit2.o) + 0x08000202 0x08000202 0x00000000 Code RO 2980 .ARM.Collect$$libinit$$0000001D c_w.l(libinit2.o) + 0x08000202 0x08000202 0x00000000 Code RO 2982 .ARM.Collect$$libinit$$0000001F c_w.l(libinit2.o) + 0x08000202 0x08000202 0x00000000 Code RO 2984 .ARM.Collect$$libinit$$00000021 c_w.l(libinit2.o) + 0x08000202 0x08000202 0x00000000 Code RO 2986 .ARM.Collect$$libinit$$00000023 c_w.l(libinit2.o) + 0x08000202 0x08000202 0x00000000 Code RO 2988 .ARM.Collect$$libinit$$00000025 c_w.l(libinit2.o) + 0x08000202 0x08000202 0x00000000 Code RO 2992 .ARM.Collect$$libinit$$0000002C c_w.l(libinit2.o) + 0x08000202 0x08000202 0x00000000 Code RO 2994 .ARM.Collect$$libinit$$0000002E c_w.l(libinit2.o) + 0x08000202 0x08000202 0x00000000 Code RO 2996 .ARM.Collect$$libinit$$00000030 c_w.l(libinit2.o) + 0x08000202 0x08000202 0x00000000 Code RO 2998 .ARM.Collect$$libinit$$00000032 c_w.l(libinit2.o) + 0x08000202 0x08000202 0x00000002 Code RO 2999 .ARM.Collect$$libinit$$00000033 c_w.l(libinit2.o) + 0x08000204 0x08000204 0x00000002 Code RO 3036 .ARM.Collect$$libshutdown$$00000000 c_w.l(libshutdown.o) + 0x08000206 0x08000206 0x00000000 Code RO 3064 .ARM.Collect$$libshutdown$$00000002 c_w.l(libshutdown2.o) + 0x08000206 0x08000206 0x00000000 Code RO 3066 .ARM.Collect$$libshutdown$$00000004 c_w.l(libshutdown2.o) + 0x08000206 0x08000206 0x00000000 Code RO 3069 .ARM.Collect$$libshutdown$$00000007 c_w.l(libshutdown2.o) + 0x08000206 0x08000206 0x00000000 Code RO 3072 .ARM.Collect$$libshutdown$$0000000A c_w.l(libshutdown2.o) + 0x08000206 0x08000206 0x00000000 Code RO 3074 .ARM.Collect$$libshutdown$$0000000C c_w.l(libshutdown2.o) + 0x08000206 0x08000206 0x00000000 Code RO 3077 .ARM.Collect$$libshutdown$$0000000F c_w.l(libshutdown2.o) + 0x08000206 0x08000206 0x00000002 Code RO 3078 .ARM.Collect$$libshutdown$$00000010 c_w.l(libshutdown2.o) + 0x08000208 0x08000208 0x00000000 Code RO 2809 .ARM.Collect$$rtentry$$00000000 c_w.l(__rtentry.o) + 0x08000208 0x08000208 0x00000000 Code RO 2899 .ARM.Collect$$rtentry$$00000002 c_w.l(__rtentry2.o) + 0x08000208 0x08000208 0x00000006 Code RO 2911 .ARM.Collect$$rtentry$$00000004 c_w.l(__rtentry4.o) + 0x0800020e 0x0800020e 0x00000000 Code RO 2901 .ARM.Collect$$rtentry$$00000009 c_w.l(__rtentry2.o) + 0x0800020e 0x0800020e 0x00000004 Code RO 2902 .ARM.Collect$$rtentry$$0000000A c_w.l(__rtentry2.o) + 0x08000212 0x08000212 0x00000000 Code RO 2904 .ARM.Collect$$rtentry$$0000000C c_w.l(__rtentry2.o) + 0x08000212 0x08000212 0x00000008 Code RO 2905 .ARM.Collect$$rtentry$$0000000D c_w.l(__rtentry2.o) + 0x0800021a 0x0800021a 0x00000002 Code RO 2947 .ARM.Collect$$rtexit$$00000000 c_w.l(rtexit.o) + 0x0800021c 0x0800021c 0x00000000 Code RO 3007 .ARM.Collect$$rtexit$$00000002 c_w.l(rtexit2.o) + 0x0800021c 0x0800021c 0x00000004 Code RO 3008 .ARM.Collect$$rtexit$$00000003 c_w.l(rtexit2.o) + 0x08000220 0x08000220 0x00000006 Code RO 3009 .ARM.Collect$$rtexit$$00000004 c_w.l(rtexit2.o) + 0x08000226 0x08000226 0x00000002 PAD + 0x08000228 0x08000228 0x00000040 Code RO 4 .text startup_stm32f407xx.o + 0x08000268 0x08000268 0x000000f0 Code RO 2726 .text c_w.l(lludivv7m.o) + 0x08000358 0x08000358 0x0000008a Code RO 2728 .text c_w.l(rt_memcpy_v6.o) + 0x080003e2 0x080003e2 0x00000010 Code RO 2732 .text c_w.l(aeabi_memset4.o) + 0x080003f2 0x080003f2 0x0000004e Code RO 2736 .text c_w.l(rt_memclr_w.o) + 0x08000440 0x08000440 0x00000006 Code RO 2738 .text c_w.l(heapauxi.o) + 0x08000446 0x08000446 0x00000064 Code RO 2816 .text c_w.l(rt_memcpy_w.o) + 0x080004aa 0x080004aa 0x00000002 PAD + 0x080004ac 0x080004ac 0x00000008 Code RO 2928 .text c_w.l(libspace.o) + 0x080004b4 0x080004b4 0x0000004a Code RO 2931 .text c_w.l(sys_stackheap_outer.o) + 0x080004fe 0x080004fe 0x00000012 Code RO 2933 .text c_w.l(exit.o) + 0x08000510 0x08000510 0x0000000c Code RO 3002 .text c_w.l(sys_exit.o) + 0x0800051c 0x0800051c 0x00000002 Code RO 3025 .text c_w.l(use_no_semi.o) + 0x0800051e 0x0800051e 0x00000000 Code RO 3027 .text c_w.l(indicate_semi.o) + 0x0800051e 0x0800051e 0x00000002 PAD + 0x08000520 0x08000520 0x00000002 Code RO 145 .text.BusFault_Handler stm32f4xx_it.o + 0x08000522 0x08000522 0x00000002 PAD + 0x08000524 0x08000524 0x00000010 Code RO 157 .text.DMA1_Stream2_IRQHandler stm32f4xx_it.o + 0x08000534 0x08000534 0x00000010 Code RO 161 .text.DMA2_Stream1_IRQHandler stm32f4xx_it.o + 0x08000544 0x08000544 0x00000010 Code RO 163 .text.DMA2_Stream2_IRQHandler stm32f4xx_it.o + 0x08000554 0x08000554 0x00000010 Code RO 165 .text.DMA2_Stream3_IRQHandler stm32f4xx_it.o + 0x08000564 0x08000564 0x0000003c Code RO 369 .text.DMA_CalcBaseAndBitshift stm32f4xx_hal_dma.o + 0x080005a0 0x080005a0 0x00000050 Code RO 367 .text.DMA_CheckFifoParam stm32f4xx_hal_dma.o + 0x080005f0 0x080005f0 0x00000002 Code RO 149 .text.DebugMon_Handler stm32f4xx_it.o + 0x080005f2 0x080005f2 0x00000002 PAD + 0x080005f4 0x080005f4 0x0000000a Code RO 153 .text.EXTI3_IRQHandler stm32f4xx_it.o + 0x080005fe 0x080005fe 0x00000002 PAD + 0x08000600 0x08000600 0x0000000a Code RO 155 .text.EXTI4_IRQHandler stm32f4xx_it.o + 0x0800060a 0x0800060a 0x00000002 PAD + 0x0800060c 0x0800060c 0x0000000a Code RO 159 .text.EXTI9_5_IRQHandler stm32f4xx_it.o + 0x08000616 0x08000616 0x00000002 PAD + 0x08000618 0x08000618 0x00000006 Code RO 15 .text.Error_Handler main.o + 0x0800061e 0x0800061e 0x00000002 PAD + 0x08000620 0x08000620 0x00000080 Code RO 379 .text.HAL_DMA_Abort stm32f4xx_hal_dma.o + 0x080006a0 0x080006a0 0x00000024 Code RO 381 .text.HAL_DMA_Abort_IT stm32f4xx_hal_dma.o + 0x080006c4 0x080006c4 0x0000018c Code RO 385 .text.HAL_DMA_IRQHandler stm32f4xx_hal_dma.o + 0x08000850 0x08000850 0x000000ce Code RO 365 .text.HAL_DMA_Init stm32f4xx_hal_dma.o + 0x0800091e 0x0800091e 0x00000002 PAD + 0x08000920 0x08000920 0x0000002c Code RO 2164 .text.HAL_GPIO_EXTI_Callback gpio_1.o + 0x0800094c 0x0800094c 0x0000001a Code RO 337 .text.HAL_GPIO_EXTI_IRQHandler stm32f4xx_hal_gpio.o + 0x08000966 0x08000966 0x00000002 PAD + 0x08000968 0x08000968 0x0000019a Code RO 325 .text.HAL_GPIO_Init stm32f4xx_hal_gpio.o + 0x08000b02 0x08000b02 0x00000002 PAD + 0x08000b04 0x08000b04 0x0000000a Code RO 331 .text.HAL_GPIO_WritePin stm32f4xx_hal_gpio.o + 0x08000b0e 0x08000b0e 0x00000002 PAD + 0x08000b10 0x08000b10 0x0000000c Code RO 555 .text.HAL_GetTick stm32f4xx_hal.o + 0x08000b1c 0x08000b1c 0x00000198 Code RO 634 .text.HAL_I2C_Init stm32f4xx_hal_i2c.o + 0x08000cb4 0x08000cb4 0x00000156 Code RO 61 .text.HAL_I2C_MspInit i2c.o + 0x08000e0a 0x08000e0a 0x00000002 PAD + 0x08000e0c 0x08000e0c 0x0000001a Code RO 553 .text.HAL_IncTick stm32f4xx_hal.o + 0x08000e26 0x08000e26 0x00000002 PAD + 0x08000e28 0x08000e28 0x00000036 Code RO 543 .text.HAL_Init stm32f4xx_hal.o + 0x08000e5e 0x08000e5e 0x00000002 PAD + 0x08000e60 0x08000e60 0x00000050 Code RO 545 .text.HAL_InitTick stm32f4xx_hal.o + 0x08000eb0 0x08000eb0 0x00000046 Code RO 176 .text.HAL_MspInit stm32f4xx_hal_msp.o + 0x08000ef6 0x08000ef6 0x00000002 PAD + 0x08000ef8 0x08000ef8 0x00000008 Code RO 477 .text.HAL_NVIC_EnableIRQ stm32f4xx_hal_cortex.o + 0x08000f00 0x08000f00 0x0000001e Code RO 469 .text.HAL_NVIC_SetPriority stm32f4xx_hal_cortex.o + 0x08000f1e 0x08000f1e 0x00000002 PAD + 0x08000f20 0x08000f20 0x00000008 Code RO 465 .text.HAL_NVIC_SetPriorityGrouping stm32f4xx_hal_cortex.o + 0x08000f28 0x08000f28 0x00000160 Code RO 189 .text.HAL_RCC_ClockConfig stm32f4xx_hal_rcc.o + 0x08001088 0x08001088 0x0000000c Code RO 199 .text.HAL_RCC_GetHCLKFreq stm32f4xx_hal_rcc.o + 0x08001094 0x08001094 0x00000022 Code RO 201 .text.HAL_RCC_GetPCLK1Freq stm32f4xx_hal_rcc.o + 0x080010b6 0x080010b6 0x00000002 PAD + 0x080010b8 0x080010b8 0x00000022 Code RO 203 .text.HAL_RCC_GetPCLK2Freq stm32f4xx_hal_rcc.o + 0x080010da 0x080010da 0x00000002 PAD + 0x080010dc 0x080010dc 0x00000068 Code RO 191 .text.HAL_RCC_GetSysClockFreq stm32f4xx_hal_rcc.o + 0x08001144 0x08001144 0x00000348 Code RO 187 .text.HAL_RCC_OscConfig stm32f4xx_hal_rcc.o + 0x0800148c 0x0800148c 0x000000b4 Code RO 807 .text.HAL_SPI_Init stm32f4xx_hal_spi.o + 0x08001540 0x08001540 0x0000012e Code RO 78 .text.HAL_SPI_MspInit spi.o + 0x0800166e 0x0800166e 0x00000002 PAD + 0x08001670 0x08001670 0x00000008 Code RO 489 .text.HAL_SYSTICK_Config stm32f4xx_hal_cortex.o + 0x08001678 0x08001678 0x0000004c Code RO 1241 .text.HAL_TIMEx_ConfigBreakDeadTime stm32f4xx_hal_tim_ex.o + 0x080016c4 0x080016c4 0x000000b8 Code RO 1239 .text.HAL_TIMEx_MasterConfigSynchronization stm32f4xx_hal_tim_ex.o + 0x0800177c 0x0800177c 0x0000005a Code RO 925 .text.HAL_TIM_Base_Init stm32f4xx_hal_tim.o + 0x080017d6 0x080017d6 0x00000002 PAD + 0x080017d8 0x080017d8 0x00000036 Code RO 105 .text.HAL_TIM_Base_MspInit tim.o + 0x0800180e 0x0800180e 0x00000002 PAD + 0x08001810 0x08001810 0x00000142 Code RO 95 .text.HAL_TIM_MspPostInit tim.o + 0x08001952 0x08001952 0x00000002 PAD + 0x08001954 0x08001954 0x00000098 Code RO 1091 .text.HAL_TIM_PWM_ConfigChannel stm32f4xx_hal_tim.o + 0x080019ec 0x080019ec 0x0000005a Code RO 979 .text.HAL_TIM_PWM_Init stm32f4xx_hal_tim.o + 0x08001a46 0x08001a46 0x00000002 PAD + 0x08001a48 0x08001a48 0x0000008c Code RO 103 .text.HAL_TIM_PWM_MspInit tim.o + 0x08001ad4 0x08001ad4 0x00000002 Code RO 1355 .text.HAL_UARTEx_RxEventCallback stm32f4xx_hal_uart.o + 0x08001ad6 0x08001ad6 0x00000002 PAD + 0x08001ad8 0x08001ad8 0x00000026 Code RO 2300 .text.HAL_UART_ErrorCallback uart.o + 0x08001afe 0x08001afe 0x00000002 PAD + 0x08001b00 0x08001b00 0x0000025a Code RO 1347 .text.HAL_UART_IRQHandler stm32f4xx_hal_uart.o + 0x08001d5a 0x08001d5a 0x00000002 PAD + 0x08001d5c 0x08001d5c 0x00000060 Code RO 1263 .text.HAL_UART_Init stm32f4xx_hal_uart.o + 0x08001dbc 0x08001dbc 0x000000c2 Code RO 125 .text.HAL_UART_MspInit usart.o + 0x08001e7e 0x08001e7e 0x00000002 PAD + 0x08001e80 0x08001e80 0x00000026 Code RO 2296 .text.HAL_UART_RxCpltCallback uart.o + 0x08001ea6 0x08001ea6 0x00000002 PAD + 0x08001ea8 0x08001ea8 0x00000026 Code RO 2290 .text.HAL_UART_TxCpltCallback uart.o + 0x08001ece 0x08001ece 0x00000002 PAD + 0x08001ed0 0x08001ed0 0x00000002 Code RO 141 .text.HardFault_Handler stm32f4xx_it.o + 0x08001ed2 0x08001ed2 0x00000002 PAD + 0x08001ed4 0x08001ed4 0x0000007a Code RO 48 .text.MX_DMA_Init dma.o + 0x08001f4e 0x08001f4e 0x00000002 PAD + 0x08001f50 0x08001f50 0x00000024 Code RO 34 .text.MX_FREERTOS_Init freertos.o + 0x08001f74 0x08001f74 0x000001bc Code RO 25 .text.MX_GPIO_Init gpio.o + 0x08002130 0x08002130 0x0000003e Code RO 57 .text.MX_I2C2_Init i2c.o + 0x0800216e 0x0800216e 0x00000002 PAD + 0x08002170 0x08002170 0x0000003e Code RO 59 .text.MX_I2C3_Init i2c.o + 0x080021ae 0x080021ae 0x00000002 PAD + 0x080021b0 0x080021b0 0x0000004e Code RO 76 .text.MX_SPI1_Init spi.o + 0x080021fe 0x080021fe 0x00000002 PAD + 0x08002200 0x08002200 0x00000088 Code RO 101 .text.MX_TIM10_Init tim.o + 0x08002288 0x08002288 0x0000011a Code RO 93 .text.MX_TIM1_Init tim.o + 0x080023a2 0x080023a2 0x00000002 PAD + 0x080023a4 0x080023a4 0x00000092 Code RO 97 .text.MX_TIM4_Init tim.o + 0x08002436 0x08002436 0x00000002 PAD + 0x08002438 0x08002438 0x000000c2 Code RO 99 .text.MX_TIM5_Init tim.o + 0x080024fa 0x080024fa 0x00000002 PAD + 0x080024fc 0x080024fc 0x00000038 Code RO 123 .text.MX_USART6_UART_Init usart.o + 0x08002534 0x08002534 0x00000002 Code RO 143 .text.MemManage_Handler stm32f4xx_it.o + 0x08002536 0x08002536 0x00000002 PAD + 0x08002538 0x08002538 0x00000002 Code RO 139 .text.NMI_Handler stm32f4xx_it.o + 0x0800253a 0x0800253a 0x00000002 PAD + 0x0800253c 0x0800253c 0x0000002c Code RO 475 .text.NVIC_EncodePriority stm32f4xx_hal_cortex.o + 0x08002568 0x08002568 0x00000008 PAD + 0x08002570 0x08002570 0x00000064 Code RO 2068 .text.PendSV_Handler port.o + 0x080025d4 0x080025d4 0x0000000c PAD + 0x080025e0 0x080025e0 0x00000024 Code RO 2052 .text.SVC_Handler port.o + 0x08002604 0x08002604 0x00000008 Code RO 1846 .text.SVC_Setup cmsis_os2.o + 0x0800260c 0x0800260c 0x00000008 Code RO 36 .text.StartDefaultTask freertos.o + 0x08002614 0x08002614 0x0000002e Code RO 491 .text.SysTick_Config stm32f4xx_hal_cortex.o + 0x08002642 0x08002642 0x00000002 PAD + 0x08002644 0x08002644 0x00000014 Code RO 151 .text.SysTick_Handler stm32f4xx_it.o + 0x08002658 0x08002658 0x000000a4 Code RO 13 .text.SystemClock_Config main.o + 0x080026fc 0x080026fc 0x00000012 Code RO 1395 .text.SystemInit system_stm32f4xx.o + 0x0800270e 0x0800270e 0x00000002 PAD + 0x08002710 0x08002710 0x0000012c Code RO 929 .text.TIM_Base_SetConfig stm32f4xx_hal_tim.o + 0x0800283c 0x0800283c 0x00000064 Code RO 1073 .text.TIM_OC1_SetConfig stm32f4xx_hal_tim.o + 0x080028a0 0x080028a0 0x0000006a Code RO 1075 .text.TIM_OC2_SetConfig stm32f4xx_hal_tim.o + 0x0800290a 0x0800290a 0x00000002 PAD + 0x0800290c 0x0800290c 0x00000068 Code RO 1077 .text.TIM_OC3_SetConfig stm32f4xx_hal_tim.o + 0x08002974 0x08002974 0x0000004e Code RO 1079 .text.TIM_OC4_SetConfig stm32f4xx_hal_tim.o + 0x080029c2 0x080029c2 0x00000002 PAD + 0x080029c4 0x080029c4 0x0000000e Code RO 1351 .text.UART_DMAAbortOnError stm32f4xx_hal_uart.o + 0x080029d2 0x080029d2 0x00000002 PAD + 0x080029d4 0x080029d4 0x00000050 Code RO 1311 .text.UART_EndRxTransfer stm32f4xx_hal_uart.o + 0x08002a24 0x08002a24 0x00000018 Code RO 1359 .text.UART_EndTransmit_IT stm32f4xx_hal_uart.o + 0x08002a3c 0x08002a3c 0x00000014 Code RO 2292 .text.UART_Get uart.o + 0x08002a50 0x08002a50 0x000000c8 Code RO 1349 .text.UART_Receive_IT stm32f4xx_hal_uart.o + 0x08002b18 0x08002b18 0x000000dc Code RO 1267 .text.UART_SetConfig stm32f4xx_hal_uart.o + 0x08002bf4 0x08002bf4 0x00000052 Code RO 1357 .text.UART_Transmit_IT stm32f4xx_hal_uart.o + 0x08002c46 0x08002c46 0x00000002 PAD + 0x08002c48 0x08002c48 0x00000010 Code RO 167 .text.USART6_IRQHandler stm32f4xx_it.o + 0x08002c58 0x08002c58 0x00000002 Code RO 147 .text.UsageFault_Handler stm32f4xx_it.o + 0x08002c5a 0x08002c5a 0x00000002 PAD + 0x08002c5c 0x08002c5c 0x00000020 Code RO 479 .text.__NVIC_EnableIRQ stm32f4xx_hal_cortex.o + 0x08002c7c 0x08002c7c 0x00000010 Code RO 471 .text.__NVIC_GetPriorityGrouping stm32f4xx_hal_cortex.o + 0x08002c8c 0x08002c8c 0x00000022 Code RO 473 .text.__NVIC_SetPriority stm32f4xx_hal_cortex.o + 0x08002cae 0x08002cae 0x00000002 PAD + 0x08002cb0 0x08002cb0 0x0000000e Code RO 2000 .text.__NVIC_SetPriority cmsis_os2.o + 0x08002cbe 0x08002cbe 0x00000002 PAD + 0x08002cc0 0x08002cc0 0x00000020 Code RO 467 .text.__NVIC_SetPriorityGrouping stm32f4xx_hal_cortex.o + 0x08002ce0 0x08002ce0 0x0000003e Code RO 11 .text.main main.o + 0x08002d1e 0x08002d1e 0x00000002 PAD + 0x08002d20 0x08002d20 0x00000020 Code RO 1904 .text.osDelay cmsis_os2.o + 0x08002d40 0x08002d40 0x00000028 Code RO 1838 .text.osKernelInitialize cmsis_os2.o + 0x08002d68 0x08002d68 0x00000034 Code RO 1844 .text.osKernelStart cmsis_os2.o + 0x08002d9c 0x08002d9c 0x000000b4 Code RO 1868 .text.osThreadNew cmsis_os2.o + 0x08002e50 0x08002e50 0x00000080 Code RO 1632 .text.prvAddCurrentTaskToDelayedList tasks.o + 0x08002ed0 0x08002ed0 0x000000ac Code RO 1618 .text.prvAddNewTaskToReadyList tasks.o + 0x08002f7c 0x08002f7c 0x0000007c Code RO 1769 .text.prvCheckForValidListAndQueue timers.o + 0x08002ff8 0x08002ff8 0x0000004e Code RO 1736 .text.prvCheckTasksWaitingTermination tasks.o + 0x08003046 0x08003046 0x00000002 PAD + 0x08003048 0x08003048 0x00000026 Code RO 1509 .text.prvCopyDataFromQueue queue.o + 0x0800306e 0x0800306e 0x00000002 PAD + 0x08003070 0x08003070 0x0000007a Code RO 1497 .text.prvCopyDataToQueue queue.o + 0x080030ea 0x080030ea 0x00000002 PAD + 0x080030ec 0x080030ec 0x00000036 Code RO 1624 .text.prvDeleteTCB tasks.o + 0x08003122 0x08003122 0x00000002 PAD + 0x08003124 0x08003124 0x00000020 Code RO 1807 .text.prvGetNextExpireTime timers.o + 0x08003144 0x08003144 0x00000076 Code RO 2018 .text.prvHeapInit heap_4.o + 0x080031ba 0x080031ba 0x00000002 PAD + 0x080031bc 0x080031bc 0x0000002a Code RO 1658 .text.prvIdleTask tasks.o + 0x080031e6 0x080031e6 0x00000002 PAD + 0x080031e8 0x080031e8 0x00000020 Code RO 1471 .text.prvInitialiseNewQueue queue.o + 0x08003208 0x08003208 0x00000098 Code RO 1616 .text.prvInitialiseNewTask tasks.o + 0x080032a0 0x080032a0 0x00000070 Code RO 1734 .text.prvInitialiseTaskLists tasks.o + 0x08003310 0x08003310 0x0000005a Code RO 2020 .text.prvInsertBlockIntoFreeList heap_4.o + 0x0800336a 0x0800336a 0x00000002 PAD + 0x0800336c 0x0800336c 0x00000040 Code RO 1819 .text.prvInsertTimerInActiveList timers.o + 0x080033ac 0x080033ac 0x00000018 Code RO 1511 .text.prvIsQueueEmpty queue.o + 0x080033c4 0x080033c4 0x0000001c Code RO 1499 .text.prvIsQueueFull queue.o + 0x080033e0 0x080033e0 0x00000028 Code RO 2060 .text.prvPortStartFirstTask port.o + 0x08003408 0x08003408 0x0000006e Code RO 1815 .text.prvProcessExpiredTimer timers.o + 0x08003476 0x08003476 0x00000002 PAD + 0x08003478 0x08003478 0x00000122 Code RO 1811 .text.prvProcessReceivedCommands timers.o + 0x0800359a 0x0800359a 0x00000002 PAD + 0x0800359c 0x0800359c 0x00000080 Code RO 1809 .text.prvProcessTimerOrBlockTask timers.o + 0x0800361c 0x0800361c 0x00000028 Code RO 1626 .text.prvResetNextTaskUnblockTime tasks.o + 0x08003644 0x08003644 0x0000002a Code RO 1813 .text.prvSampleTimeNow timers.o + 0x0800366e 0x0800366e 0x00000002 PAD + 0x08003670 0x08003670 0x0000008e Code RO 1817 .text.prvSwitchTimerLists timers.o + 0x080036fe 0x080036fe 0x00000002 PAD + 0x08003700 0x08003700 0x00000032 Code RO 2050 .text.prvTaskExitError port.o + 0x08003732 0x08003732 0x00000002 PAD + 0x08003734 0x08003734 0x00000016 Code RO 1771 .text.prvTimerTask timers.o + 0x0800374a 0x0800374a 0x00000002 PAD + 0x0800374c 0x0800374c 0x00000072 Code RO 1501 .text.prvUnlockQueue queue.o + 0x080037be 0x080037be 0x00000002 PAD + 0x080037c0 0x080037c0 0x0000014a Code RO 2016 .text.pvPortMalloc heap_4.o + 0x0800390a 0x0800390a 0x00000002 PAD + 0x0800390c 0x0800390c 0x00000028 Code RO 2048 .text.pxPortInitialiseStack port.o + 0x08003934 0x08003934 0x00000024 Code RO 1457 .text.uxListRemove list.o + 0x08003958 0x08003958 0x0000001a Code RO 1996 .text.vApplicationGetIdleTaskMemory cmsis_os2.o + 0x08003972 0x08003972 0x00000002 PAD + 0x08003974 0x08003974 0x0000001c Code RO 1998 .text.vApplicationGetTimerTaskMemory cmsis_os2.o + 0x08003990 0x08003990 0x00000016 Code RO 1449 .text.vListInitialise list.o + 0x080039a6 0x080039a6 0x00000002 PAD + 0x080039a8 0x080039a8 0x00000006 Code RO 1451 .text.vListInitialiseItem list.o + 0x080039ae 0x080039ae 0x00000002 PAD + 0x080039b0 0x080039b0 0x0000003a Code RO 1455 .text.vListInsert list.o + 0x080039ea 0x080039ea 0x00000002 PAD + 0x080039ec 0x080039ec 0x0000001c Code RO 1453 .text.vListInsertEnd list.o + 0x08003a08 0x08003a08 0x00000014 Code RO 2058 .text.vPortEnableVFP port.o + 0x08003a1c 0x08003a1c 0x00000046 Code RO 2064 .text.vPortEnterCritical port.o + 0x08003a62 0x08003a62 0x00000002 PAD + 0x08003a64 0x08003a64 0x0000002e Code RO 2066 .text.vPortExitCritical port.o + 0x08003a92 0x08003a92 0x00000002 PAD + 0x08003a94 0x08003a94 0x0000008a Code RO 2022 .text.vPortFree heap_4.o + 0x08003b1e 0x08003b1e 0x00000002 PAD + 0x08003b20 0x08003b20 0x00000034 Code RO 2056 .text.vPortSetupTimerInterrupt port.o + 0x08003b54 0x08003b54 0x00000062 Code RO 2072 .text.vPortValidateInterruptPriority port.o + 0x08003bb6 0x08003bb6 0x00000002 PAD + 0x08003bb8 0x08003bb8 0x00000028 Code RO 1541 .text.vQueueAddToRegistry queue.o + 0x08003be0 0x08003be0 0x00000044 Code RO 1545 .text.vQueueWaitForMessageRestricted queue.o + 0x08003c24 0x08003c24 0x00000054 Code RO 1636 .text.vTaskDelay tasks.o + 0x08003c78 0x08003c78 0x0000001a Code RO 1690 .text.vTaskInternalSetTimeOutState tasks.o + 0x08003c92 0x08003c92 0x00000002 PAD + 0x08003c94 0x08003c94 0x0000000e Code RO 1694 .text.vTaskMissedYield tasks.o + 0x08003ca2 0x08003ca2 0x00000002 PAD + 0x08003ca4 0x08003ca4 0x00000032 Code RO 1678 .text.vTaskPlaceOnEventList tasks.o + 0x08003cd6 0x08003cd6 0x00000002 PAD + 0x08003cd8 0x08003cd8 0x0000003e Code RO 1682 .text.vTaskPlaceOnEventListRestricted tasks.o + 0x08003d16 0x08003d16 0x00000002 PAD + 0x08003d18 0x08003d18 0x000000a4 Code RO 1656 .text.vTaskStartScheduler tasks.o + 0x08003dbc 0x08003dbc 0x00000010 Code RO 1630 .text.vTaskSuspendAll tasks.o + 0x08003dcc 0x08003dcc 0x0000009a Code RO 1648 .text.vTaskSwitchContext tasks.o + 0x08003e66 0x08003e66 0x00000002 PAD + 0x08003e68 0x08003e68 0x00000112 Code RO 2054 .text.xPortStartScheduler port.o + 0x08003f7a 0x08003f7a 0x00000002 PAD + 0x08003f7c 0x08003f7c 0x0000002e Code RO 2070 .text.xPortSysTickHandler port.o + 0x08003faa 0x08003faa 0x00000002 PAD + 0x08003fac 0x08003fac 0x00000096 Code RO 1469 .text.xQueueGenericCreateStatic queue.o + 0x08004042 0x08004042 0x00000002 PAD + 0x08004044 0x08004044 0x0000007e Code RO 1467 .text.xQueueGenericReset queue.o + 0x080040c2 0x080040c2 0x00000002 PAD + 0x080040c4 0x080040c4 0x000001a2 Code RO 1487 .text.xQueueGenericSend queue.o + 0x08004266 0x08004266 0x00000002 PAD + 0x08004268 0x08004268 0x000000ce Code RO 1503 .text.xQueueGenericSendFromISR queue.o + 0x08004336 0x08004336 0x00000002 PAD + 0x08004338 0x08004338 0x00000184 Code RO 1507 .text.xQueueReceive queue.o + 0x080044bc 0x080044bc 0x00000088 Code RO 1692 .text.xTaskCheckForTimeOut tasks.o + 0x08004544 0x08004544 0x00000066 Code RO 1620 .text.xTaskCreate tasks.o + 0x080045aa 0x080045aa 0x00000002 PAD + 0x080045ac 0x080045ac 0x00000076 Code RO 1614 .text.xTaskCreateStatic tasks.o + 0x08004622 0x08004622 0x00000002 PAD + 0x08004624 0x08004624 0x00000026 Code RO 1708 .text.xTaskGetSchedulerState tasks.o + 0x0800464a 0x0800464a 0x00000002 PAD + 0x0800464c 0x0800464c 0x0000000c Code RO 1664 .text.xTaskGetTickCount tasks.o + 0x08004658 0x08004658 0x00000152 Code RO 1662 .text.xTaskIncrementTick tasks.o + 0x080047aa 0x080047aa 0x00000002 PAD + 0x080047ac 0x080047ac 0x00000092 Code RO 1712 .text.xTaskPriorityDisinherit tasks.o + 0x0800483e 0x0800483e 0x00000002 PAD + 0x08004840 0x08004840 0x0000008e Code RO 1684 .text.xTaskRemoveFromEventList tasks.o + 0x080048ce 0x080048ce 0x00000002 PAD + 0x080048d0 0x080048d0 0x00000114 Code RO 1634 .text.xTaskResumeAll tasks.o + 0x080049e4 0x080049e4 0x00000074 Code RO 1767 .text.xTimerCreateTimerTask timers.o + 0x08004a58 0x08004a58 0x00000068 Code RO 1779 .text.xTimerGenericCommand timers.o + 0x08004ac0 0x08004ac0 0x0000001a Code RO 3019 x$fpl$fpinit fz_wm.l(fpinit.o) + 0x08004ada 0x08004ada 0x00000010 Data RO 1400 .rodata.AHBPrescTable system_stm32f4xx.o + 0x08004aea 0x08004aea 0x00000008 Data RO 1401 .rodata.APBPrescTable system_stm32f4xx.o + 0x08004af2 0x08004af2 0x00000002 PAD + 0x08004af4 0x08004af4 0x00000024 Data RO 39 .rodata.defaultTask_attributes freertos.o + 0x08004b18 0x08004b18 0x0000000c Data RO 38 .rodata.str1.1 freertos.o + 0x08004b24 0x08004b24 0x00000020 Data RO 3080 Region$$Table anon$$obj.o + + + Execution Region RW_IRAM1 (Exec base: 0x20000000, Load base: 0x08004b48, Size: 0x00005418, Max: 0x0001c000, ABSOLUTE) + + Exec Addr Load Addr Size Type Attr Idx E Section Name Object + + 0x20000000 0x08004b48 0x00000004 Data RW 1399 .data.SystemCoreClock system_stm32f4xx.o + 0x20000004 0x08004b4c 0x00000001 Data RW 598 .data.uwTickFreq stm32f4xx_hal.o + 0x20000005 0x08004b4d 0x00000003 PAD + 0x20000008 0x08004b50 0x00000004 Data RW 597 .data.uwTickPrio stm32f4xx_hal.o + 0x2000000c 0x08004b54 0x00000004 Data RW 2076 .data.uxCriticalNesting port.o + 0x20000010 - 0x00000060 Zero RW 2929 .bss c_w.l(libspace.o) + 0x20000070 - 0x00000040 Zero RW 2172 .bss.GPIO_Callback gpio_1.o + 0x200000b0 - 0x00000004 Zero RW 2002 .bss.KernelState cmsis_os2.o + 0x200000b4 - 0x00000024 Zero RW 2318 .bss.UART_Callback uart.o + 0x200000d8 - 0x00000004 Zero RW 40 .bss.defaultTaskHandle freertos.o + 0x200000dc - 0x00000060 Zero RW 67 .bss.hdma_i2c3_rx i2c.o + 0x2000013c - 0x00000060 Zero RW 83 .bss.hdma_spi1_rx spi.o + 0x2000019c - 0x00000060 Zero RW 84 .bss.hdma_spi1_tx spi.o + 0x200001fc - 0x00000060 Zero RW 130 .bss.hdma_usart6_rx usart.o + 0x2000025c - 0x00000054 Zero RW 65 .bss.hi2c2 i2c.o + 0x200002b0 - 0x00000054 Zero RW 66 .bss.hi2c3 i2c.o + 0x20000304 - 0x00000058 Zero RW 82 .bss.hspi1 spi.o + 0x2000035c - 0x00000048 Zero RW 111 .bss.htim1 tim.o + 0x200003a4 - 0x00000048 Zero RW 114 .bss.htim10 tim.o + 0x200003ec - 0x00000048 Zero RW 112 .bss.htim4 tim.o + 0x20000434 - 0x00000048 Zero RW 113 .bss.htim5 tim.o + 0x2000047c - 0x00000048 Zero RW 129 .bss.huart6 usart.o + 0x200004c4 - 0x000000a0 Zero RW 1829 .bss.prvCheckForValidListAndQueue.ucStaticTimerQueueStorage timers.o + 0x20000564 - 0x00000050 Zero RW 1828 .bss.prvCheckForValidListAndQueue.xStaticTimerQueue timers.o + 0x200005b4 - 0x00000004 Zero RW 1825 .bss.prvSampleTimeNow.xLastTime timers.o + 0x200005b8 - 0x00000004 Zero RW 1738 .bss.pxCurrentTCB tasks.o + 0x200005bc - 0x00000004 Zero RW 1823 .bss.pxCurrentTimerList timers.o + 0x200005c0 - 0x00000004 Zero RW 1746 .bss.pxDelayedTaskList tasks.o + 0x200005c4 - 0x00000004 Zero RW 2032 .bss.pxEnd heap_4.o + 0x200005c8 - 0x00000004 Zero RW 1747 .bss.pxOverflowDelayedTaskList tasks.o + 0x200005cc - 0x00000004 Zero RW 1824 .bss.pxOverflowTimerList timers.o + 0x200005d0 - 0x00000460 Zero RW 1749 .bss.pxReadyTasksLists tasks.o + 0x20000a30 - 0x00003c00 Zero RW 2039 .bss.ucHeap heap_4.o + 0x20004630 - 0x00000001 Zero RW 2074 .bss.ucMaxSysCallPriority port.o + 0x20004631 0x08004b58 0x00000003 PAD + 0x20004634 - 0x00000004 Zero RW 2075 .bss.ulMaxPRIGROUPValue port.o + 0x20004638 - 0x00000004 Zero RW 599 .bss.uwTick stm32f4xx_hal.o + 0x2000463c - 0x00000004 Zero RW 1742 .bss.uxCurrentNumberOfTasks tasks.o + 0x20004640 - 0x00000004 Zero RW 1741 .bss.uxDeletedTasksWaitingCleanUp tasks.o + 0x20004644 - 0x00000004 Zero RW 1744 .bss.uxSchedulerSuspended tasks.o + 0x20004648 - 0x00000004 Zero RW 1739 .bss.uxTaskNumber tasks.o + 0x2000464c - 0x00000004 Zero RW 1750 .bss.uxTopReadyPriority tasks.o + 0x20004650 - 0x00000200 Zero RW 2005 .bss.vApplicationGetIdleTaskMemory.Idle_Stack cmsis_os2.o + 0x20004850 - 0x0000005c Zero RW 2004 .bss.vApplicationGetIdleTaskMemory.Idle_TCB cmsis_os2.o + 0x200048ac - 0x00000400 Zero RW 2007 .bss.vApplicationGetTimerTaskMemory.Timer_Stack cmsis_os2.o + 0x20004cac - 0x0000005c Zero RW 2006 .bss.vApplicationGetTimerTaskMemory.Timer_TCB cmsis_os2.o + 0x20004d08 - 0x00000014 Zero RW 1826 .bss.xActiveTimerList1 timers.o + 0x20004d1c - 0x00000014 Zero RW 1827 .bss.xActiveTimerList2 timers.o + 0x20004d30 - 0x00000001 Zero RW 2033 .bss.xBlockAllocatedBit heap_4.o + 0x20004d31 0x08004b58 0x00000003 PAD + 0x20004d34 - 0x00000014 Zero RW 1757 .bss.xDelayedTaskList1 tasks.o + 0x20004d48 - 0x00000014 Zero RW 1758 .bss.xDelayedTaskList2 tasks.o + 0x20004d5c - 0x00000004 Zero RW 2034 .bss.xFreeBytesRemaining heap_4.o + 0x20004d60 - 0x00000004 Zero RW 1752 .bss.xIdleTaskHandle tasks.o + 0x20004d64 - 0x00000004 Zero RW 2036 .bss.xMinimumEverFreeBytesRemaining heap_4.o + 0x20004d68 - 0x00000004 Zero RW 1753 .bss.xNextTaskUnblockTime tasks.o + 0x20004d6c - 0x00000004 Zero RW 1756 .bss.xNumOfOverflows tasks.o + 0x20004d70 - 0x00000004 Zero RW 2037 .bss.xNumberOfSuccessfulAllocations heap_4.o + 0x20004d74 - 0x00000004 Zero RW 2038 .bss.xNumberOfSuccessfulFrees heap_4.o + 0x20004d78 - 0x00000004 Zero RW 1755 .bss.xPendedTicks tasks.o + 0x20004d7c - 0x00000014 Zero RW 1751 .bss.xPendingReadyList tasks.o + 0x20004d90 - 0x00000040 Zero RW 1547 .bss.xQueueRegistry queue.o + 0x20004dd0 - 0x00000004 Zero RW 1743 .bss.xSchedulerRunning tasks.o + 0x20004dd4 - 0x00000008 Zero RW 2035 .bss.xStart heap_4.o + 0x20004ddc - 0x00000014 Zero RW 1748 .bss.xSuspendedTaskList tasks.o + 0x20004df0 - 0x00000014 Zero RW 1740 .bss.xTasksWaitingTermination tasks.o + 0x20004e04 - 0x00000004 Zero RW 1745 .bss.xTickCount tasks.o + 0x20004e08 - 0x00000004 Zero RW 1821 .bss.xTimerQueue timers.o + 0x20004e0c - 0x00000004 Zero RW 1822 .bss.xTimerTaskHandle timers.o + 0x20004e10 - 0x00000004 Zero RW 1754 .bss.xYieldPending tasks.o + 0x20004e14 0x08004b58 0x00000004 PAD + 0x20004e18 - 0x00000200 Zero RW 2 HEAP startup_stm32f407xx.o + 0x20005018 - 0x00000400 Zero RW 1 STACK startup_stm32f407xx.o + + + Execution Region RW_IRAM2 (Exec base: 0x2001c000, Load base: 0x08004b58, Size: 0x00000000, Max: 0x00004000, ABSOLUTE) + + **** No section assigned to this execution region **** + + +============================================================================== + +Image component sizes + + + Code (inc. data) RO Data RW Data ZI Data Debug Object Name + + 380 0 0 0 1724 42602 cmsis_os2.o + 122 0 0 0 0 3307 dma.o + 44 0 48 0 4 2518 freertos.o + 444 0 0 0 0 4164 gpio.o + 44 0 0 0 64 3565 gpio_1.o + 676 0 0 0 15389 4715 heap_4.o + 466 0 0 0 264 5493 i2c.o + 150 0 0 0 0 2193 list.o + 232 0 0 0 0 2720 main.o + 872 16 0 4 5 3802 port.o + 1754 0 0 0 64 22588 queue.o + 380 0 0 0 280 5127 spi.o + 64 26 392 0 1536 812 startup_stm32f407xx.o + 172 0 0 5 4 7286 stm32f4xx_hal.o + 258 0 0 0 0 10958 stm32f4xx_hal_cortex.o + 906 12 0 0 0 9228 stm32f4xx_hal_dma.o + 446 0 0 0 0 5157 stm32f4xx_hal_gpio.o + 408 0 0 0 0 39550 stm32f4xx_hal_i2c.o + 70 0 0 0 0 3328 stm32f4xx_hal_msp.o + 1376 0 0 0 0 7265 stm32f4xx_hal_rcc.o + 180 0 0 0 0 20865 stm32f4xx_hal_spi.o + 1020 4 0 0 0 44553 stm32f4xx_hal_tim.o + 260 0 0 0 0 19127 stm32f4xx_hal_tim_ex.o + 1320 0 0 0 0 24658 stm32f4xx_hal_uart.o + 142 0 0 0 0 1908 stm32f4xx_it.o + 18 0 24 4 0 2522 system_stm32f4xx.o + 2656 8 0 0 1280 29913 tasks.o + 1274 0 0 0 288 7601 tim.o + 1174 26 0 0 300 14806 timers.o + 134 0 0 0 36 6962 uart.o + 250 0 0 0 168 6843 usart.o + + ---------------------------------------------------------------------- + 17888 104 498 16 21416 366136 Object Totals + 0 0 32 0 0 0 (incl. Generated) + 196 12 2 3 10 0 (incl. Padding) + + ---------------------------------------------------------------------- + + Code (inc. data) RO Data RW Data ZI Data Debug Library Member Name + + 8 0 0 0 0 68 __main.o + 0 0 0 0 0 0 __rtentry.o + 12 0 0 0 0 0 __rtentry2.o + 6 0 0 0 0 0 __rtentry4.o + 52 8 0 0 0 0 __scatter.o + 26 0 0 0 0 0 __scatter_copy.o + 28 0 0 0 0 0 __scatter_zi.o + 16 0 0 0 0 68 aeabi_memset4.o + 18 0 0 0 0 80 exit.o + 6 0 0 0 0 152 heapauxi.o + 0 0 0 0 0 0 indicate_semi.o + 2 0 0 0 0 0 libinit.o + 6 0 0 0 0 0 libinit2.o + 2 0 0 0 0 0 libshutdown.o + 2 0 0 0 0 0 libshutdown2.o + 8 4 0 0 96 68 libspace.o + 240 0 0 0 0 100 lludivv7m.o + 78 0 0 0 0 80 rt_memclr_w.o + 138 0 0 0 0 68 rt_memcpy_v6.o + 100 0 0 0 0 80 rt_memcpy_w.o + 2 0 0 0 0 0 rtexit.o + 10 0 0 0 0 0 rtexit2.o + 12 4 0 0 0 68 sys_exit.o + 74 0 0 0 0 80 sys_stackheap_outer.o + 2 0 0 0 0 68 use_no_semi.o + 26 0 0 0 0 116 fpinit.o + + ---------------------------------------------------------------------- + 882 16 0 0 96 1096 Library Totals + 8 0 0 0 0 0 (incl. Padding) + + ---------------------------------------------------------------------- + + Code (inc. data) RO Data RW Data ZI Data Debug Library Name + + 848 16 0 0 96 980 c_w.l + 26 0 0 0 0 116 fz_wm.l + + ---------------------------------------------------------------------- + 882 16 0 0 96 1096 Library Totals + + ---------------------------------------------------------------------- + +============================================================================== + + + Code (inc. data) RO Data RW Data ZI Data Debug + + 18770 120 498 16 21512 366352 Grand Totals + 18770 120 498 16 21512 366352 ELF Image Totals + 18770 120 498 16 0 0 ROM Totals + +============================================================================== + + Total RO Size (Code + RO Data) 19268 ( 18.82kB) + Total RW Size (RW Data + ZI Data) 21528 ( 21.02kB) + Total ROM Size (Code + RO Data + RW Data) 19284 ( 18.83kB) + +============================================================================== + diff --git a/MDK-ARM/DveC/DveC.sct b/MDK-ARM/DveC/DveC.sct new file mode 100644 index 0000000..a335d3e --- /dev/null +++ b/MDK-ARM/DveC/DveC.sct @@ -0,0 +1,19 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00100000 { ; load region size_region + ER_IROM1 0x08000000 0x00100000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + .ANY (+XO) + } + RW_IRAM1 0x20000000 0x0001C000 { ; RW data + .ANY (+RW +ZI) + } + RW_IRAM2 0x2001C000 0x00004000 { + .ANY (+RW +ZI) + } +} + diff --git a/MDK-ARM/DveC/DveC_DveC.dep b/MDK-ARM/DveC/DveC_DveC.dep new file mode 100644 index 0000000..66eb747 --- /dev/null +++ b/MDK-ARM/DveC/DveC_DveC.dep @@ -0,0 +1,2291 @@ +Dependencies for Project 'DveC', Target 'DveC': (DO NOT MODIFY !) +CompilerVersion: 6160000::V6.16::ARMCLANG +F (startup_stm32f407xx.s)(0x68DF6BC2)(--target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -masm=auto -c -gdwarf-3 -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -Wa,armasm,--pd,"__UVISION_VERSION SETA 534" -Wa,armasm,--pd,"_RTE_ SETA 1" -Wa,armasm,--pd,"STM32F407xx SETA 1" -Wa,armasm,--pd,"_RTE_ SETA 1" -o dvec/startup_stm32f407xx.o) +F (../Core/Src/main.c)(0x68DF6BC1)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/main.o -MD) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +I (..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h)(0x68AD8208) +I (..\Core\Inc\FreeRTOSConfig.h)(0x68DF6BBF) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\portable.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.h)(0x68AD8208) +I (..\Core\Inc\dma.h)(0x68DF6BC0) +I (..\Core\Inc\i2c.h)(0x68DF6BC0) +I (..\Core\Inc\spi.h)(0x68DF6BC0) +I (..\Core\Inc\tim.h)(0x68DF6BC0) +I (..\Core\Inc\usart.h)(0x68DF6BC0) +I (..\Core\Inc\gpio.h)(0x68DF6BBE) +F (../Core/Src/gpio.c)(0x68DF6BBE)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/gpio.o -MD) +I (..\Core\Inc\gpio.h)(0x68DF6BBE) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Core/Src/freertos.c)(0x68DF6BC0)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/freertos.o -MD) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h)(0x68AD8208) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Core\Inc\FreeRTOSConfig.h)(0x68DF6BBF) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\portable.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h)(0x68AD8208) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +I (..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.h)(0x68AD8208) +F (../Core/Src/dma.c)(0x68DF6BC0)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/dma.o -MD) +I (..\Core\Inc\dma.h)(0x68DF6BC0) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Core/Src/i2c.c)(0x68DF6BC0)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/i2c.o -MD) +I (..\Core\Inc\i2c.h)(0x68DF6BC0) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Core/Src/spi.c)(0x68DF6BC0)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/spi.o -MD) +I (..\Core\Inc\spi.h)(0x68DF6BC0) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Core/Src/tim.c)(0x68DF6BC0)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/tim.o -MD) +I (..\Core\Inc\tim.h)(0x68DF6BC0) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Core/Src/usart.c)(0x68DF6BC0)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/usart.o -MD) +I (..\Core\Inc\usart.h)(0x68DF6BC0) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Core/Src/stm32f4xx_it.c)(0x68DF6BC0)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/stm32f4xx_it.o -MD) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_it.h)(0x68DF6BC0) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h)(0x68AD8208) +I (..\Core\Inc\FreeRTOSConfig.h)(0x68DF6BBF) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\portable.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h)(0x68AD8208) +F (../Core/Src/stm32f4xx_hal_msp.c)(0x68DF6BC0)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/stm32f4xx_hal_msp.o -MD) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c)(0x68AD823F)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/stm32f4xx_hal_rcc.o -MD) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c)(0x68AD823F)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/stm32f4xx_hal_rcc_ex.o -MD) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c)(0x68AD823F)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/stm32f4xx_hal_flash.o -MD) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c)(0x68AD823F)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/stm32f4xx_hal_flash_ex.o -MD) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c)(0x68AD823F)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/stm32f4xx_hal_flash_ramfunc.o -MD) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c)(0x68AD823F)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/stm32f4xx_hal_gpio.o -MD) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c)(0x68AD823F)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/stm32f4xx_hal_dma_ex.o -MD) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c)(0x68AD823F)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/stm32f4xx_hal_dma.o -MD) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c)(0x68AD823F)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/stm32f4xx_hal_pwr.o -MD) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c)(0x68AD823F)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/stm32f4xx_hal_pwr_ex.o -MD) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c)(0x68AD823F)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/stm32f4xx_hal_cortex.o -MD) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c)(0x68AD823F)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/stm32f4xx_hal.o -MD) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c)(0x68AD823F)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/stm32f4xx_hal_exti.o -MD) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c)(0x68AD823F)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/stm32f4xx_hal_i2c.o -MD) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c)(0x68AD823F)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/stm32f4xx_hal_i2c_ex.o -MD) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c)(0x68AD823F)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/stm32f4xx_hal_spi.o -MD) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c)(0x68AD823F)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/stm32f4xx_hal_tim.o -MD) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c)(0x68AD823F)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/stm32f4xx_hal_tim_ex.o -MD) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c)(0x68AD823F)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/stm32f4xx_hal_uart.o -MD) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Core/Src/system_stm32f4xx.c)(0x68AD823F)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/system_stm32f4xx.o -MD) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Middlewares/Third_Party/FreeRTOS/Source/croutine.c)(0x68AD8208)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/croutine.o -MD) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h)(0x68AD8208) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Core\Inc\FreeRTOSConfig.h)(0x68DF6BBF) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\portable.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\croutine.h)(0x68AD8208) +F (../Middlewares/Third_Party/FreeRTOS/Source/event_groups.c)(0x68AD8208)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/event_groups.o -MD) +I (D:\cangming\ARM\ARMCLANG\include\stdlib.h)(0x6035A4A8) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h)(0x68AD8208) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Core\Inc\FreeRTOSConfig.h)(0x68DF6BBF) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\portable.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\timers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\event_groups.h)(0x68AD8208) +F (../Middlewares/Third_Party/FreeRTOS/Source/list.c)(0x68AD8208)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/list.o -MD) +I (D:\cangming\ARM\ARMCLANG\include\stdlib.h)(0x6035A4A8) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h)(0x68AD8208) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Core\Inc\FreeRTOSConfig.h)(0x68DF6BBF) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\portable.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h)(0x68AD8208) +F (../Middlewares/Third_Party/FreeRTOS/Source/queue.c)(0x68AD8208)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/queue.o -MD) +I (D:\cangming\ARM\ARMCLANG\include\stdlib.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\string.h)(0x6035A4A8) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h)(0x68AD8208) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Core\Inc\FreeRTOSConfig.h)(0x68DF6BBF) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\portable.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\queue.h)(0x68AD8208) +F (../Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c)(0x68AD8208)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/stream_buffer.o -MD) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\string.h)(0x6035A4A8) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h)(0x68AD8208) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Core\Inc\FreeRTOSConfig.h)(0x68DF6BBF) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\portable.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\stream_buffer.h)(0x68AD8208) +F (../Middlewares/Third_Party/FreeRTOS/Source/tasks.c)(0x68AD8208)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/tasks.o -MD) +I (D:\cangming\ARM\ARMCLANG\include\stdlib.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\string.h)(0x6035A4A8) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h)(0x68AD8208) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Core\Inc\FreeRTOSConfig.h)(0x68DF6BBF) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\portable.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\timers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\stack_macros.h)(0x68AD8208) +F (../Middlewares/Third_Party/FreeRTOS/Source/timers.c)(0x68AD8208)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/timers.o -MD) +I (D:\cangming\ARM\ARMCLANG\include\stdlib.h)(0x6035A4A8) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h)(0x68AD8208) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Core\Inc\FreeRTOSConfig.h)(0x68DF6BBF) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\portable.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\queue.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\timers.h)(0x68AD8208) +F (../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c)(0x68AD8208)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/cmsis_os2.o -MD) +I (D:\cangming\ARM\ARMCLANG\include\string.h)(0x6035A4A8) +I (..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.h)(0x68AD8208) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h)(0x68AD8208) +I (..\Core\Inc\FreeRTOSConfig.h)(0x68DF6BBF) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\portable.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\event_groups.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\timers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\semphr.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\queue.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\freertos_mpool.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\freertos_os2.h)(0x68AD8208) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (../Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c)(0x68AD8208)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/heap_4.o -MD) +I (D:\cangming\ARM\ARMCLANG\include\stdlib.h)(0x6035A4A8) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h)(0x68AD8208) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Core\Inc\FreeRTOSConfig.h)(0x68DF6BBF) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\portable.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h)(0x68AD8208) +F (../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c)(0x68AD8208)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/port.o -MD) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h)(0x68AD8208) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Core\Inc\FreeRTOSConfig.h)(0x68DF6BBF) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\portable.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h)(0x68AD8208) +F (..\User\bsp\bsp.h)(0x683D8306)() +F (..\User\bsp\buzzer_pwm.c)(0x68A05A0B)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/buzzer_pwm.o -MD) +I (..\User\bsp\buzzer_pwm.h)(0x68A189AF) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Core\Inc\tim.h)(0x68DF6BC0) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +I (..\User\bsp\bsp.h)(0x683D8306) +F (..\User\bsp\buzzer_pwm.h)(0x68A189AF)() +F (..\User\bsp\delay.c)(0x688F7D10)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/delay.o -MD) +I (..\User\bsp\delay.h)(0x6836CFE2) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\User\bsp\bsp.h)(0x683D8306) +I (..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h)(0x68AD8208) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Core\Inc\FreeRTOSConfig.h)(0x68DF6BBF) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\portable.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.h)(0x68AD8208) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (..\User\bsp\delay.h)(0x6836CFE2)() +F (..\User\bsp\dwt.c)(0x6894BB12)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/dwt.o -MD) +I (..\User\bsp\dwt.h)(0x689366EB) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (..\User\bsp\dwt.h)(0x689366EB)() +F (..\User\bsp\gpio.c)(0x688F8275)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/gpio_1.o -MD) +I (..\User\bsp\gpio.h)(0x67DA8C2F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\User\bsp\bsp.h)(0x683D8306) +I (..\Core\Inc\gpio.h)(0x68DF6BBE) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (..\User\bsp\gpio.h)(0x67DA8C2F)() +F (..\User\bsp\i2c.c)(0x67DA8C2F)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/i2c_1.o -MD) +I (..\User\bsp\i2c.h)(0x67DA8C2F) +I (..\Core\Inc\i2c.h)(0x68DF6BC0) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +I (..\User\bsp\bsp.h)(0x683D8306) +F (..\User\bsp\i2c.h)(0x67DA8C2F)() +F (..\User\bsp\led_pwm.c)(0x6831831E)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/led_pwm.o -MD) +I (..\User\bsp\led_pwm.h)(0x683178C4) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\User\bsp\bsp.h)(0x683D8306) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +I (..\Core\Inc\tim.h)(0x68DF6BC0) +F (..\User\bsp\led_pwm.h)(0x683178C4)() +F (..\User\bsp\pwm.c)(0x688F7BC3)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/pwm.o -MD) +I (..\User\bsp\pwm.h)(0x688F7BC3) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\User\bsp\bsp.h)(0x683D8306) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +I (..\Core\Inc\tim.h)(0x68DF6BC0) +F (..\User\bsp\pwm.h)(0x688F7BC3)() +F (..\User\bsp\spi.c)(0x6836D800)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/spi_1.o -MD) +I (..\User\bsp\spi.h)(0x6836D800) +I (..\Core\Inc\spi.h)(0x68DF6BC0) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +I (..\User\bsp\bsp.h)(0x683D8306) +F (..\User\bsp\spi.h)(0x6836D800)() +F (..\User\bsp\time.c)(0x6894B9C5)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/time.o -MD) +I (..\User\bsp\time.h)(0x689366EB) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\User\bsp\bsp.h)(0x683D8306) +I (..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.h)(0x68AD8208) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h)(0x68AD8208) +I (..\Core\Inc\FreeRTOSConfig.h)(0x68DF6BBF) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\portable.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h)(0x68AD8208) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h)(0x68AD8208) +F (..\User\bsp\time.h)(0x689366EB)() +F (..\User\bsp\uart.c)(0x6894803B)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/uart.o -MD) +I (..\Core\Inc\usart.h)(0x68DF6BC0) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +I (..\User\bsp\uart.h)(0x689367DF) +I (D:\cangming\ARM\ARMCLANG\include\stdbool.h)(0x6035A4A8) +I (..\User\bsp\bsp.h)(0x683D8306) +F (..\User\bsp\uart.h)(0x689367DF)() +F (..\User\device\bmi088.c)(0x68902839)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/bmi088.o -MD) +I (..\User\device\bmi088.h)(0x6890257F) +I (D:\cangming\ARM\ARMCLANG\include\stdbool.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\User\component\ahrs.h)(0x67DA8C2F) +I (..\User\component\user_math.h)(0x682460E4) +I (D:\cangming\ARM\ARMCLANG\include\float.h)(0x6035A4A0) +I (D:\cangming\ARM\ARMCLANG\include\math.h)(0x6035A4A8) +I (..\User\device\device.h)(0x6883BAD2) +I (..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.h)(0x68AD8208) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Core\Inc\gpio.h)(0x68DF6BBE) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\string.h)(0x6035A4A8) +I (..\User\bsp\delay.h)(0x6836CFE2) +I (..\User\bsp\bsp.h)(0x683D8306) +I (..\User\bsp\gpio.h)(0x67DA8C2F) +I (..\User\bsp\spi.h)(0x6836D800) +I (..\Core\Inc\spi.h)(0x68DF6BC0) +F (..\User\device\bmi088.h)(0x6890257F)() +F (..\User\device\device.h)(0x6883BAD2)() +F (..\User\device\ist8310.c)(0x68903034)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/ist8310.o -MD) +I (..\User\device\ist8310.h)(0x6838522F) +I (..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.h)(0x68AD8208) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stdbool.h)(0x6035A4A8) +I (..\User\component\ahrs.h)(0x67DA8C2F) +I (..\User\component\user_math.h)(0x682460E4) +I (D:\cangming\ARM\ARMCLANG\include\float.h)(0x6035A4A0) +I (D:\cangming\ARM\ARMCLANG\include\math.h)(0x6035A4A8) +I (..\User\device\device.h)(0x6883BAD2) +I (..\Core\Inc\gpio.h)(0x68DF6BBE) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\string.h)(0x6035A4A8) +I (..\User\bsp\delay.h)(0x6836CFE2) +I (..\User\bsp\bsp.h)(0x683D8306) +I (..\User\bsp\gpio.h)(0x67DA8C2F) +I (..\User\bsp\i2c.h)(0x67DA8C2F) +I (..\Core\Inc\i2c.h)(0x68DF6BC0) +F (..\User\device\ist8310.h)(0x6838522F)() +F (..\User\device\ps2.c)(0x68A17046)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/ps2.o -MD) +I (..\User\device\PS2.h)(0x689FF402) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +I (..\User\bsp\delay.h)(0x6836CFE2) +I (..\User\bsp\bsp.h)(0x683D8306) +I (D:\cangming\ARM\ARMCLANG\include\math.h)(0x6035A4A8) +F (..\User\device\ps2.h)(0x689FF402)() +F (..\User\device\SPL06.c)(0x688DCAE2)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/spl06.o -MD) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +I (..\Core\Inc\i2c.h)(0x68DF6BC0) +I (..\User\bsp\delay.h)(0x6836CFE2) +I (..\User\bsp\bsp.h)(0x683D8306) +I (D:\cangming\ARM\ARMCLANG\include\math.h)(0x6035A4A8) +I (..\User\device\SPL06.h)(0x688DCAE2) +F (..\User\device\SPL06.h)(0x688DCAE2)() +F (..\User\component\ahrs.c)(0x6891C4A8)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/ahrs.o -MD) +I (..\User\component\ahrs.h)(0x67DA8C2F) +I (..\User\component\user_math.h)(0x682460E4) +I (D:\cangming\ARM\ARMCLANG\include\float.h)(0x6035A4A0) +I (D:\cangming\ARM\ARMCLANG\include\math.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stdbool.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\string.h)(0x6035A4A8) +F (..\User\component\ahrs.h)(0x67DA8C2F)() +F (..\User\component\filter.c)(0x688F77D4)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/filter.o -MD) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\User\component\filter.h)(0x67DA8C2F) +I (..\User\component\user_math.h)(0x682460E4) +I (D:\cangming\ARM\ARMCLANG\include\float.h)(0x6035A4A0) +I (D:\cangming\ARM\ARMCLANG\include\math.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stdbool.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +F (..\User\component\filter.h)(0x67DA8C2F)() +F (..\User\component\fixed_height.c)(0x689E94FE)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/fixed_height.o -MD) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +I (..\User\component\fixed_height.h)(0x689E9A20) +I (..\User\device\bmi088.h)(0x6890257F) +I (D:\cangming\ARM\ARMCLANG\include\stdbool.h)(0x6035A4A8) +I (..\User\component\ahrs.h)(0x67DA8C2F) +I (..\User\component\user_math.h)(0x682460E4) +I (D:\cangming\ARM\ARMCLANG\include\float.h)(0x6035A4A0) +I (D:\cangming\ARM\ARMCLANG\include\math.h)(0x6035A4A8) +I (..\User\device\device.h)(0x6883BAD2) +F (..\User\component\fixed_height.h)(0x689E9A20)() +F (..\User\component\pid.c)(0x683712B5)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/pid.o -MD) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\User\component\pid.h)(0x68371001) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\User\component\filter.h)(0x67DA8C2F) +I (..\User\component\user_math.h)(0x682460E4) +I (D:\cangming\ARM\ARMCLANG\include\float.h)(0x6035A4A0) +I (D:\cangming\ARM\ARMCLANG\include\math.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stdbool.h)(0x6035A4A8) +F (..\User\component\pid.h)(0x68371001)() +F (..\User\component\user_math.c)(0x682460E4)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/user_math.o -MD) +I (..\User\component\user_math.h)(0x682460E4) +I (D:\cangming\ARM\ARMCLANG\include\float.h)(0x6035A4A0) +I (D:\cangming\ARM\ARMCLANG\include\math.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stdbool.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\string.h)(0x6035A4A8) +F (..\User\component\user_math.h)(0x682460E4)() +F (..\User\module\config.c)(0x689D1DAF)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/config.o -MD) +F (..\User\module\easy_control.c)(0x68A83451)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/easy_control.o -MD) +I (..\User\module\easy_control.h)(0x68A04DEE) +I (..\User\device\ps2.h)(0x689FF402) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +I (..\User\component\pid.h)(0x68371001) +I (..\User\component\filter.h)(0x67DA8C2F) +I (..\User\component\user_math.h)(0x682460E4) +I (D:\cangming\ARM\ARMCLANG\include\float.h)(0x6035A4A0) +I (D:\cangming\ARM\ARMCLANG\include\math.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stdbool.h)(0x6035A4A8) +I (..\User\bsp\pwm.h)(0x688F7BC3) +I (..\User\bsp\bsp.h)(0x683D8306) +F (..\User\module\easy_control.h)(0x68A04DEE)() +F (..\User\task\atti_esti.c)(0x689FFFC4)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/atti_esti.o -MD) +I (..\User\task\user_task.h)(0x68A03278) +I (..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.h)(0x68AD8208) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h)(0x68AD8208) +I (..\Core\Inc\FreeRTOSConfig.h)(0x68DF6BBF) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\portable.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h)(0x68AD8208) +I (..\User\device\bmi088.h)(0x6890257F) +I (D:\cangming\ARM\ARMCLANG\include\stdbool.h)(0x6035A4A8) +I (..\User\component\ahrs.h)(0x67DA8C2F) +I (..\User\component\user_math.h)(0x682460E4) +I (D:\cangming\ARM\ARMCLANG\include\float.h)(0x6035A4A0) +I (D:\cangming\ARM\ARMCLANG\include\math.h)(0x6035A4A8) +I (..\User\device\device.h)(0x6883BAD2) +I (..\User\device\ist8310.h)(0x6838522F) +I (..\User\component\pid.h)(0x68371001) +I (..\User\component\filter.h)(0x67DA8C2F) +I (..\User\bsp\pwm.h)(0x688F7BC3) +I (..\User\bsp\bsp.h)(0x683D8306) +F (..\User\task\height_cal.c)(0x68BE8E31)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/height_cal.o -MD) +I (..\User\task\user_task.h)(0x68A03278) +I (..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.h)(0x68AD8208) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h)(0x68AD8208) +I (..\Core\Inc\FreeRTOSConfig.h)(0x68DF6BBF) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\portable.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\timers.h)(0x68AD8208) +I (..\User\device\bmi088.h)(0x6890257F) +I (D:\cangming\ARM\ARMCLANG\include\stdbool.h)(0x6035A4A8) +I (..\User\component\ahrs.h)(0x67DA8C2F) +I (..\User\component\user_math.h)(0x682460E4) +I (D:\cangming\ARM\ARMCLANG\include\float.h)(0x6035A4A0) +I (D:\cangming\ARM\ARMCLANG\include\math.h)(0x6035A4A8) +I (..\User\device\device.h)(0x6883BAD2) +I (..\User\component\fixed_height.h)(0x689E9A20) +I (..\User\bsp\dwt.h)(0x689366EB) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +I (..\User\bsp\buzzer_pwm.h)(0x68A189AF) +I (..\Core\Inc\tim.h)(0x68DF6BC0) +I (..\User\bsp\bsp.h)(0x683D8306) +F (..\User\task\init.c)(0x68A03278)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/init.o -MD) +I (..\User\task\user_task.h)(0x68A03278) +I (..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.h)(0x68AD8208) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h)(0x68AD8208) +I (..\Core\Inc\FreeRTOSConfig.h)(0x68DF6BBF) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\portable.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h)(0x68AD8208) +I (..\User\bsp\dwt.h)(0x689366EB) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +I (..\User\device\bmi088.h)(0x6890257F) +I (D:\cangming\ARM\ARMCLANG\include\stdbool.h)(0x6035A4A8) +I (..\User\component\ahrs.h)(0x67DA8C2F) +I (..\User\component\user_math.h)(0x682460E4) +I (D:\cangming\ARM\ARMCLANG\include\float.h)(0x6035A4A0) +I (D:\cangming\ARM\ARMCLANG\include\math.h)(0x6035A4A8) +I (..\User\device\device.h)(0x6883BAD2) +I (..\User\device\ps2.h)(0x689FF402) +F (..\User\task\main_control.c)(0x68BE900A)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/main_control.o -MD) +I (..\User\task\user_task.h)(0x68A03278) +I (..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.h)(0x68AD8208) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h)(0x68AD8208) +I (..\Core\Inc\FreeRTOSConfig.h)(0x68DF6BBF) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\portable.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h)(0x68AD8208) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +I (..\User\module\easy_control.h)(0x68A04DEE) +I (..\User\device\ps2.h)(0x689FF402) +I (..\User\bsp\buzzer_pwm.h)(0x68A189AF) +I (..\Core\Inc\tim.h)(0x68DF6BC0) +I (..\User\bsp\bsp.h)(0x683D8306) +I (..\User\bsp\dwt.h)(0x689366EB) +I (..\User\bsp\Delay.h)(0x6836CFE2) +I (..\User\bsp\pwm.h)(0x688F7BC3) +I (..\User\component\ahrs.h)(0x67DA8C2F) +I (..\User\component\user_math.h)(0x682460E4) +I (D:\cangming\ARM\ARMCLANG\include\float.h)(0x6035A4A0) +I (D:\cangming\ARM\ARMCLANG\include\math.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stdbool.h)(0x6035A4A8) +F (..\User\task\ps2.c)(0x68A183A3)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/ps2_1.o -MD) +I (..\User\task\user_task.h)(0x68A03278) +I (..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.h)(0x68AD8208) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h)(0x68AD8208) +I (..\Core\Inc\FreeRTOSConfig.h)(0x68DF6BBF) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\portable.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h)(0x68AD8208) +I (..\User\bsp\delay.h)(0x6836CFE2) +I (..\User\bsp\bsp.h)(0x683D8306) +I (..\User\bsp\pwm.h)(0x688F7BC3) +I (..\User\device\ps2.h)(0x689FF402) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +F (..\User\task\test1.c)(0x689FD923)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/test1.o -MD) +I (..\User\task\user_task.h)(0x68A03278) +I (..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.h)(0x68AD8208) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h)(0x68AD8208) +I (..\Core\Inc\FreeRTOSConfig.h)(0x68DF6BBF) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\portable.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h)(0x68AD8208) +I (..\Core\Inc\main.h)(0x68DF6BC1) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h)(0x68AD823F) +I (..\Core\Inc\stm32f4xx_hal_conf.h)(0x68DF6BC0) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\core_cm4.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_version.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_compiler.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\cmsis_armclang.h)(0x68AD823F) +I (..\Drivers\CMSIS\Include\mpu_armv7.h)(0x68AD823F) +I (..\Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_spi.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h)(0x68AD823F) +I (..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h)(0x68AD823F) +I (..\Core\Inc\usart.h)(0x68DF6BC0) +I (..\Core\Inc\i2c.h)(0x68DF6BC0) +I (..\User\bsp\delay.h)(0x6836CFE2) +I (..\User\bsp\bsp.h)(0x683D8306) +I (..\User\bsp\dwt.h)(0x689366EB) +I (..\User\bsp\time.h)(0x689366EB) +I (..\User\bsp\uart.h)(0x689367DF) +I (D:\cangming\ARM\ARMCLANG\include\stdbool.h)(0x6035A4A8) +F (..\User\task\user_task.c)(0x68A05969)(-xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -gdwarf-3 -O1 -ffunction-sections -Wno-packed -Wno-missing-variable-declarations -Wno-missing-prototypes -Wno-missing-noreturn -Wno-sign-conversion -Wno-nonportable-include-path -Wno-reserved-id-macro -Wno-unused-macros -Wno-documentation-unknown-command -Wno-documentation -Wno-license-management -Wno-parentheses-equality -I ../Core/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc -I ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I ../Middlewares/Third_Party/FreeRTOS/Source/include -I ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 -I ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F -I ../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I ../Drivers/CMSIS/Include -I ../User -I./RTE/_DveC -ID:/cangming/ARM/CMSIS/5.7.0/CMSIS/Core/Include -ID:/cangming/keil/STM32F4xx_DFP/2.15.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include -D__UVISION_VERSION="534" -D_RTE_ -DSTM32F407xx -D_RTE_ -DUSE_HAL_DRIVER -DSTM32F407xx -o dvec/user_task.o -MD) +I (..\User\task\user_task.h)(0x68A03278) +I (..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.h)(0x68AD8208) +I (D:\cangming\ARM\ARMCLANG\include\stdint.h)(0x6035A4A8) +I (D:\cangming\ARM\ARMCLANG\include\stddef.h)(0x6035A4A8) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h)(0x68AD8208) +I (..\Core\Inc\FreeRTOSConfig.h)(0x68DF6BBF) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\portable.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\portmacro.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\task.h)(0x68AD8208) +I (..\Middlewares\Third_Party\FreeRTOS\Source\include\list.h)(0x68AD8208) +F (..\User\task\user_task.h)(0x68A03278)() diff --git a/MDK-ARM/DveC/ahrs.crf b/MDK-ARM/DveC/ahrs.crf new file mode 100644 index 0000000000000000000000000000000000000000..9cd010d15ee2329f8c297943c59641e16dfc48f3 GIT binary patch literal 27411 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 literal 0 HcmV?d00001 diff --git a/MDK-ARM/DveC/ahrs.d b/MDK-ARM/DveC/ahrs.d new file mode 100644 index 0000000..40d9c13 --- /dev/null +++ b/MDK-ARM/DveC/ahrs.d @@ -0,0 +1,7 @@ +dvec/ahrs.o: ..\User\component\ahrs.c ..\User\component\ahrs.h \ + ..\User\component\user_math.h \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\float.h \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\math.h \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\stdbool.h \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\stdint.h \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\string.h diff --git a/MDK-ARM/DveC/ahrs.o b/MDK-ARM/DveC/ahrs.o new file mode 100644 index 0000000000000000000000000000000000000000..4b7b3b50e726a6fcf0b12503724819141ee45e5e GIT binary patch literal 17896 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 literal 0 HcmV?d00001 diff --git a/MDK-ARM/DveC/atti_esti.crf b/MDK-ARM/DveC/atti_esti.crf new file mode 100644 index 0000000000000000000000000000000000000000..75ae31f53dee276609447275ea233d2138d76ba5 GIT binary patch literal 77219 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 Wp%E}GCl7a-ICSiXo6dF|$NvJLso^95 literal 0 HcmV?d00001 diff --git a/MDK-ARM/DveC/bmi088.crf b/MDK-ARM/DveC/bmi088.crf new file mode 100644 index 0000000000000000000000000000000000000000..822e7a079e2ec780b5ac550d582ecea0c872b865 GIT binary patch literal 873410 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Μj7VrbwBH-)Z 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

    1Hh_F?EyjW^G#} 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Ξ z$wlD?eOPu;xFH`_Toi8DhgBDa8}VVy#c6KThjkaN8}nhqMeD|W*mTjl2_Lpxv~JRe zZ5OSZ@?pnC>!y9!bsEaD;i7e`KKyjix-}n8T(oZ8hhHvQx8cL7i`H%W@Y_Y}wtV>GqIKIo z{B_Z~9UuO=Xx*+4=iIbz&xdq3t=sn@!%gcBe8_auxxM|%LKOVYiU6vn@+_Wy+kH>CWch!$4Zd!NEkEd>0cioR?Zd!N4 zkLPY$chip-Zd!NCkC$#*ciWFwZd#Y)$7?sOyW__jH?6zt$6Gh8%k|@(o7Uy|@!n1A z?)mY_P2ukQk?*E(5Bw-_Q@DqI6uK$gBR`7V6z;Jf#cm4s#E;Kz3is5HFK!C=%#RW` zg?sKtshh&R@T1I4;a>Vt?xt|B{HSnKxYvGEx+&ZnKdRgm?yVoyZVLC#j~X|Hd+$fB zo5FqYqs~p?KKfDbrf{G9XmC@wd_Nl96t2LJuWkxg=tq;A!WH?^?51$VezdqL+-E;p z-4yPNA8l?5SK>#zo5Gd)(c$JaSLR2jo7R>4(dDLf6@GNPXZq_ z=caWve)PL(U9BGjZdzC8$Do_m)%!8zrgaT|47+JvqaPz~TKCnDQ8%q?@?*?R>ze%- zchkBSKPKF?uGNo8H?3>)W6DkI+WnYz)4C2nX56%{(~ns+@sDP3!voSa#F80Y6sUv~JLkRX430@?*_S>xTVUchkBNKQ`R7Zq$!W zH?14=&rR#5{n&TYx*0zX+_Y}ik3%=DoAcwy zP3z|UICj&z1wX#IY2Bh9-`%us$&VjyTDR=SPdBYw@#Dlz>sI~v<)(FOew?~#-MSyY z-L!7Qk3Vi&x9P`UH?7<9ZToS~L+f_@NcYgXT|Y8Bv~JIjOb@Nw_v5^W)*bk9 z!9(i~{kZ6%bw_?&^3b|tKQ4P{-8Vn3cxc^sKe9Zu?uQ@Q9$NR)kLw-^cjCtl4~6^X z$4w7~JN4t1hr<0nbIn8H{+zky;m!2FXRdj8GyUJ0YaZTAKNmo*hr*=?kmsRr83Ek$ zP`Jzh?t3WQ`2ZexDBOhr9(pL;#Q+|8DBPt09(yR<|DBP6*o_Z);RshdD6fQe} z=N<}oHGmf$3U@7lmmUgtJ%Cpp3U?!b*B%OYGk`Z93U@1jw;l?2JAii{3YQbWdk=-X z6Tk-#g}WQTM-QjD+yFj#XkA_a`5sz#FMt9Mt-BvUp@-Hz2%yMA>mCMB?4fm!0{HBq zb&mu1;-Pg<0x0p&x~Bn@dT8CV0LnbH?s)*^9$NPzfC>+-dl^8bht|Ccpvpt*UI$R^ zp>=NpsPWLcw*l08Xx+O2>O8dWeE{_yTK6G<1`nuGb>#u{ zcxYWk0KFbsR~bN`ht^dE(C?vj)d386XkASJgC1H}8^Dl<*3|_t?4fn_0gQNPT|)q) z9$MEJz?g^DeGOpTL+hFXnDEfL<^U!=w5}z9DG#k{4Pe?s>)HaC@zA>V0A@Y3t|Nds z53TDAVBSOPx&m16(7Nsb7Cp4CCx9gnt?Lb7*+c940$B0Ty8ZxGJ+y8hfHe=T8w_CG zL+geD*znN0;Q%&0v~DDTEf1|54Pe_t>&61u@zA>Q0QNl;ZX$pK4~3fy;Ltj9ke@++K;0Mfk_ZZm)kFNNC*Ak$0XwgWitrEog| zT<}u3-2g6nDcoKFm%J2iKY+_#3U?5|6)%N53?R!(;f?~x_ENax0Iqr|+_wO(c{$B} z58%3&*8K?JhL_g;4B)1h)|~`!%S-Ei1#sI->rMm6@zT2A0o?J@x<3Kj_0qb(XV!W7 z70$mi>%9C5=Ufo?ytFPoi2Ghzml4DRFRjZA;-Qz;oe$!Xm)2bf;<1<3T@2!hm)2bh z;;EO`T@K=zm)2bg;<=aBWd-rVOY5?Oc+T0p?4@-Ng81yEbq|C1;-z(uf++FQy2nA3dTHI0Aj-V7?r9L^URw7ohzc*Qdmcok zm)5-qqRLC_UItO^rFE}@sPWRe*Fn^JY2BM3>b$h>Z4mWdTK6u91~099A4H><)_n-# ztC!Y&45G

    plh1?4@=2L9}>jT|p47URqZeM4Ok^6$R1mrFF$Yba-jq=O8-0wC+m~ zU0zyO5=6I`)|Cd){m%=p$G3BLjUxS$TQn;odX1o-xIfz*=g=-07 z&P(B1gP8YHxV9h`ycDiIh(#}j>j+}WOW`_$SoTu5t{_&t6s|jnRWF6>31ZDl;d+Bu z_fojNAU3=du0M!PFNGTjV#`b627}o4Qn;ZYcDxjBIEY;@g&PTC&&z3UG>CmKts4vC zz)S1KgE;ikx``l;ytHmIh+{9Un+oEam)1=O@!d=7W`g+PrFFAG{Pfbgxgbuwv~E6# zUtU_b5X7mM)-49{+e_<~g81X5b<08g_0qbPApUu2-D(i$1X{NiM7luh)`Q3pXx&B- znF6ib4C1^%>$ZZpAkez)ATA2DZYPLK0>kfms zD$u&4Ag&3t?l_3+0+&xPn?=wRG@ViLwF|8x=SHE7iit(5MBth?n($R1zMLC!YhH+Wry%upmkS6cq7od zYazT9Xx;S?-U+nsMhNc(T6Z&q4+5>b6~ae>*4+-_lR)coLdX|r-JK8$1X_1DghGMV z<%Uos(7L=3iUnGCFN6|-!rc#{RG@GVLMRg`+`|yc1q$~lgbIPeJr1E#pm0w@s1hjL z(-5i!3im988iB$+5203|a4$lr6DZuv5b6aA_bP-2fx^8Gp;4f4Z$kJgP`I}tGzk>$ zT?owrg?k@Di$LK%gwQHbxQ`*U2^8*A2<-xe%MYPLpl}5tbP5!%FoZ6F!WD(kEl{}P z5PAd(_c?@Kfx>+Wp--T2B_Z?+6s|Oc0fEz8SqOsytt$^JY{RT2~XoxIpV_Lzoa~U0n#10)JzD7HC~Z2rB}u>kMI4pmkj#tO>NPJA`$C z*7bz2A<(+s5H|ZX$$l08pU8HrZA!LZOZY_jN zk=Ct;a9*T!8zEc}Y29WB7e!jP6~ZNv)@_GyS)_G4AzTq@-EIh3BCXpCAzP$%`ypHv zY285x*F;)(7{Yat)*Xd#L!@=bA>0&c-M0{KiL~x}2)9LA_alTHk=FeTAy=euCn4mC z6z*3D_e2VJ8p3^%!u>vTO{8#t&Ri4uP4(Y1*F=6({qM{*k>6CG3*(7M;nKr+DpI(N zFrJANE;EehB8592#tV_cT?pf)NZ~Gq@k*p{m%?~0Qn<@uyb&qfl`!6l6fP@_cOr$$ z4&%K@;jV`9L8Nfk!uTjsxa(nj5-Hq`F!DtTcQcFvk;2^yqfn%9x5FqBDO^q%#Uh2f z6UJwe!rcwyi^yp%H;fXI*5!p!D$=@pVU&rq?tU2MBCUH6MukZ09)?jV(z-`sREf0i zaTwJit$PwijY#XBhEXfhx@Te3iL~x{81*8pdl5#1Nb6pP(J0coS7Ce=Y2E8EnnYUn zCX8m0*1Zj*MWl7_!e|v~-TN@wL|XSDjCPUMeGH>Rq;;Rd=oD#Pei&UMtt$wlTcmY` zVf2W!t|*LNk=7N5(I?Wn&tde7wC+n710t;}31d*Cb){hpiL|aPjA4=1m4`7R(z=Q; zMnzgz8OE4M>#D*S7inE}7!x9`s|jOLq;<7nOo_CvE{tiB*42kGBhtEtFlI$s*BHi} zNbA0aF)z}(rZ5&nTGt%LqDbpn!dMb%U27Q2BCTr+V@0HO?P08nw5}tJHIdeJhOsWv zx~?!bL|WG!#->Q?dcxQeXBA4n$fv z9LAwY>qf#j5^3FN7{?;58w=x`NbAPK_$gAji7-w?3O5foUxalx{ixh4q zj6WiUn+@ZyNa5zf_$N}h`7q8&+#j(JM!H1d7Q@JpDBMyQnG%It4&%H;;a0-9AW^v0 zFfK|IZY_*U5`|k2M< zU3vu1C0dse!3&AjWk&E)qIKsZcqP%g3lY4QXx+sK-bl3WQUq@$T6Z~ucM`3;62W_k z)@4QTL85ip5qy+r-PH&_Nwn@-1o;xJyBXb z*5yR-MWS_gA}En)-Q5UEC0dsoL77DB@**ggXx+UCDkNHWKY~h$);)-zN}_cSBdC^W z-J=Lt06CB+xv^7kZ9fK2nHou_a%ZMiPn`wFf7r!(g;Q*T2~gqs6^|^ zBN&rtT}1?w5{0XbU`nEJRS`@}6s|gg8HvKxL@+B+xY`KjBnnp-!MsG_>LXZ?C|pAX zixP!vj9^Kka9<->mMC0P1S=ASYmQ)5qHrw{tVtBEHG*}C!nH-PAyK&Y2sR}O*Ac;% zMBzFk*p?_uergd`>q|3B!K7tIH)-6PkDbu>e2+qs2ZYhEbGOb&V;G#_H zRwB40)4J6NF3YrTErKgDty_;EOQv-j5oF7>ZZm?bGOgQ+;F?V9wj;PM)4H7qZpgH5 zH-eiot=o&>mQ3sRBe*Tox`POEWLkF^!5x{_9Yt_grgg^=wZS?K&Evk5j>P>-LD89$+Ye?g2ytg`yIg(nb!S@;HgaO{+?MUb63v4GwWpT z$~hOs3z^oXNAXgobs15-l4)IL6t87kcRq?YGOfE1#ao%yU5w(LOzSR1@m{8Nm!tR~ z)4D5Be3WTjRurFPT9+L~zD(<`Mo}Qsx@%Ds%Czo!6h$(vyAegPOzUn&@mZ#Ix1#tW z)4JPHl*qI$CyG*;*4>GsOr~{rqbQeYU2YT=GOf#tqEe=H_oAqgDct=iYGn%dAc{Jf z!aapPIQFO=@?oAY(GKG5^MVCzB-bK+ZQ@Hn0^vD$MLlnI-h5HyqpG@ICMbR%) zxcn#vWC~Xh#h^^#3Zod3DO^z$!!m^{j$%ZnaG#?Xl_}hpD8^(8R}#gzOyNqSn2nfv|k!f936tgm|tBzt$rgb$@%*(W{Hi`wA*40I^DAT(7 zD3)Ye*AT_BOzRq>SdnSn*C=CfWGl38J&LOet=ov=nnLR~qqwfnx~(W~D70=nikk|p z+lk_qLhE*;xUJB-y(n@NTDKp?9fj5%L~&Q4b%#;pDzxq>iadqZ9Y=9bp>^M)xUbN< z?@>HZXx)z}9xAl%XB1Bq3U?C4Q-#9)isG3<;ZCD?u28t&XRav}?$4QP3b%p%J#$Ur zHn4wZt|{CGb}oiD3WZCL;jKd9GGchAP`Jz(-YXRDd<-8H3U?ufj|zpm7{e!p!d;3X zU!ic9V<=E4+?5y#6$+OXLy(1);)`%RiSmyV`x)o-HRC7 z6?lg=u&9in;5zkTK6`F9);Gui=kJcb?;;7Q)u0X82S}j_c4Y6 zh1PwFVNjuU`7sPBw5}kAVTINe#xSDLx}q3H6*v7^W3kS02NRLhCAGm{n+9Wejr)t*eS*UZHi>F)S#wt|o>>h1S)^u%yts zx)_!fT2~*#ibCreVpvsZU1JPu3a$GZ!@5H2nqt^cXkBv*n+mOKiD65jb*(XME3~dH zh8>00wa2il(7KKo_7qyz8N$+k%P-tCu42KG>>xtn=p>@4694oZ0FNSXlt?Q5B zyF%**V)&uZy1^KJDzt7Wh7*O>4ae|Hp>-oMoGP?#G=|>_ts9Hsk3#FlV>qXB^Wj7c z=_-Yrj3Gm%a8og4suXTIhVv?gn~C9qO5tW>xTsRNxfm{~6mC9-%PNIih~bJ#;TB`a zQYqY04B0A$TaMwXO5s*wxTaFL)fld;6mBhs8!ClckKv|D;WlEprBb-f7;dW+ZYzcy zmBMYua7U$ZJ2Bi?aQiXbQz_g*4EI$EcNoJ1mBJmx@KB|2$1yxo zDcrXh9;=+@zQ^!HrFB1Ic&gI6pD{dBY28T-&sAFYD~1;;tvik3rAq65$M8y}b$?=b zta{>n_BRuhP1U zaTKVu?ou3uDy_R5N0CbFuEbHS(z>iTKC84YJB}|Zt-BgWiAw9P#Zju#y6bV2skH7! z9OWvlyBSA?O6zXLQK{0p+i_H>v@R!(YL(XAiK9lPb$8>aRcT#r9Ca$K%ZsC4rFHk> zXi#b0{Wuy`TK6E1uPUv37)O&z>mJ3?tkSy2akQwk?nxZ2Dy@4ON1ICPp2g9w(z@qy zbf~oMMI4psOXtkSytI7U=jR}jajO6v;a7*lCoQ5@qctt*aWLZx+|POX0kR#XaC6UVAb z;cDYpQz=|s9P28DtB+$trEm>#Y^oHlF^(;j!hMZnTcvPKaqOrRt~rifmBO{ev8PhF z);RW63fC6LflA@p<2Y0)Tt^&7DuwHe<5;C|U2%LAcy zah#|Wu0M`nDuo+}<5Z<^gK_*;Dcn#Te^d%L9LHak!i~i7PvtZ>8pk<}){VuHuF<;j zI5IR^HxWmsM(ZZyIIq#VsW>iZv~D_%iyEz)iQ|$+>t^G)tkJr;IId{4Za$7Ijn*y1 zk*(3X#W=2Nv~DSmYZ|Rvj^nyU>sI2pq0ze4IBsgRZY_>m8m(K8ekM7{?=x)*Z$1 zSfh2vaXisz-M2WNYP9Zq9M3db_alzy8m;>o#|w?toy74{qjkUHc%{+0(>PvhwC;Bt zZ!}u>Cyuuot^0dsoyIM%|IVz_xaIX+0v|M5m!7~!jn-u(@JXX}nF-`;wC;QY1sbip zkU*hE>n$xkl@* zCs3i$x*G{pYP9ZV0#zEVyOlt-M(b`TP@~bhoCIn$T6ZUbI*r!dO`u+*b-4*NXtXXb zfkuti-AkZZqj2{VXwfL#g9KVN3imL9HjTnPN}ye%aE}w{&?wxK1UfYe_cVbnjlw-k zpj)GG&lBj;DBOz#dNm67GJ!sg!o5nMU!!oZ6By7a+?xajH467Ofgz2;y-Q$Nqj2vN z7||%)hXh773imOAF^$4~N?=^0aQO*LXcVp>fk}S63qS3ml1XeX#SDnC` zM(b)4Sl4J>Z2}t_t*c95Q=@hD32bS!t|5VKjn*|Lu%pqsuLpBzouF<-#1b%3=t~-IB8m;R|;6$T! zy$Sr%XkA|dry8y6PvEyk>jo0|qtUv-1paEYZYY6&8m${n;G9nDMiNNZY29c789J>S zOCVFHb>j(~*J<5E0vB{zH<`dioz_hya7m|i(+OPGY28c$S9Dr8n?ROM>*f;3)@j{* z0#|ifw~)X!oz^WTa9yW$O9|Z2Y29)HH+5RKlE5vU)~zORTc>qv3FPRsZaslJI<4DC z;I2;VHWSFzY28)=c{;7zPT-zS>vj^juhY8S1Rm(LZZCm{I<4DJ;E_)24ib2*)4Ib1 zp6ImhD1oOstvgQOnNI7zCGcFQb>9FNs#2*4xzXO*jX9p=^68k!>Yf9ok zr*+Lq9O|^LC5a=Q*0m;atkb%-B);jiu04tGI<4zS;)hP_I+OUR)4HxCPIOw=oy0Gl z*7YQDs?)mOB!26(t}lr{I<4zZ;;&BY29o%v)4IVV&Kb0BD2a4~)(t0-VbHpfBr*+J zH=4wGgVv2DalxQ<<4IgLDBMI6R}2a_nM9UB;ii(vHYnV55?2ihHX(iI)b2J5J)2LE*k7@!H@t_dSU>2Ce&%#9M>b{Y>JWLF-PEcyG|U zUrBs0Xx(WN9}QafJBd#Qt^1QizCr8$o>^ybXaB!5>kRJfKbJz0LF>{}C^l$aMhc$| zT9=u^7lYQFPoc!1br(`7HE7+%6v_-*cPWK(gVtS6p~9ebS5l}nXkAtcRR*ogPNCYM zbyriUF=*Yj6lx7xcRhtVgVx} zJxQV0pmk4E=rd^DvlRLbTK7DK0fW}PNMX>RbuUvGGHBha6ow62_d10UgVw!CVbq{? zZ&MgEXx+OM#tmBcK7|Q`)_q7}(x7!8Qj3Rj)NjzQsSQrI;pTx|+_28F9jVc(!|^(h<}6s{qKLxaLKrf_6XxUVT3 z8x*c7g>MFhYfj<2LE&0b_+e1E))amk6s|3W6NAFFr|`?5a2+X}8WgTGh2I8+>q_B| zLE*Yn_-jzOo)rEW6s|Xgb3XomlD-tueH5-gg$y5s8%QD3N8tujIParyLn&PFQMln0 zF8V0kND7yHoaRPTxa^~KV<}wm(Yo;zvV62|B86-pt(#2Ys*l!9rEtwh>!wq>o!t&=%aO;DLnGgx~&u*`)J*E3Qv5rZYPDOK3cb%!ZRPO z+e_iOkJjy{@WMyy4pMmOqjiTVyzWwR~ zyJ6?Ba@;wb3#m?Z>IzU1m1K?x3MPUP1r;!hAcCNRiJ&OKKrkUefm+{KJv`6z@0>mM z?;Uflx%Q-WOEH}H(7Hb{GcT z^3b~V7%qEg-G*bGhxe0gI@Wo3KS_yzRu8S)D&U%j)@>7T-9ziP3uyDux>5n{9$L3U zzzq+rD-&?jL+f@5xaFaBy99K2Xx(lBogP|OE}+Xp>na4?_RzXY0e3vKu1dgN53Q>f zaL+^Q_6WG|p>=x&Jn+!EeF7eOXx)ARk36*QfPiiftve{-v4_?j642wJb%zD?dT8Ad z0Z%-%?x=u%4~07>V8BD+jth9^p>Q<<20aw+gn%Irg{u|t+(Y5&1ibK2xRU~2dMMl} z0mB{&S1(}1L*W_(yz)@E(*j<5DBKwVZ#)$4tbn&33U^MxI}e3BFJRO|;Ti>uc_>_y zfN>9nYZfr!p>Qn%-g_wA1pyyC6z-ycNe_j)B;ccm!d({d$wT3;2$=FvxT^xDJru50 zz>J5&T@x_tp>Wp)eD+YdHUVEeY;)}bzItfg4FTUgwC<*WIS;M7C1Bn|>pBE1cxYXx zfJG0j>k{zYL+fq}_~D^-cLe~(u)T=Z4GAbMqIJ&&>?opjF9eho(Ylucb{5gPVF9~}Xx)f_-9@zS zm4NahTK8H&MG>ugBcQT~*1Z)_RYdFF38*fjb)y3I6w$gd0eg#R-MD~#MYL{0!2Tjy z_g=t(B3k!Bz`-I~H!0vy5v}_u;BXPG`y}8<5v`jNaI}clO$#_yMC)b*9514EvjS?0 zXx(Q4CyHp@7Xh_JwC<~bx*}TlO~A<_S~n-)R1vM47f@eB>lOqw6w$gx0jG;--FE?J zifG*r0cVS7-A@7MifG+00q2Wo-ERSnMYL{7KvNN|`y-&ah}JC&Xepv~D~?h{%+;!+ zR1tHv<|tLfT>W(%D&oyb{~U*kc(c;F<4_TAR@!i+DPnRq9chY~oDvcDi+GFIRuNB& zsLwVL18xqsi+JYdpj5=5n}Z!9hTI&KiFoejV5f)|ZVq;dcsLvh|qeawbuZXcC>a$P8g!}357xCWx^bd&m;C}iC zMNGP%{vi<`-B16ph^Zo)b40{+5zRR&Vy1}Z91}5HM01Xd_*_JDYD9b~qB$o-d@Z6m zwIb%+&%92=y!)A-6tUob=BGp~x}SNyi0|%a-XP+K`@zedx&xrWte&%OI{B}R{ zb0U`9&-}cIKkjGVC}P?D%$r24xSx5mh}9y_w-ym=MVxOJMEonFG#5pzyNS3YV#7_u zWf7ZhBCd!iDdw$jS4C_s=B;n7BDNQEs$CONTFj|-UBr%JPPH}>WyPFo?ILy-bE@4C zvAdWlxhbN&n0LM15>ZjiyWToPR2K8Dw@wjN#k}jSOGI@seYq`SPcePDBVu1MXW3m5 z`-?ft?uj^1%vp9{#KB_DvIim#6?2w76mhtiv+R+GW5t|c-6D<`v#mcCQB%w`^@uo8 z%ry0is4Zrio`|R`W}5m$)E6^DPen8obAt7YI9<#MHX!0$G3VAZ5$B6Jw+2Nt7ISV5 ziD)Tia-NI0P|W1K5OJ}X$$2T_N-^^?EaGZ0^D-i$wU{&Nm58=tPNvr)+KV}v-iWwS z%*pgtL`N~_(K`{H#hgc@BD#t>kH$pYE#?#&7jdtcQ)t5Zt`>6&y%+JIm{aJ3h=;|T zLX#pM6>|!G6wy;mBR+}fEv6AuBAyh}h-ndh#hg7e&Nsf8vu9RBe=%pzXXkrf%!%{G z`JNYZ;(T?!=f!m6oAW&{rW=BXWsdq7jxn)IN$DK&Y4B$+g;2#^WFJ&7jxI( zhx1J?=DR3AMT{4_zyIfar;FX+|8u^-#ar4&|JQ#lIp5!6-bnOE#HV83NVM#HlZ$yv z$BOe!F6J#AtIjvMn74GSIp4-&-W&PX`8F2w-pGH>x3QS_My@;G#$w(Zx#4^pi+OM4 zrt@tq=Dm?65`Md%`Bn)_?q|MD!k=Qgv0cKl`{|cTSaCo79THaEPrppUS~1<&DdDf1 zgIyB-xjEP^VcpF^xrB{kc9jYVn{Fa1C6su1Gj5fHtzO<6SuJ6km-j~Qk+9v%dn5Ns zDE0E*$bAxaczJK+ehFn>-Wz#9!cH&mjXWq}mzVcO9+I%z%X=daODOm9-pC^oD!jZm z@~DJLFYk>!CZWp9dn1oasP^*S$QlWIyu3H^goOQGx=}0PfR}F6NjT``ZILG>9P;wE z$WsyydwE-Ay@VrP-WJ&);i#9lMV^*$%*)#%&qz4#r66Y|)OzX0ISF-Mx^Z5@NiW@K zlyJ&RH<~2Wd+A2Aga$8rNsENjUiOj;63%$pOD;+{>t!#wB;lNwz2vfl^IrCnD-s&L z>?KzvGiX~``K ztzKHvA)(F74%{iB-AhZlB;4@QlG_q)dTGfW3Aen=)m;f4UaE3WLZ_Fi+?UYhr7903 z-1ah84<+33(w9dP?t1ABjJIU()3Dr=%qAIBy@Y(LHZ>0df7al zN_gUB^XQk*=VkL4knq&Y=J8BIzn9HpP{M$h&0|QyGcTLRa|wf9PN5ePhP<3YFC{$p za+NhK;f0s0tPu$>yfgat3}xt*8r!^_)k7aU8xywi5kvBb+eZNEE~cxlrQ z#}Y4X`srBWrA@yaOT4t{w_}NyHZ3`pcxlrg#}Y5^v|V;A@$ydF6~_`U@3dWYEb;PA z+cn1xACvRfal^;t{Bzv!F*)mw8$Kpy!*RpM)vb z4pquH>Z3kYGLHGEPqmEWKI*eaMvafR*6x*Y!bgYp$*A?wq5U#W`KZqU8TCHub5KTu zkNO;vaoR_H4$C;>qdrGuob^$kqcYC<*k6vxIParF$7MA7=unM}CLbL-A*0zxhiYZC z_~=lbjB7qNl#?>9``A!U$!PPjq14N0_i?q|AmfIQUFEcln?81xGcs=Z*j3KT=8TWlO=c0@UKALk$#zP;? zxh&(6kLFyF(e0x-S7ki*(VSKpJwBRqO-8Sqoa-{4xXEdg(dQzG^azxppWKs${6yo-E_%#?&G@qwu~1(_MAI1Ui#Q`?#dYUvFF^AG2-L8 z`@W16bC-WA_=5@zKZb^GwDkAJ^T3GNycNK|?a8eQZI`Wz6{4 zf?mj&^|1xLl=0ce7Bnp5i;pd6M8;Pi*WIsVeDkpny_PZOV;_1WW8TL;^j5}#k7u3V z$yoHU8I8*L?qf3=lkvmHW;8D2r;qoSP00A=V@G-~4S_VA3M^dj6Xhhq>nO| zee6h|WUTnuk)~v<`gqUJw2U<$@A;XLvF_uI7qc=peEb#o&oVZB{1x~wGPe1-#{Mc} zyPs?9Z!${#Tw~A4*x~0IdtOGFpKI&|89V)4V=p?Y__@aZ?x^DD8vBQ%il1xjpN=Yi zuCaePs`$Ca{_UvZ=NfxSMzx=7>_0O0__@YjcBJuhjlJSXvzw;D5&$h z=U)_@^t1>5 zH9M!^p`V(aSMbPB%^DSS`>9!zg2#Sp)~uk%Pt95s^!lmU1qDz1)a;^yK0h_Pq~NKa zbMUf)en02n6$Jx+&cUk+p7}WkTNMoYIR~#P81i!tURUtkPtDpCyzo=Ab_Fl})a-_W zVLvsysbIuU&2A}p<)>yH3SRrES*LZf7-3cmSi*nomLKMi}PVBSx|1{Ey$Y1oj0ML!LDuHd_$hP_bm z!%xFrD){NAVZ#c3`DxgQg5Q1`_DaE$pN73w@W)TX-Y8i1)3CP+R{S*Voq|JS~@9>j?Z2|5b zPAS+P;NIc1g3-lGRl)86UHhh>JV4jx6jTK0 z+Ps3w09{*9P!*tSiwdd(bnUx>JpsD*L&4qvUHhqEUx2RtQm{Wj*M2KF5TI*I3JwP7 z+8+gn0(5Oz!QlX1TTyT%zy`mn;AnutttmJbpm2W`91l>qe~xPb3b*dK7GQ(la9j(p z!EZXQ1=!$ARGbXB=U-Hu3b^NARMZFD^DinI0`B=26{iF4`4<)E0(7lR#rXhT+o_^4 zK-YGuXbRA^-71;`+(#-`(Gs9=6)G+SC|sqAivbE(rQ%Y6!d0ud9H4M}R9p#AxV9aPa4pm2v&vt9TTkaA#C>2PoWG6^{cH?wpFA0EIiRqBlU{8dW?AP`D-)eE|yBtm0{a!nLUA z4^X%ZDh2`+?xKok0Sb3X#bAKKT~;v^pm0}IJP%N~t14auC|s+GmjMcQO~r74!d+J} z5}ghZQZXK&aJN-V z1Ss4c74HKS?yiat0Sb3d#bkiO-B&Rcplc6QOb6)NLlrXty7oxLY=EwHtN0vXOM9&1 zOMt@lsQ4P7aJ?$N1t{DT6>|X!*Qa7WK;fRMSO`$Keie%W3OAtQdw{|{Q}H7};RaRw z3{bcs6~6)$?zxKJ0Sfm*#ZrL6y;SihK;ec}EC(puh>Dc}g?pu9H9+BBt5^$AxHl^P z1}NNH75@Sh?wyMD0EHV>u@RtfV=6WS6mDEaNsv!RCRA(djwgoBN2Nm0c6mC*Q zX^_HwRIwvS;XbJ-3sSf#6+43zZd%2zAcdPzu{%iNW>u62Dcolj6+sI3MMY(h!hKay z6{K+AR8$8k+?Y#@1AeB0#;c<{k9oEnjq*6yT z^aiQaQ4LRmRO*<9z95x4uHk8rO4VrS4^pWU8U}(?s#e3ZAeE}qFc_p#Cp8QOsnjVA z&x2H|Uc-wZm1@xNGDxLPYZwkvsWTczf>i3PhF3utvxdiwS)I|*wK`M1g!}}nWx~$d^2lNUu6I z%mwLHmxlQuy}GSoAxN+8Xjlx=tGgP$2kF&44L^eP>b{1bL3;H-!>=H{dZ^)dkX}8~ zuoR?M-5UM`>D6Nm%Rze8qhTdTuX;7C2Iz z`+rLQ`+qtAn$WP%`Pcs~`S1U7{`FqNe&=8RujId1o!z+)8V-ag)})4mA&T`;!=Vtx z`lR7-h+<7?I1-{*(;AM4=+umcnh>3u)o>z2r#@?_4biDD8tOuH>Z^v6Av*OJIR zn$u7pqEqu48bWkxLBr_~om$jzCPb&cYd9OCQ$IAE3(={cjz1wf^~>=m#J$wtjz1xa zwWOgrM6v#8XbDlQWyhot_fl6JlS14}U3E+f@wxAshRY%Ds{Yk*CB$9Te;TfaxU0IZ zp*6%^)eQ~TLflo|)NnntrQiAguS7>%h@EV!j`k2c*)|#qINrVbcLwhE*-Z+)NZ$qJ0WUUuH$Zq+EwVd7ov8RI_`(4U6qapA!=8x z<6(%}?a}clMD6zK=nhf4eL5b8sNH@YJt1m$Ku2$g+8xyKBt-2F>F5hlyTdx3hN#^U z9sMC{cT~qfh}s>~@hn8`j_VimUSsNESIZ$s4Xtd4gfYIjb@Xo%XK*D)5Nc8xm5L)5NG z$3%$QHS3rR(YO{JA44?mf{sri8h260REWl1(lH&PahG+>glOCq9kU@CcU8yd5RGfq z@g+p#uIcz1qH))Cd<)UIHXU;z8rQC4K1Abg=vWBRxSKi_Lp1J|j_)BF*P-J_h{kp5 z_!**cT{?b+Xxwcbze6+)RV{4etgP!Qv7N&81I<|*t+*2K;VH(%3V@H_A z4d^Hf)3|3kc7|!(ppIQ(8aJe4cbLXK*HIp(aW8aKglXJM9hG4kH>{&7Oyfp$REKHY zD;;~nH14&IycbT7i;jjch5M@GbeO_@({UzD;pTLl4O6&z9p}OnZb8TSFoj#x(HN$1-*q&F zDclbo&0z}nQ%6gf!u`^5Axz$n)Ea7#Kag(=)09hbutZdu2bFoj#uaWzcgR&}(7 zDcqWlYheoaSI6}*h5P5Y7N&6Pj%#5)LE3O!3-bxmrsG z$6>lwX`m-e*QyNkhUr?hfhS?Qw#PtUn6B+L@H9-<_8I68)3yBu2EughfPrUWx^~dO zV3@8QGB6aTYljUy57V_H23~~e+ED{9!*uPKf#EP+J8obkOxJ1*yb9B`69!&~=~}IU zH(|O~XW(s^uAMaSE=<=>85j-IwR!_%VY=2}U_4CMP8*mA)3q}O-iPVhSpy%!bnTph z$uL{oc>^EA6t2<0r!a+UGB6dUaLop$!xXN?z)YCJT`({krf?Sxd=68%O9sA#DcofP zU&9pcih*xo3U}4OT$sYO8ki4LxN8O$!W8bhfyFR|YcudYOySxM{0LLH8wP%cDcns1 zzrqymmVw`43fEy^DNNxy4g3jHxGn?BVG4KKz)G0H-7&BlW{bOPU@c7R?iu(SrgirX z{0q~%2L{%|wC$(k;L}=Y(16w1suE)T(2(9ZiusuTSo){>N(7HYY zJ0i61sexS)3fFI7cZ9+X7$}cWxMv0`A{1`WKxKr&4H>A4P`Kv?sv{Kcg@HX03ir~$ z-Ux*oHn1;3;YJMXk5IT*1`b3h+-m~|BNXn9fkP1r_twDS2!(rR;7EkRjT$%_p>Sgc zjzuWkxPjvl3O8Y(CPLxf8#oc6a32iRMkw5*fw~BV`)J@~gu;C?a4JIKrVP|aDBQGx zh6sh5F>pFU;bsk-iBP!D2F^w(+!q7qA{6ecf%6dx_su|Kgu=}kXo^s{c>~Q63b$aO zB|_mA4P1y&xbFroMkw451D7Hc?x%sv5eoOqz?BGv`)%NAgu*QuXpK;~KL)NvDBQAv z>k$gKVxTQT;Z_Z_M=0Eyfg2GD_t(J92!;FSxE7&s>yB#?J|o|7T#N7-`KIGqgwM!J zOx%u8xUDAcL@3-g6L%vNZo7$l5q7vz6Za#uZik5n5n5Mf;$ei=?KJTyLhE*!=#J33 z-6kGKXkEF9o(Qe0Fwq;Kb(JQbL}*==iM|M}t2Xg8LhJUJ=#S94y(R`D6mFl1p$LWB zZ{m4`!W}U2B0}K~ns^zZaED9`M=0E36C)7{cf`c22!%Up;&p_=9W(JJLg9{^cpIT` zH74FgDBKAXqY(;MYho-y;p$9`M=0D$6B7{%cgn>32!*RR@gYLt8ca+^DBNiiA0rg* zjEPSX3U}7TRD{BvGcg^ZaOX|TL?~RNiP;E+YclaULgAWCe2GxF787416z+nFZxIT2 z(ZpPY!d)^kAE9uUO)Nwx+!Ygx5ej$J#PG2P`EY|zatc` z-NaIa!rd_OCqm(FnplodxLYPxA{4H}#A<}Xb(&aT6%A>Td-$X@})(x1bjMBPiCaR*eZqP(^l-3QI*b}97 z&rR%&(z+KW_C;ykOB4H}v~JkMfhesTF;Np`u3niq5oNAko2ZR4S8q(zMVYI&CQe3~ zt9K?&MVYHn6ZKK%YRp7Kl(`x=aXQLeO_(?nWvDIp+Am3QD$h_(I?6btvLEbnW0rjpC~i5=I9e;hWDo>#^?W z6XmYQhNDlEd$XI4K2h$?mRRU>GqlyhQ#V7~EcCk>+HPUM%}}X@AvZZYEIfCUQ)c0X zo1C2%Ub@NIWntJ&&Tb1MZgR>kymFIMVd1r#oJtFC+~ibQco_gk2Va!MYs@IJ~ZdCtMmZ&qSojp>lssx- zD#|H&%))e(Q}VclnJA}ZjfL4Lr{oC>pQD_TwHCfaIVI~Xe2sESp0w~S$|-ru!d#S7 zvfjdclvA?7!a|f&^0bA;D5vBZ3*V!hl4mXaigGrdv+z60*?8WuVckvGWeXc_!me1@bQ5;fLP?Bge_AbU zjq&WyH4EEfJo|Iq!uA-?{l`$%H$3j(%O5L?k9ivkBEbNIY;`G zF)H=Q!hsl->b7t&Mx`EGI25B&Jr)kfs8p|oBQYxV#KO@SmFlx_EJmfCS~wn~QvDWc zV$9lrg%dGm?U{wz7_&BLp)SU(4OuuDW7eKqI2B{oURbD)F>5a^oQW}E!xqlQn6MEG z=VDCQD+}jiOxSA+jWH(djfJKd6ZY0ZbBqalXQ3s=gpFFb5M#o|EL@B+VdEAq#h9=O z3zuU|*n10CVocZv3s+-I*rbKl7!&rrS=KaMmpo;+N3q>1t5;ff~ns=w|4kjqh%T4%ztOX6UeupKgYZ*!bmU=%|g~ZibH8SaLIT+{Pa_Lp3&*-3*c3$l{#f(BSxj_ZEVJfGtpwBLg3EC1sjzDd;3Kj zRRVkaB^%WOd;4V@dj;Bb#l}8?HeI!`U!YB`HVz21>6(p$0&Ti(8_1a z0&Tiyqh6p*_iZ!?wCRD3(*kXJXyc4Pn;zLXE6}EH8|MVt^w`FEfj0HnXcTBuuZ<>w zHa)S?EHGhxHd+KK_0+}%flBq;xF}Gm0UMVDD)r39Wr0c!+PET6sUaIz1uFI2Myo)j zUf8%MP^p(T+6CG)Y~zMNn?`Kh6ll{c8@B}7^x8&;K%3s!=oFZ%w>EAIwCSCVI|6MQ zwQ*OVO=C9h3AAb4#(jY{P1txSaAo-3#v_3%!w)vP1+EMyZ9EpZGW=+xN8rlvlZ__= z`_+_)za??ZxCz@D$E=&MZE<{d6Sh5$FK)t0-eu6D)o-ObhRIDWXfDv#r*o2!aAe!01-jN`YPtExEu2yF1xaV!gL@O$D| z5!m4O#<41}!S9P>O<;rHAICp8R|n!)cXM?xjtw_ghvL{2=+)skN<^OIITFV=b#nx;BnoBF|RW#j#tYTqolw7b(}N zI4VTSRUb#CNVyu~s1hmH={TxI_Ny~->=D_o&c?AUc9LIH$E5n{R+C;7ld*f&qxiWkb$4!x5^~G^Zq*qVl=n&be z`s3&nDc3+8T_WXr7RPOoat+3DN2FXsaoiOt*Yh~;iInR_9QQ>g>}4DeL{7xvI39_V zYb1_tk#fC?%euIV^li%U*Z@O*}1;PF)p%meT!p4WapZT(5vkN4#}|=G zEypo0@^FmhCQvHz1l$2P8h_KAylqiO+y)5;!EWX`M*mh(x7o6F4eSsk#J?NmS}&0>>pP zbt-`xiAvQcP$$u*h6GMZwCQvLrzF~RCV_g1Hl0nNL849P5;!fQ%?fD5^d^Dpig3}dXm6XiLI(HfqscLJxyRh zqD}n?Jd{1^Rn333}CKH&I*rh%u@I|6XpAz^g@tw4(1ineMX*z*9 zi8jq7FfY-j*#s6O+VnYrMTs_jN#MIgo4zLSL!wRJ68I_cowT_Geo1^MZ9ah|i8d`H z@JFIei;gN1ZTjx0BGINFjw%vu`st`5@&3tQjw%xGpZx7uBGIO$1U4kv^v6*};@fG< zjw&+KwBo2DGfk_GDl*fw=BOewO@AFrWKOz&36#l9)4HRI%rtE{s>n>!rlX3?G?gS# zF4Ly1NmR(RX|n2a>3lx%NAlM1#z=-=QSV$Q0>t5@%)hrXxw5lWEh@B+kpU=~xntGHp7Z zM3YRLYLaM{Y14@$T4dT(o5Tf~Hq|9@QD$#CnZzZTz3EgES7h2$pTt#}HZ>&CD$}OZ zNnDd@)0rf$%e3ii5^XY{*_=zFUFI{J^GV#4X;Whow`AJXlthP2o0^m8lxb5-5?wNF zx{$I4`)Sg72%=vaBiKjCA_{}8xW%lt~NesyB;~hy1$`q+Hi6NOHbtUm!rbxGw zcpD} zqcYpl<0Qsp?x^=9F)njQy*G&onJd00NxYZ2;_FM|gUl7*(jeU{CH<|CozD#0H<_^_x67w?K(nt~uGTYLt zBo<}1rPoP(m)VxyB=J+`>h5h4zhtiN-X-x{=IU-Vi6xnl`xQQ)`Quok@TttQ zV~N5Y%@xNIh4XFIu|(l~TXQT?IN$y{mMENW|B|RtIN#PCOB7~k!?8qRhBh5b6wbGj z6iz8@OIuT@SJ;-erO=?TEp1QXw8FMjn!;IyYq}jNoKv`_D@)+WD1WIigYT4ZiOP%r|?)| zTWUz5N1;upQ|MJ_)0q_d6t3jXrtnl@TRN9Qzrwb3K7|2=^Q|$3XA0+AQwl?FhMH4& z?q;YZg%=9v+l3T{-3(n!VZ_bQr4(Md8M>UpYd1qzQh1~A8Q;|u-nwaOP2ruJrfVsT zDHQ2?3gZezYD-~4p-Am1yjLjFjTAm86zOIPlWv-BrSQ>BQ%4F@3PtKnVOpU`T`9~c z6zO&fvkFDJlfq|(BHc~li$am^r7)+s=U-BoSKRY2DJ&>lzdcN0QQ`XSQ3~G`uHU*- z_@Qw9_Be%~3fodo3cnP#rQQ^ND{Mk360N?}8xNY7I!Q90FKq_9=xRC}4iHkDItIEC#hr`kvgr7EY|s}y#q zJc;l+g))^V5#FS*OJ#=Mrm$OOhTf%6t};WTDO9M;&{ztUDl;^mLY2x4O{7q*a=yJ! zVXw*zeMn)S$_!1WuwP|{KBjO$WrjYba8PAOno8l2%8oRh!cmnD&7^Qlr9-nR99QYk z=M-vGI`k!l6Dl40nnJD041G(XPNhh5DV$U((!3*xN|6>EH&kY5(Q!j%hQ6n8MrDS6 zID)9m&`(DYl_LFe+)%j(@Y``iWrmg`Dl@do~fK_ zhte2SIn@rQF{E;;9ZBQ4%BglVjTb7X+OafVsubyX8pCdyYSI{S({v(@S8keW(|GNs zsVwC&3u$~-Io~d(@kQnO?NSr}RaY8oDs8%*#$S~--AUu0N}KMcv959@cQ1_%l`FaXX>6)o z$vsG;L}T}Un8sF(-TP4*+cb9X?liV*?B0*lDAl-U*^|Z&jgzi7jWUgs?nxTEHO{xb zG|Dy3x2I`TXxta*Poq-fq#H=1O5>z^mPWP4NjI3r9*s&3rLk9|QqR-ar%|aFY3$di z)XOvuXjE!AjYAr9HIl|*jk$W2#u1H5y-wq(My1}QaZIC9Z__xgQK@%n)M!*{G>sD) zl^RQM{Y#L1(z51L+vqrDJq|u_$tFLKX)R?PpX@AzYT408qgN}AJ{ohi>gb~}S8I+w8gup6(MMyh{yF++%+-1t4>aa#BaMd|cL+8e zku*MSDaqimMz6MJ(4*0-Z5i}xT+?mO;E6`LN;BxwIQ@2H@KodUE6bo?4Bl$&;|DT$r?HP8%wSYwA3v1An8rSSID-i{S4T2<@8;@g1|Qs99m`5X5Id~$2DUEZmHiK!6bFeOh8I5!BWCpVu=isRfK5LwV^%;EA=v6}o za~i!mox!|Dug+w!pwX+d87yk_>Rblj-CUi|;D?*5#teSCxoXPbmz%5R41T-0YRO>9 z&DDhrmNm}7iy5qFoP(D#Sk*WOFK4i(aSmR|;IGCxcr}B68drC%8LVqu-CfIIL*wf1 zdIp;se*>v4gA$$RJKHnZs`Gs3jSRNyoP#$rDAl=Fa4UlyI`;}XGAPsORc8h}b$Zp6 z!7iO%-OgaQPOt7{P_EOfyBSpI^y*#)l{&q;pFx$*X8s_9JvwvsFoV51bM+{LeL8d1 zoxy&cxq6(z0iC(($>5;QiP)RLA)OQPNd|{?PQ<DAi|nsj>gE`w&BUX5nZqSLFf3@+&OYCMCBI=!06;F3D9Lkx^#Lqm%(kFUd?B4N9ROb$l#vNTrFmBUuUkqXYfF0u6|_j zQ0M-^&kP>v+&}o0LATERgWrxrI@|h^O1hXIo!(9Maj=R~(0Qw)IuV9GyFw zYmPZOcQpSx=IGqf{O6dXb4PPMgXcPTG&dZ5bna+wI{N6`KPbs!*v-|}EJoa1ZOh`7 zo2%_vymoU{n#Eh4b8tr%?{v<=vMfe*&cU5ojOm<%yRsP9>DBHmCUkmLp2d5eUR7lA zL8n)hSxoBmsw#_*I=!mS;*-w(gFRVHySdt%#f+P)eOb)9x!Rw_XE#>|viRcW>R=XM zb$WFui*Gu;I-JFvPOpw+F|X6BqggEI^y*j^i#mJz@hpD0xvI(Hr<F^jDR_coid*k*8VvpI|H2KP2wvM4op9{oZVI}DyjznDdtL9Z@l zvD2Vem$TSq@I3mJEXoafbv26$gI={}QEAYtYgtqo^y+#R)dsz4%VLi~uiCTNYtXA3 zS?n|D)y*vS8}#Z{76%M^)se+PgH5Y5i^B%J>dNAXL9cFSanzt!cd|HU(5t&y95?9I zy)0@BdUZdG69&C{kVUOQuO4PmXV9xhS)4TJRd*Jr3^uLDSu_~TRZkYD4d$vhi!%mu z^(2e426NSy#W{nydYZ*~gZonbSu`5lmm0{T$>5&Cvn-ko?wJo}(PD7Vd?O~e;40`o4i>n5`8qT8CpjRVVTr=p^t1PY?^y+mMZ3ex1lSR8huij>H!=P91 zvbbr`tI;fO8O+sK7M%vY8qcE3pjQ)F+&1Xd`z-Dl^y)(vcMWiHIqfR!KO8vMUO$RK4;NuxW5IM#S_E*Ex;`L4EMJHvv_LI ztGO)t4SF@7#ehMt7P5F|(5uBP1`T@kJ&PfOUj4}8xxr^KKeKpgaChOCqmRMeh2M@o z2KPIc9DNM#cm8qoF}UBkoW&c1r&(4UhYX%(S#=yT_?&pname6v;=hhV2A{?Ja~v}G zEN0y?$KVr~4aXdVPhd73a|}L#Dam2lpi*0Nm~qpzEr(e*P1|!=G&tW%bNFs>zU|22 zhr#()mcvhj^KEAizYNZ|T{-+V=+N#QmJB*np2Hu54pro^Y|x>~999fERF%W3L5Hey zSToq5_T=!_V1wG5!#{%!YF`fP1{>7=95xI#r~^4{8f@kVb0{(0=f62@HQnC=%we19 z{uW>k+fDbk0COlc-QNPtVTbAd7GMr#CigaLa@c9QzXh1XF4O%jz#Mj)+}o_nq1@!& z=E)o?Ozv%-%AwNa-e!FcRVMc~8*->Nxu{91)*l*IN z^En(aX;Whk2Tj`4l*1vDHZ|vP*rZJ@IUF%*(}f(4nzZR+4#!N|bSa19CT+T$LybwB zuH=6bNu}=PaKWTf z_j9;tQmF?yTr#QD!yGP~RO(Rd0y&BA+)1+5JIdqxy>Uj>gO?verhdU;{ zdYQw0lhbcFhX*F7-$)J*O-{d8IXp5s{a)wLZF2g($>Fid-u^a+9+PwMT@Jk_=iq1# zPfYgqu^jqL_V)1{o|^3K6FKyo>{st|7%=J8ha8@n^lCDPL6cs6%wfo+SD$itZqlo% z9A238YC4CPCcT=;Vc4WsvpI~I^y+gCuS|ONC5P80z51HN8^w2H-|4KpCbRu z;j77~$m=$c_b-K2Hf^Y~%Xy3#y; znzU|59=}XlSC+?blh*CbW67j-yYl#B(z@MwESt2hJdYKV)>Y)OYSOyOJl0HFSCz+K zlh#$|@z11nd-7N}Y2DsDHcVQ#FON-=*6q)u#G-Wv^4Mz8x`TOavuNF+Jhof3?r#~F*lwdHZvqHyhboU&oMTMd5DeanYi1ck;MoQMkK#T(&6Oy*#d16z+Z=S1k(nAdgmy!adC6 znnmFr<#FAjaNT*dSrqPZ9_&fGWMd5n$xM@+iCwbhmC|qA29TtUqnn$Na;rjFF zvMAg@9=9zD_biV)7KIzkqIECx=(Z@_a2}5>3OABR zk452L<W_x*Jkq= zwdmUCJjN`#_9c&Ti>`gmW5S|q-|~2G(Y3ieK3H^ZK95O@t}W#8(V}aMd3>_y+V?!B zEV}k1k7EI?>s(RbZse*FBV<|FXhFNs&uVa`+*Zw(%S^Vwhb;mG^zummy7-sR;{Rwux8PZ>TL>lselHX z!d))lv`yiz6mZ6-a90aBYg4$^0?yeK?pgs&HeI`3K(kHP+6ri~=~{aM7i_wAqkxMx zUAtMpC7Z6@D&VqB*E$NgV$-$G0?i6s{rfYW#XtU|sy#m^8 zx^};S8#Y~gP{2)_u01T^mQB|l70_YRweA8sZMycjfG(S^^%QX1rfah1w6Fr+Oq;4*>r8NfNq-|Zm59AHidg$K#xt~UKG%4 zQ@ED}Jh3U?*c9$f0ncm-_qKpRo5H;-V92I$qXj&- zDco2AFKh}oUcgJ6!c7z~Y*V=R1&r7f?n42uY<9TG0$$s+?qdOOY+CoJfKi*mO%*U^ zQ@H5@#%&5WQ^15x;bseXZ&SF>1$?k6+?N6-Z3_3bfR8qX`&Pgwo5IZ%FlAG?`2wbG z3b#J z-SdA1EZP)qrGW1?gR2N@gJ<)6t3()`2QsRS5sAO z7(RG*AI(W0U7z6n67vE6JG1x7d99s2?dqE9nwskB>Y5r*K}jl-R6tRQX2DEQz(5o* z5X6i*2M|SsS$*v@s@{Y5fcyE~*Zthj!p;9d;dTkw`X3Z-w}9dRUn!RhC<#!w3IW># z6s}UhjsS(L60kEs;i?6c1}NMf0c8OSw^zWf0EOEpV0VDR)d(mLP`Ld9DgqR)RzPKd z!qo|=3Q)Lu0o4Ht*C1d|fWkEj*c+g52L$X3P`HBvY62AQkbwOG3fCl{HbCK;1=Iy7 zT#JDE0EIg&pdmovjtFQBP`FkB2LcrCsDOh33U^Gvp#X(DE}$tu;o1Z=2Pj;-fR+G- z>kx1_K;b$C90^dkE&;6p3fC>*Xn?|<5O6F&;Z6!T9-wfi1hfSx+-U*r0Sb3UKu3VW zofXg-pm65|bOo5<&I{-c(7GN0CjzvtSHS52g}Wf&On|~&6mT{`;Vua{7oc#L1)L91 zxGMsB0u=75fZhOwyC&d5fWq|&xEP>t{Q@opDBOU6%K-{EDBwzf!d(||H9+BR2)GuY za6*NddP56mCkuodAWqD_}H0;id(Q1t{E%fbjr@n-wq-pm6sDOa>_2 zeF0Me3im+3-2jDqC}283;pPO)1Ss6RfY|_rTM%$BK;aez+z(K=M*!aWf%AE0ng1uO(8+%o}-0SfnAz@q@u+zSCq0b2J`z~ca|TNdyvK;d2qcpji| zuLZmaP`Eb&UIr-KTLH@f3inRHs{n<2FW_~6!hI0%CP3jn3V0i!aGwOc3sAVv0^SEG z+!p~K0u=76fR6zR_f5d30EPQ5;B$b&{SfdaK;eE0_!^*aD+0a+DBP-m?*R(;OTdo+ zg`zv5AK;brg*8&vopYK|L{}RWh?^=NW633SB zT7dr|P_c-O0EH_N@h?E(wu{&dP`Di;wgMDxr-O|}h(zSXKwL!YpAfhfv*BV9C2kF`Y5e-4Qc2GoPkggpP zaUe+7nnWB7(zRw0hk|siMMP7Ot{oQ99HeVUM6?9yTC0e|LArKS#E~FfJ0_wvNY{>w zI3A>CZ6ex&)T~`ZdytxSi0BAXvrZA6L2A||qAN(vxLnw=4GCdlM=R>avLT{|b@T#&Av7jZsF*LpDpBhSA%rznuu#by4EM6FG$z=Mf3;h+JK0GAYB_2 zF&Lz4*F{_p(zP2RZUpJtkcgomT^klL9HeU_B1VFA?WTyELArKJ#H}D*yDj2&kgnYk zaVJREMn#MU>Drixu^?R=7cm~BYZD?Sf^=}S?Fv!;!4@Jxc`5I$R#C(viG3G@q1o;|cLBwK^ zuQ3)yJPPtP#v>6+LB7UV67e|5*U^tfJPGnG;u8^1gWMK874a;{ZNW1U&x70+JQwjI z$Zf$35if(>7Q7U(9OSlOS;U(lcLc9QybW?k@LI&XAa?|BM7$4jNAOm}hakV#cqigx zklTXyB0dGVE%+efbCBDDk0QPV`Mt&`5nqG03DWaG{iSRMH5*(RYg#NB7Rgsu>GpB)mqL)?9KN;nbX?z2n6$q;v+-4afPxcfXI;dF?*&yy0) zgt+@WCE;v{uQpCgI2YopjWZI?hxlsatc0ErUu~R|&>P~bjq?&Ngm}~2BjI9*H@&?Q zE`@m0dqKkG5N~=fO1Ki@jmRYlS3|rJxh&yYh&LivB=m(iFI<(-AL6`lO~OEk^Fp75 z!4SJ?zl7@{cGCd~H$v>DgA#^9?55Wx42L)`+>kI5;*H3VgqtDW^bSk772-|rh=kD) zx1cvAjD@%by(M8h#4YG;2@@f1LGMVI3~>uODq$+bE$EnpyCH5t$0baMxCNb%Fcaby zbW*}>h+EJp3HL(Wg5H&IKg9QD(-Izp_}*+r!ov`So0TvZqHy;l%!er4eF+O83im+5 zVu->$l<+7-;pQYPg(%#-gvTKYw;Ng?ldHb%^`W7ZTotXx&Q*Z$q?hS;D&zt$QWmeTde*mhd4& z>)uHC7@~D=C436ex_1&jhiKh<3133A?t_G{AzJrQ!nY8u`y}Ceh}M0U@FPU)zDW2P zqIF*-tb}OYHwmjDTK8STuMn;KAz>{<>wZf39inwB68?l}-KvE35Uu+q;ctl6tx4Dj z(YoIf{)K4W9|@ZwTDLA?D@5!5N+=G~x(x{>VOsZ3!uBw&+w`pqv#)OX)`i(ui)ECC zX6YxVOm!vqcTkEcFCv;)4JU8IdT*jU- zt*el+H%#j)W$X*nx+)npVOm!$V}F>|?U7L%rgeK|)P-r?J{k34T2~{ZAx!J`%V-SK zx>^|r!_07XG7g2A;p$~Hg_+?RWHg7F;TmPMgqh(E$T%EkhC3+ZNSGP!kc`$aGhCC5 zqhV&aW*NuA%y2C-j)ys$9+uG-W|})9qdm+t*D9kU%rtjYMrW95?wE|OFw@*|8Qo!~ zxi%Rm!c24RGERn><~n4Y3Ny`h$~YZnn(LBrCd@R~E#qvMY3_uKb77{rlQPbSndVN( z=m|5;otDuXW|})A<3gBe?yQW9VWzorGA@Og=FZEw9A=v9k#Qx=G}kNRYM5#6f{bfn zrn!qU`oc_emt^#ZndUCb7zi`XU6C;uW}3Sy<9e8B?wX7ng{te5F;u9!ei_4ssvD3o zQmDE?88-`6cU{J+Z<78>V%mGN!|{ZcN5ZnAVNUm<`jq2^sgov~E(y{V=VYlJOu+>+Z^U7^Zd8 zGUmdxZbrs@nAXk8SP0X)domWowC=u)M`2p`K*my-);*N*I85v2WIPGex_KE-!?bQe z#Nyt$Qltb(q#Ylkp}@>z>Pa8>V$H zWV{R0x|cHEhiToij1OU2_e#dcFs*wn<5QT{y^--bOzYmt_!6dd?__)p)4KOEzJ+Ps z2N~bPwCRg=yV48Eau$_g%*CFs=I`<4>5@ z{gkmDrgbYa{)TDYs*H^=t@|b8Uzpad$=D3jy5BOk!nE#>jN%BbTbEH1p>=;{Y>&{o z4H-KkwCAMzTt!??PMObUa3d$pe@81+uL<--(DX5GTzJF6t6)AlGrl2}P z;YtP!nY9kb`QbApW!c{4#k5IU31q~4j zw?{!^gu?Ara3DhA_9-|RVVbK^a45nww_ib1glVo;L34y@u1-NqglVo`!QlwgT!Vrm z5vI9D1+5XLxdRH0MwsRfDmWHlnmeT6c!X)LNkLnLX|7p8dxUAOML|b|Y3{Is&Ir@o z5d~clrny!H-4Uj_qY6$$nC6ZtI2mD@JFehVglVo#!RZLoT)ToZ5vI8g1?MBoaGeTz zBFu1I3VI{VaNPcPWF$E7I z6mDF>!w7|&P%syvaFYt=BNT2*!9s+>-Bqv{p>Wd*9z`hJjDn>Ig_~9II6~p>DR>g0 zaQ78FjZnA;3Z6wM+(QM=BNT2j;HgQt&21 z;T|h^8=-Jd6ugU2xTgv}M(Elz1)m~x?YV-_5xVw5!IubKd#T`Sgsv?s_!gmSuM~Wb z(6!eJenjZn8wEcjbnUHzl?YvXr(iWg*WN4m6`^Y%6s$$)+D8SyBXsSPfG({=bE)~sD%C%cX zOO$ezt2i8`Too#gL@8ILiqVZBfd#Pepr_a@DBl zh*GZoDmtT-t5!u!b{9u;Fz%GIl4JW9DPsF;XSu8S%r zqm=8Cim52&x~$@ElyY5BF&(8`S5?dwYUrAZdr>B`J{9+)ykF~A@gU0kwE-0mqr6`m zR52Ij{n~XE^HJWf-B7U*<^9@_ip41J*M?O*it>JKM8#5+dxM)Q9!I%1xTWGrlzW5Q zDxOBUH@KtXS(JN&Q57$v+!l*~FV z(irRNgNm{k>*}M5@)$efClwVj*41Yfl`+=U7Zp`8*40;El^E;lo3BcYb@kmBB*tp` z;R_ODHT_gk8)G%CsA!0>`>m>IjIsOuQgI;0?zg7mV2s`Gw~9kCcE3NqJ~4K`bzh$t zyWd}5pBTH}hObYI-S3~TPmJAf)7K})?ziRZ6Jz%))^IGw%|MBU<1uaqwrgmMajM** zp*_Z_a;Jul7^lio4V^Jgm1P>bVw@^>Y3Pn|s@$#NM2u5qxrUQ5PL&lJPQ^G?R%$pM z<5XFt;Y^HEWwnO0F;10xG@OfZs@$vLe2i1&J`FuFPL(wpdSjd__iMNi<5XFz;bM$a zWu1mgF;12B8ZO5;RW@k265~|asNrgiQ{@2-*J7M14{GR(ajHC|p+Cl{vPr{0j8kQ^ zhQS!8$`%dRW1K1vYZ#7kmOP?iB*s~?Rm06fH67J(t58kHG~6y!({T-VVw@%0G>pbL zOSWqmi*c6h&@dij_v_R!5o7o3(l8lg_v_X$6=U~1q2X?f-S4D^=@`4;DGf6*cE8ga zW@GGrXEfZ4vHP9Xa6iWGcTU5D7`xwj4G&}NemxrIV(fms8s=k^>w<=b80EUCVKGLz zE@^liqgR(TJc-e(D;l20=+#vX&tmlInug~wdex`lMT}ncYj_!>R|6WBWAtiJ!>bs* zx~}1EjN8o{8s5d|)sTkwF?uzu;YW-wG)6T1jB$T?Q^QJ(`^#Gz)?(aR-q!Ft#;xTY z4S!JzCp2uuxT~DhP+Y{WHl?AYh+XZjhMh(1Wz!l; zi`dI%G?W#wm(6O}Rm5I)Ps8pa_OkmL%8S^`9%!g7q96}7)D`h}KBu9+h`;lB4Gl&7 zoiAu;EaLBcQNw{E{>~q1I9SBr`I3f1Mf{yV*3eYM-}w^_%|-m3Kh@Au#NYWd4Tp>P zJAba>ND+VMFEq3k@pt}G!_gxC&X@f&UBq<#%0JUZ^yRgGriYx7kEn=o#@y~A&Gxe%}ev8{jdkSuJ9Z`m156h@EM}KdVLTO#l3|TExz@>7UgicBU==tQN5|73;WN zL_tb)+$o|U+jWcG&P95V#6r@zgL=gok(=k~@L3ZhwDxx5}b=)nYAmuuy zizrBij+r6~QmJFMi1$)eI_?$Gl4>3Ii)hIn9S@4wnfB^Psc)`nrd`BFJkZ6 zuj54#drz&7mqqM7bvl-d*n8@AyeeYvY0&Yyh`py#$J;`c9MJKuP$dU-yf0MAAsruz zC_|Huk42QBS;wa$%Fv?Ya}i}Ytm8`&WjLbaTcJu?b$l;k7doorN1G)Zwm*YBC z3iZ;aW3^B(?K*xH>ZL=+TA^M#b^I>WOP7v6g?j1Mv0kW`6FN4EXv9e!|B7hDDIJ?d zd;xJ<$5s(vK%CK09A|1itD_{&)O=3I_Bd1Xc^y0AOwBzycE*{Sdv%n?nVK)?D2p>S zU(~TH&eVKK$L=^&^JN|7ai-=gIx6B!%~y3)#+jP0>8Oe`HTUVLj{B+kfBB#Kb=3I( zx1;~h;{UmF>HqOR4d|$ila@gpb#c;iT}OSKwA|3q5GO4|IvV4oWmw07IB6Nt(G+Jm zzNw=*&TxE7M@yXH__mJ2afahNI*!B{jz@L0#u;M9bR3N{#Ek1W7H5c=&~ZG@a6GA_ zJx+M0baccC&s`mzal$jLqbp8$W^{DN3D2yK6LG?GPshnP;kmElRGjcU&~Z9WcpmCF z6K6@y={Or_NzLmx7iUQ==;(;%qk0b@avAY+mT-kF(jl)G-ievsuzIr4+02TL`8c1=top}3&Sx{fbS%dCY-UZzqd1?< z{MPX}&iMOB$CEhY@4AksamL@jJ`Zt*-VL9JI79D0pNBYy^i7|KIEVBtpNBYy^kM^V z;%r$Z2HwWmvbGy|U#OQI20j$(Wv79UaS~K&;8UCgl^OUPCqcUme2J5w-3GqKNl>|g zZ*dY-Vc>h5V^yVrl{n*Xm4Veb<8QTrUvW07JqFg|Y*c#<{Eo9x?KAMFP%kwG{>C{> z?KiLyXE>=f@Gs7AQfFW@&Tvw1V5?9s4F zEWvTT$-u4z$Mt3d9T>72}*Otz^MeKxoY5ag3??wa3(=%`V5>+P?~-N=Mt1= zz(7xe(hM5tO;DQa1}-Eh%?$$=6O?Aiz@-GG88&b=L0?7;TuacGn+Ez4^yQX;{seuw zZD1flU+x$fOwgB61J@I5Sz`unB-paX4Gbk%ITHqk6Rey`10xAm&Xj?h30BTs1Gf^C zX4=5*1f`iVa3?`&W(|xcD9t?sV+l%g-@tf+(mXIQnJ6rQ4NN5{&76U|2}(0>U^+o* z77WZJD9xgQ*#xC|WZ+(c(kvOcpP)344LnFN;yf|%Fi}_n8<3QJ%EPZNbDuz_a@4&?6)JWp^Se{bMr zf)0H!u$-Vn9}T=p(4kKTUMKi`@3SvRg3tH9_<|((eDAA)cL_e<`{rAc;Pbujz9k7h z-}~WPlHl{bpS~ptKHppMElKeC-l}g&g3tGU`IaR3d~eOSB*Euma# z+x!l@Zs2Evf3)RMC-}@|%eN%K)o-zhjY5T$ znD|$yuIBB4gC^<)#-l?f8U)6p zCKHVU<59DT0|Mhwi;05*BPN;z#-mmf%>v`mQ4=i! zj7M!IS_NJzwwpLAaQx~paZKR&)oJ3mz)Qt06CDEO>Ne3SP_7dux&&sVlP08y#<0@Knt6K4dbrSm4v2^`aUOq>_k^LkD62<&+mOk5J^ z)kPDR1$MeiCawtVbeBzB71-&nn7Age(_J;uC$Q69Gtn=w)AgAc5ZLMZO$-XW@)<&%177NMO&qVPaTd&l@r^BCzKTo46@3BaN82B`_o1G;v#CM!IFJF>TDmgupRv+{C27F>S)cl)y1<(!^bXW7?F7X@O(fT@y0` z4VyMGE6}hR6ZZrfHf!R(K*R2tcp%WQ`z9U=H0*(iIe~^fG%+vGusIV80u7rtu_(~6 z1rv`18n$R+NuXhmOgt87*pi7S0u6g?;;BHxo|t$h(6FZ_o(qK~h=~_MVF_a5rBGOc zm{=AHOAr&Ugu)WU#A~6j1TpbOC@eutycG&d5EJi&!V<*9d!eudG4VktEI~|s6befa z6Q6{_62!!3p|Auo@kJ;sK}>uV3QG_Z--N;v#Kd=@ummyjLntgkO#BoIOAr$)LSYGF zVpZUBcg4gnfy>=h6KewhDEu!IzXfWxX5x=P&3>C$7pU1E-z$Ndt@~aH)awMfk>EbI}fS*3-&A~mbBuur6B)fQ?*YPQG1 zevz8(wNNWkvwaroL~2%JpxhL;k#etbhP7EZCDO2V3#UaI)?wj{NW(fUoE2$UmxXg84ePdWUZi0s zEcA#p?4*TWkvZ&?g$p8c*l7zFMdq+G7A}d*VP`E|7Ma7&S-2w7weuFPigc~V!Zneu z^;+l?>DmPg{UTkvXkkF4YnLnxigfL=h3g_+yJF#nNY}1f7!v8)H4DQcUF)+jBGR>f z3pYi&HelhFNY@4}+!pEDbqjYyx^~0Ds7Tj_ER2bCZP>!NNY_RzOo(*triDq7uHCXQ zCDOIq7Ve64?T&?Mk*bXT&NS zMM78`Axk~l3MuyI=Aw0O|Q8Htyfhisgcc$wK` z*yxcsHy*apD{*c-V&j6uxv|y8MTv9cQ5%;e&W*=xT$VUD9=CBt;$>!=jjIyVSG$dC z64O_QjXsI#tJ6lm#7pun8v_zA$-8X~O1vaLVPi<*+<4N)u*A9Xl#LOIbK_|nHzm%E zXKdV(ctds8#%+lca9F)wj~9I~+>@vdsv#-hX($%u_d60bjR+E|i!{dvpAV~N+Fw{1L;c>Q_D z##4zOfQ{OCCh-HXF&ob%u2RNrypXs`nXvIv;woj*#pM< zHg?Dq?xT&JGKKqOqg1AFpKX-M6z+?ST{4CHYGb!d;l9}@mnqzL8x=Bz`(dL}rf@%P zRLK->#YVME;Z|+zkty6S8+&C6w`OCXOyPdpsF5k$9~=8+3b$^fR;F-&ZPdvWZo_v? zrf~m!*JSp_P2V+{y>ZKTO=fQ_c5qOpa3v0!WTvm}4w_}AuN@9rWTvm34i3vqU!@L? z$V^{l4q9cVuU!s~%1mFo9UPOHzRDdOmzlmQ9JI+yUzHBpWu~tx2OTogSG9vqnX}{` z2VF9A*j@+SGH1zs4o=8SWHk;>%1mVY9h{Px$Z8#&m6^lp9GsJx!|ENJmzl#F9Q4S{ zVT}%YW#+I04lc;dVFw*tl$pa0Ik+Sa2t5LS3D6FjJ_j^A2VU zb=BkGUZJjf9o#R})ddF+3UzhS!NWpbU2-s2sH@8k<_mRo#lb?MuC6**EY#IC2agJM z)#qTTP*?p99?Q&J0}h_Z%v^&Gp32Nz*Bv~QnYnH_crG(@4LNurGjk0)cqub;jW}4A znYnH{cqKD)-E#0+X6Cx>;El}8b;rS5nVD2oGnJI12!5^8ko%5xG?Fu{RvV$E8?_OUyC{x%uUpv^P zuyej~uv=m0eCwcGVds43ph98ieD9!AVdwndph{uq{OF)sVdwnhV2{Gi`PsotuHLGxON}*9aaCb9t9NltVK!@U(Wfw*HM;0mn9UBj7*Lqa4!XFmP_siWZYZ23 zn_LVjbgkLNutL{bT#P7m?XZiR3SB$m;*P>D+3I3cVV6AWVoYI|Jmz9tVV6AaVnSh; zY;!TGuuHbPm{Qm!J6zmV*d;q%Oe^e?T`p!6cFArRvkJT92^aSicFB`2?knt)r(8Tx z*d{jX3l8bVcUOjeEp)&J7aZ#&Mq^BMZHRqp1WvJDbfoU zjVeWY>EeJ&k(OOFsdVU-i)NJ$y>`)}(xEpl4y$zNt&1Zn9eU@YRi#7kT^v>E&(C*KH_4t@5GQ0dSY-w2fsef5n{>CiXd2$c?f_l;2L&=3D~tL$Yz{nM?o zm#z3`T4f!q`e#~Y9sF`}MP(hV`KMcD9sKrBx5_&BtMsh zpvpS<=bv+xb+GB5bCq?l<)3qv$-LOZuu5M_JdCLHWxI!)Dt+1E;g(8Yc6zw2GA)&Q zxT7*Hm3bIdnU;2W7*ly`wcEpZp(4sXOcW}j!oy^tA}T#h6)K|2!(ElqRC}0KDa{@a zGb*Lo>tR-O9P;G^gIfyh?K#JS?a*r_sZr zN^=f)c%;&tgC3Stnsdm*W0mGKd3d7IoMsPCRhrY{;e|?R4tsd1Qko+kmQ_mA>fx12 zX^wh$tx}p}9^R;w=D3HqDy3=j@J^*P?H=B%l%~VO2bI!vdibbPnl2BYR7%tB;j>C< zPI&mDQks(!!MP& zsn^4r%G`9p!*7+j>7s`}Ds$5%59=y((`65TRpzEE9yV0wrmG(Qsmx8+JZ!4WO?@7= zROY6B55*d990oj;XuNS4^srsyjl*>hJ2c)n-0-kd&s`678ugj>P_I#+84nE_bJMJcMvb}Yo`(Y(bJKkf2Q}uV2ObV-RO+FJ zCXGtXd1%(C)VzlljY=(eIIK~rMGr?bD)q=itH#{49*%4D>Zyk| zjb1(T(5}&|=N>vVdiBCXr$(<{dg#*V)v||fjb6R-a6+S3uRWa9=+zq!r!;!?*28Iy zUcK{hMx$5nJ)G6()dvsfH0Gv{9?ombO`kmUXuNUw?4eg^nb zjl%6nVoalOJChjKC|qe06B>J7SrU^Pd)}@jrZo1v-AUZl*z?MhnARvs063;Yh){w+=jhZzk@j|0!2aDtvKcIb5NS`s^Ty4IIOsZQ7Wli00Ovw}C@Cb!v7iiF%!e-A8a9^1L7j$; zCvixpVG~KT=#*;!UP2#vtx$Y&=rcp>D7I^}wpM5j)<=91{rDc5`w-8$u3NaBP}xfYW+sZ*{;Nu1It*HRLvb;|WP zi8DIodXmIhopL=*;+#&oo+WW!r(DmI=+Ps=DpbjtNUi9VfjeMq8Tr(7SC7|pJE7 zlEe+2a(zu=NT*!ik{H%0*Y_kwbjtN3iJLm*`kBNnopP=C4(XI@)ptmzT)%vWbjr2n zJET*t-@ZdS<@)10q%*Cr`wr<$>wkTRbf)zU-yxl8{h#lU&a}SiJEZg0bSsHjowugN zDcsX3S4j%@b;`9pg$Fw2+L6LTopS9=VNPc@D@|cur(tC&Ea=Q;yHZ%xsoCxn9_iGq zJcT8lnpLFmSf^%{DLm1sSyc*8b!t|f!ZV$k?MdOePR;hFu&mRteJQ-sX;@7PuXP%> zKZQ3s4XaJztxm)0Qh2A+u=*6<>olw(g%3InYfRyzPQwnQ@JXj(2UGa0)38G+e9>uG zQwm>o8rGb`H=TyHr0`v*VTV)rq0_JNKn?g$R2a-=ms6-TsM(bistjs&HHB(}nq5m_k3r4)QrK%yv;GwJ8Psebg&Ko54udJ| zH|W~+6lx8+b|Zy4gRTvwP;W4$4X4mxP`Hs48Vw3}Glc^Ng}ar)L4(5GPT`P2;qIi+ zWKg)#6q*gDw6PRg3|cpy!eN8fO{8$dpmmcev>LQ-Duts4t-G7TF@x4kr*Pb$bu%fn z8MJOTg?5A1-Akdvpmq0C=r$!UcnxEv0bLpk|L#xMWbXCn;PusM*sLt{BwpSqgmy4SSwKzd^%Zq%dI6u$L(e z8Z>Mx+&g>i$1eNAD)pkd!qm^5hE_Y|fK8ulZFy9N#WnZmR|!&Xw5 zF=*Io3bO_c`{mnY(6BY%CWD6k_H8m~*dN~}gNCj9HW}Rf{Pk@zxcS-eZ8Es|`RChY zaPzb2+hlO_v*p`laPw1~#$$tqm89{+pkdq7cxuqF9cer>XxPp)o*Oi*G>sPq4J%9I zr9s1XrLk<#u-$3AF_^>3(|Bvpu!=O^88oaijrRr(t4ia8LBp!k_-N3uJ!yP0XxQE~ zJ{vS_Um9Nw8dj6WSA&M_Pve_G!)nv`ZqTs0G=3N~tUisO1`TUSW5u9hjcKeJH0(ec zzYH37FpV{Xh8;@dw?V_2()eT0u;w(@4I0*x#$SVm9ZqAzpkYVS_-D|t)-*N^8g?{| zErW&~OQYE2M*DagB_=o8ZE5T@xyNo#qtv8a9ch%Al&dq1a+6+lrBPwhtL`)^O?q`A zjVhB~olK+Jq*tfX*kjVG(`oEA>D8Gu_L=nRY#KEty*ii1ev@9EPovhPS3POene?hR zje3(_T}Y$Bq*oWyXf)~7r8Ewh^y+dN2Tgi)C5=NSy}Fu4lS!|xrO|BCtG+Z^OnTLy zMypAs2GTfcQmMf-j+s>IdK$+~Ds>}`Hj_#XrO|Fuso^v_Oe!^!MyE-oZl=*?QmI>M zbemM_b{Z#4Ds?A~lO~lKP2-eFrN+`YZBnW6G|rezWD{weHR;u48s|)UHI>GBlV06T zqsL?-n@*$Gq+By;TreruY#J9$%5^V|OC}T9{WLC{H0(hdS4hD>VqG>u`CnmtQn#H41= z)3|9;vlnUHGO5|iG;W*JY&nfPCN+DN#;8fnUZ*i;QnNQ{jGNT#Z5k6MHG7xFq)E-* zr!i$xvkz&^m^AET8uv}g^(l=9Cgu8^#zT{GeMw`^q+DOqm^Ufcw=@<^%Jn^sMU!&< zNaK-7xqhaxWKymb-yxH7t@`Ge^y-&yj!Cc9d~-~C_1ibcf75tv{^$8WZTJqE{G+A+e1}Z_(b7%dA(MZ!bjvr#n24i&)}~~kt#CSFey@H z23sZ_s>-0);@-JBgA$7`YxZQY)8c!Yy&05Rd{474gEEWnX=*YkxA=-?e+Cs6U(wWN zP-*cMOz8uNmh(%voGdN~Zm7^IPx2Vdo4B9NJay)}hiLc~21^!C z_l*o5TRh!E89cLiriU|lZt+ZyWbne`nZB99ON(dvRtC!!&-CpKURgZTcQSZw@l20q z@W$eq9?RgZ#WOvg!8?m*dLo1O7SHr#1|KXYlqvrNSlr>>^-qAs9qx1nUo7r$XEOL| zafdtWp9+gR+3)#GipA6Y&_5p*PxqXEJ}jQ@dH;M^JlzZa`LKAp z7ya{L@pM1(&xgg+z2u({i)Z?=e?DwxkSG56u$e)gX0XHN@BEp6Qf&UtpZh1p=I{K4 ze^PArikBJeviaLz_RoyXGyTdxGd45GYyZsHJl$_HsIqyw-)2y4^K`%S&ymdx^4>p3 zHqZG7{~Xyo=N~huv3brvWw7672KnrtEt@C)i+{Fkp7^i+*|K@!zh%&1GlP83pwZ^p z|KXoEn;GP%f8K0nkQM*D*~}oT88q3T7opT)RM1!}XHu$d$3vY0H? zMtv4jh1zJy;%=cf8nc)#)W(4J>guuvN)9u;ciSQbl#+BlxY6PsGJW%1Oe7VTL)v#CW#7SC;_ zht4cs*mR>SiY}1#XEWX)Pr8kT3HdVQh#SfdRT+HI9O;s*sv0_t|%UP`2ROLz* zzig^~T2v%x1CI z;oNgCi+v8~p8HwUIGlSPWU=4j-Oa-+Y8@tuxh(1&>NB53y+eH#vS@Iq&tevh4)uAI z#Q}%mPLz0eV%7=*r7fzvN+;UpO;y*I@D)5 zi=z(pd6mU6hx)wE;CmAsz9kMF`kKXQhqpN2vN+>Vr0>2j4n_Lm`{GcfpS~{+Z=zSS=y7P% zY8Jf?ZTjV#8SxpDZpre3`WFo8$03(qG>khrMhgi++c_>|YiG z4tv?A?~ub@w&gqIu$L9*aKoWjB{>W^^lEz!!wzSm9XX6Rlxt@WHyz4Vn!_!Ja+T$9 z+uMF9n0aBL(Puo@Y1+<)9SV0YhaV1wJDxGOoVI~49}4u2gAcP)nvhr;#c z@Xw)e{W)wp6mB4gEr-Gl=1}Z%uXa6$5|_f=$YHxn;f8Y9;ZnHa9Co@CZX}0Nm%`o5 zq0FUlw{qC!Qn=eW>~<;KogB(t3OAZVg-hYaa;S7E+;|REE`^)Oq1vTzlR4~hDcn>J zdtC~5H-~*Lg`3Wy#-(sGIqY{S+-wfDE`__7L!C?E?&nbNQn&{>G`JM*VGfNhg`3Oa zfJ@=#b2#WyxP=@JxfE_OhbEW8J<6fkrEp6*w73-RaSn%F3il+3BQAw|nnSBg;hyDi z)TMCGb2#QwxEDDbcPZS<9NJt8x12+}OW|JS(BV?J*Ew{$6z)w9T`q-tn?tut;ojwN z!liKUb2#nNwGTO*ap~H}9L~CQ?NbgtE;aj{L$6ECzT|MhrDk7q=yU1Sw;TptD)l{w z>n`6<{_xFl>D5o)9G70L_~y9uYSlN#rB}avb6k40=9}ZvtKYskF5gf7@uhK@z1Mwd zTxRdTzBDeg_l7Tx%k2Hnm&RrG-t?t$c_+B#`{MEoyy84&Tq;$P$E-`Gw&!urrBXZc zxbIS_oq0TPsZ?nm4_zu%mdBh+rFP{p?^3DVc`Ue8syvTHmr7OS@yMl8m3b_=RH`bE z$1ats&f|$orS|0U)TL5;^LXY`seO4ocd1lO9xq%fwLg!SE|sdyW7(xrb$PsUsZ@O) zuU#tDkjERBN;T&3)}>Mh@_6SmeI3l>y-TkS)d9-mx#)sn|omr5PZ z-RO(nBD=w8fp2w<7rP}iN`t#W5(WZesYCPIBn8$vPHeJu7)}u`~@~HD@(@-Au z9&H-Vqrsz1BY8A>wCQFZ2RzzzE02R7ZMvPuA&)lQ$)m}mO`~}hmCvGamJMn8#U<`po6gEdX>j5kM;68 zkJ}#W`m%!`35gz{`kH5YV9={3R@Qv{JP4GY82#?IxO19xkp$@ih!`DI`?AV5Hg*w=|4c|R>rqXTr>Cu<6ZCLT> z%dTx$_2|p)ZCEQ*MEN$X7wVv58~%FiLY3RFQK*QjZTMHHi0WZu99{hJ$ zpWsdAelnR%CX>lzGMUUL_}`wxDZBT6%B8(4C`uP;0*Y8r!44{@fDN%=0qlakP_47G z_MP{x{ab54&p8JHTT}c5c8!2-DSiUGR>1ZYKY?8*U`LAIC#e^(GsVwhHwf63;%BiN z1yrW^S?neORViAsU%>7ZEol}|lj7$h4+yADQIHk^btwwcDxf|^LD~c~q$o(cfW{OB z=@8JAq96wa>`zgUP65p+3eqK@Jw+|L1$3mS#UTL)Q`F+HfX)=P=n>GBq83L4bf>6A zuYf}-YH?J+;S{wvCZH!pEshH~o}vsV1e{1whCTs(DavqCz{wP4I3?gziZYxQa5_a9 z`UUi-n2iAe11TDDM!=aAjW{dde2R%UC*VSgMw}OLF-0RT2)LA@5f=pvrnpru2^dOI zi$MXGQ`BNez?BrWxGdmmiYd7wU^qoLt_m1Q(T!mN*HUz2M8J58T3i!wGes?~3%Hfy zLb)N}c8UvSRKT4S-@L{I+)Z(-j0>1ZajV=Ea4*HJa!bHuif-H%FqKNa{~_RUD*670 zfG4Ts`yT?HrjqY}2zZuCzW*U$I+c9?L%>XmT09Uio1zvE1w2nti$?<9r1)KrDFJU& z{I17i0q;`$uE!Grb18n;YW!TL zxki2p*pucO`6Zw_%{B5{z}__1$R7dw(p)2dV+hUK1{xr3y7BP^f z7JEgUNmGk`BF?6%MU9AaX=+g`;(VG~)QPx|rWW-g2Gca6LBvp+i=t7)ZJ$W?aO!3O2+|5!);Hzkf@_jtc(o-xjg6g8%z>MC_{I|NdPOl@!0te_0f;^(r0GEB$MWd&uJiJ!{~zOl^4Ph$mh@H~DRE0}{9 z@zYqr)_5tRqk=}f5^=DCM!Xi$SwSP-#LsF4jd&YBs}(fjUHn{DaBa@T&t(PI=6w8I zR#1!g@pD;0Ek4B0Wd+yfM-j&>_@44f#EA;Nr+gOCSHbs`FCtD>@IB>g{M1%38{gum zwu0IC9zV4e%*K!SsjXm>EW}T31)F3serhY2m!78TvWSZnJVRL#ajAm4b2WZ` zE4Vv<#?NmBcjvG8`K{pY{2f2P72KVF;^()5Z^D1$=eL4y!vEsuw}NlNYb0E&pe1W1 zT(6)d>m=N$pe5@ij8@Q+4HCvGXvszi;}x`IlZ2ZUv}Ch{TS>0ANVuKkYO91hNv^g@ zxSQl^yM&1(S34x!OLDbS!eo-GT@oH9X{wa)C`nV5gsCJ=yCpnM(zHjylO#>m5}qb$ z+ACqYB6HO$`!WCuwSw@Fq!9lZ3ZPn)XYW zOVZRVVLnOI0SWJuG_^?hkffk?`*RO*I=+6$1l!m$h+Y*xbY3>)mZgcBJy*b51L87Azdgp(O2?3IL5 z87Aztgwq)&?2Ux}3={TN!a#LT&+aTjnhG%#iWlUvw zhPO$^;|$O6Hp_UD;Thf*8Ba4j!`mw3S%znL+hj~ zA!B=%H&}f#c4T>jbyCL8EN`$*$=H?U4c2KHm02#Rei>C+E~o(+d$N@4jEw3m!OVMEYoyJMnjfq8kEtPWtxU$9LQ3s%Q9NBRO*V1 z)-08}Dx)n+rG{m+XQ|YPjDuMw=bDVpER%CxMpu@}xgn!F%jAs8IFw~_#$+7MGCAWi zda_K;O&Pse+H_0C(JXDcE#p|0HrC0;`MZAqVh^(XUB5L7K4;l#YZZLSvenip_?l&_tyl0Z%U0W<;Cq&>wo$=CmeOoe zu$ZMZn-wf&Da{rI%UMdZRl!P@D}0-R)g(FF75q$+vqQn}EL&}-fawJHT`ay-}Dtzcb_zp=1K!TKEE*{c<7$nl+huY!#^zO(OBuqnrP_8JA7b9`s7 zRj?(;clJ63+jBhEt5>ii$8)^~1v_(mdv8>*E62C@CIyu_zP;~PP?h6uYF4m2M{^D+ z*ps6Svr?23ZZ zIofnpL4S@m4J#PP(WVgv=W-P3nu7B=uBGb=F68*;e?!4wj=36DFqC7i#uQx6F<0XX zhI8CVHx-QJxRGutxR&Eax~*U|$7OU!!B~#V=&pkC9GB6Ag4;Rjb5FsY9QB!0a5qPN z?kkwg(VPbg?&r9I9x8Z{;|hADU@FJ$Go|2hF8Tcz1y6Fx@4qOR&QY4D3TASY=9z-o z9Hp67@G_U2|0#HtOV0lkyv`-(e+u5@xN}}8c$?$Sd8y!Cj?%nRFqfk=uNBPaD9sxM z?{k#qt%46ZO7l*^#~h`Zi#^Cun)%p+9Hn_5dyu0vA7T%3l;&gXL5|XViap5jOz?B; zL5|XVi9N_sny;}3IZE>__8`Y!5d9u|kmE0i{)j!u@fSoF6#UBZ7ep6h8FKsu(WO|1 z9DhM{IhG;EUl3i1WytXtL|0=O^3><2g0*?-^D8zYPknyJM&zl_pV){zd+Tp(M4r9% zFZLkMwpycNYo5RGvR1{mJb&S3or>*w{=&<86+80$g_jK~cIK(iMismA)Mt~5$~^Vi ztYUYbpDNy>Vo#o*C)}!{I?r!1Y*Vo}&rcR^SFtb8PZsV_QIqE<3wNrh&GVZKyHwQW zxp*p7H0HT;s#G-P`Td36D)#638N)p)TJrp)PPK~GJU^+kS4CT%pVZl>qCL-@Q=_6I z&z)1NqBBov>Qr>)DNVhK?mVSwP;n?vX&O}=&QqEu6+L-MvtPxLJf&$?(VM3<2UHx* zQ<@eP$MTe>RmGV+1!+@pHcvs?Rh-LHkPa2+^AzNuiVJxP(y8KNo`Q6#xRj?L-6{t2 z6y%VKp*#gStm1N>g7m1klBXa?R9wwdkX{wTc?xn=#Ymol98+;EPeG2WxSppVCsf?X zQ;R{$mh`K*mFGLyfQs9Bs&Yofojg@JtKx2+s+?0X zk!M?-S8*>-UoNPa%+r^PD(>g$%Ow>L@_YvyR56vOFGDIG=jqF36;JZqIagFn=jqE; z6*GDIGOS`Y&vi4R;(4CZTvPEPPid~Jc$ud(H&ndIQ<_l~Z}XI9OvSrAr5RT-m*-p7 zO%?NbnsZCV`#jCLt>QzT=G;;7G0(TGyDC2Asn3Lp&w1)|PsNu!^_f)hHBWu+tN50u zJ`YrU&r_d=Dt_dt&m$EJdFnHzVlhvB9;;Z&Q=ca)mh;r-sfv|6ZzP_nSk3cBVp_$| zJZ~gsRQ$^G&(zMU_?_q7#B&vY^1PdPq2h0z4!u^-o2!z&Eco z8V(5DLu)m(2;4*KG_(rbL+drP3EV>)G_(ucLmM@82;4)PG#nJThc;{I6u5`BXy_8S zhqh|y7PyDDX*et-pMTcSBP5@H)^J2fKL4ztSKvF?E)7QozJpb2I4;npDh($D+O%6k zpFo@TXgDoUq-qWQ0!7-ZVL+fr`!t*pC{m4vvjVqIt%h>~w@;mh^8&X|y@m?{w@-tH zivs0p)No0lTumAV1jLFEsNse{xjHqB3Y4o$!u09P91j=<%!$Tpt|IqMApj@XlObL{$ zU&B*@UJYn?CU6;@(J(DguCp3u1j=mBL&TDusa3fvN@Is(r7d5;TXxJqUuLK%4 zsNuCh!-h1x5op+D4etcLpfhY8g_^j>6wO|B1M|kuuG&!Ga4#IiZrXCN~B27HS88C(hCiH zM2hrM!(Nejd8J{W$h^GPP$M!gZ#2}3%*$I1bt3cfPD8!Oyv%865Sf>G4NW57CpGs2$2r`h-DCY z?z0ffAoAR2F_uB(CvcYH=Un9f{&M`Bi+n#{iJxc_R&$O6)|2KZ7#pL_H@iQ&*{rq42OpAO!U!&u)NLAMAxFT}#tkZE-q%Z4r42$$- zgN_lAzHHQSO{6cIbX*td%Vr%nMEbHt$C${Iovk{?MV=FG({WSeIpKC4w~}n^&~ZD- z#!ej*B2Nc*>A06 z<4KZ@S{+Z5Y}Dy^CbF&SbxezFs|Fo2BHOA_$E?VJQBG&Zg_a8bI#N_@%$D&AI z`gAOb^yQ?E?x&P3yR!Z(abgYw@wLu;0C1!0%$3}^tE4{2^i^P-YD>}AHJc+)lW1GaY z!(koUC7vCQ=-44KVb^r*l$fyVI(A7+*bN<(67?C?Q6*8IF&(=l>NBomkHoCq)KM+b zp<6okN_6P9j(rjxx}&2;qClE3*D)Zmqu%Q{BeA1C=r}8JXMfajPU5}BCmrV{F7D4dE=XM5UvylQxVXRS zxFm6Lf73B2adCgwF(k3ee#H7n?6QSeABkPI80#ak%a&q&BzDtHTDyUTBx@Z87L%+UG_aIpt<%7AlC>@a zD@oS64Xh?vJ7nNzlC{GIekED!G4MOd+7SbPlC1R__?u+ysDXb;){YriBXe;dH?UUb z;yz(uoy^7EXJEa|#eLGi2APZdl!1*hZ#_;M*d+7Tqu;<*nV*9nFtAPL=itv6*e=tn zvj%p_^y-{}N||1rH&7+hs|yCIWh!;iz+Rb3T{5swrc#3jYGf)kWS~~2QkMkGCjWU%QG0-GascQ!I%T(&Rfo7R&>4t#=GS||mffku-Y0N;Y%(XOb zpiSmlx@n+Y=32UCphIRO-ZpShW+UD)&?&PK?;7Zm*@zPcx@9)vJp+eiHsYj#!*X)} zVW3A&?mrA1k(2um1HE!`|6$;$oZNpHI3XwZ9|rp5E3^G(4V;s?o1PmuFLO7&FmOTUZhC3pqRjStW#E#W+Uo?CblSiqi-~^RpA?blZkB#-{|+7*sk!6zS+bMg>Uo+Ozc#6!_i`5m%9S@qQR=A8hP3%>;jJizhQ@D(}P1Gn{Mu$w)DqP`* zP1Gq|;XNkm6|V3jCK?p3@Lm&*3Rn116HN+N_%Rdv6}H-O6U_=+?SzQ~3R|tuM2o^! zJ87a-VXK`o(WbD~PMc^~*lPVIIuy3rfQf?&TkVXAPK9|nYobeGUe1~5R+yLbCJrfl z%fDdau)==3Xrf19zg;qMMB$biG|{VYOAVPgs&GqPHgQbhmbzl%xWX-U)x-&fTWZ)u zpTaFQV&bI2Ep^SrDTQ0=x{1>Yx6}<2{R+3#sEGlETWZY28HHPF+{9TWx&JV6PD$=R zOq^Ge`wtTr6mF?ICN3)6Qg=;UQn;liObjaAQuj;@Dcn+%CN3-7Quj?9x7Z= z?@T;WxS-}tOetJY^CliETu|>#JW;ryKA3o_a6x@E@l4^F*8aveDf|l`|6-dI z{)LY<7M2vY+FA>%3cGBbg`Wz$Y`ukF3cGBBh2ILhY@>xg3cGBRg}(~r+HB#U!dBa2 zVU5b$k*yZis=OW9W?`M0{QkX#^(yaXcUah<@@{sgg^eoZ+GSyrO1Ua6Y*r~(m4z)T z<=SmwtIAW!Jr=g9G_2afPL*=)wXjR2T>C6ks+6n7!XA}g)mo@l=~bPDy(+z`x3Ev8 zR}B_wRC?8Dp;o0=O&01@dbQs|y-Kf|Ei|a~>VSntm0q=2Xj17_tA+h4y=t@2tkSD? z3kOts)nTDUrB??nw5s%~(?Xj{uevO>tMsbdLZ?cl4q50@snlT$-71ypvCyN^rXv=P zsI;lqLa$1jj#@aX(xzh;j;XZixP{{?Z8~A$gi4$GEcB_g>7<2|Ds4Jt;gm|7PFpyw z(x!e3{VHu5urQ#~rZX1KsI=*nxUbTjTNWOuH0QR3hbqmvW8slXbM9K0QfbbF zg~uw*xo6>-N@*r7OskaUzJ(c;(mb#*t5TYW7M`n==8=ULD&N|sEWA`{&SML&RGRa| z!fTc0Jhkvnr8Lhh%&C-S+QPg_X=W_ES1HY`g%2vFd2ZpON@-qL_@q*rmli&&l;)L% zFDj*ZZQ;90U*1^wq4I9_t%U`Z(!8^2t9;p1Aj$dOBG%o3Hu?HHL^!L~UjpqD_Ja!So zpi!Tt_}SNJ&T{79T5|spKl@s8{}Dg?T5|spKl>W@^Pl+H*SMem z#?QXS{roR}&NZ&)H8$!rs zMxRDEcH20q(TzPePHA+b+Qw;(ZtS(uuW{$>voWAikQy6jGzwB{TI0TxO3`l zoY!bcgN+LsEoroIQKKbIHZEzjWWS9;jg~aq7}99T0UMV!TGC?UibhLXZCur8Nt=yf zjh3|A7}01+hmC6*Ejei8x<*SnZHy+_=&~`EWTV^0c#@4nHf|=_IBerql8qi4x07rf zv2jOZGxgfIo22BZjfo^B$86k7QgYnJq{e1CVdH+1mp&U0lDwR>@i58DDI1S8zImOt zF_k2z-^Sx4IRiGHB*{5rV>(IBSsOE2^7{uiX0_z^4{W^D_?C6S#w(3)Sr=`**7%ln z$;La4?^c60<}|)r4cVC2_-=LC#(RzLR#$9%(D-h3)y7AS?^eS$zG!@-8nN+J;~UjA z8{ag(QC+vOpz%HGhK)sy?@^;RmNdRcjoDb%_#QQGV@2b8)J+?!8sDRC+4!yTa~`*C z{L%Oxb;rhEjqg!+ZLHOqmkAr|bmrxrjrBV7GHGLz&XnA@u~}zI9@yBTGbImgY}c8M zM>clo%*K?BojSAe*v2lM*?3~3QfD@v+Njc*jb}D$bvDU#{DkUkl9~7k)wyzKZ8YfY zl;<`Yb#}^&_^H*|DKF!vR_Drn6+g8)SMF;Y2XwC7H#S;yHqP7lN!Hmo@8Ty}XXDJp zPqNO&nYYoQvvJINxIhbT-b9SOJ}lvk)twvvC$<1#~vfQmlZ^##xRP(7AF~Vg+<|&uXlI&hGgc zE1?)e)lptF1a#R}-`o;426>pag{>)?XU-!)k0;G)ix zo%Ieb={(ul;9yYa$<9UxLpo2QH#xYh^NeS+gDX1Ec(ypWs`HFztAk;kXFS^+jOaY$ z+3w()&NH4J4zBAw=NZp#2RC(|@$7MMOXnF+ zwS(I_&v^DaxTEuoXP<++I?s4&98Bmu`>4~wyv{!Aa`0YHKL70ClTK9*IrywomBS9c=sd;gaqv~AFGn1F)9FjE zgYP3|(}v-e86QUgBiN-puu2<9yn+;n4yObnhdU+M-KKIOw*KuW`k*Z?BIaGG(B<9 zVsPg?bAJFF_^j^4$d0vw*?3144xe> z#v&PPx}{hogH5*_i)66rR$`G1o*k~nA{p$wpRq^=JMUL4lEKdV9gAeJ^Zvvl8SK2j zu}B6x?_VsE!L!3PF0L8eO>13TH@KVDxwv6)H?4OuYH&Aga4}}E2RFJHH`s%lT--F+ zgPUF4GPs+zxVUYw5x2UyW3Umoxwvbv5x2XTFu0p`xVUGq8+W>xG}w*1T--OAQ z80^L>7gGisakq=d2H(8)xOigl&8ynQQ-g0_dtE#;*q8fUOdIUW8W%GL`?A)>tiisl zbMf3@U)H;LVX!Y7T)Z^cmyIr78SKj@7q1QW<$f1$4EANSi?;^*@_>tX2K%zb#hk&u zY;`ejurJ$Oyf@gF?JhnT?8^=p9}V{9K^LD4_GPDw&j$Ol%f%OiecA2etHHiJvb zzC7&WyTQKfaq+`oUmkI>V6ZQHT`U^x%cCxq4EE(Q7t03w^0~rzc zU|*he@ylReo^tWqU|*hg@yB3a_Ph9NurCK({4>~>XI!i?llu=BYfV~r&c!;D)}42; z-lTOGTx>9D-9;B0On{{!>q;St& z95yN33l}{mg?s7Zh)LmIx#%@1+-ny{O$ztM#W9n@y>)Tiq;T(CoG>ZeoQpn_!p*xl zX;QfNE>4*g?t_cdCWZUxqTi%&pIn?Z>Dp%(=S;fx#l?A(u6=cJ!K7>7TwFBi+IJV1 zOuF{N#h^*o7F-OObZybaWs|NgxwvA|wPhDqO}e(?V%Vf>tFc!mHTxNRWm2pVO(>D77C!NZhE zuQqyko}^@xhZjjoHhXxPq-2YSS4m2?dU&0rWSfUKNlLbRc$=hThlh7bN_KjfOH#7S z!+esGN)PXolvH{6kfda{hmT20_IUV|q@>!z=OiV2J$y-0vd_cUBqcQ-z9lKC_3%AO zNu7ruNlNNHEF>vu@UWPqq|w7tl9DD5%SlT1dss4DuU#HCTD*Pj_OQv~?du^An=O88 z|FDNG7VlwuJnXP|LU6>xPKzf5y&iU1JRvyhq0-_B!7&e27EcI{d)RI9gy4jSJr=bVQoi~5}R zu-~FS7d$ju)aRmy7K{CM$wRBfejD`AX0hLfJhWTM{fCDRi%oaML#IV^u6pRQXwI;Q zZj0uOcsOja->!M+vDk0dJsh#vZ#O&~wJ6P~hhr9{8S`-5qBP?kPFR%YriVU@(%kZJ z+M+MFJ@i}j<&K8|i@x0TaK@r96CTc5^yQw1a~6G>^l;vyFZVrMu;|MJ4;L-^^3cPO zMO7YoxNK3CDGygHs`A*wRg0=T@i1&rm8Tv?EUNO%!!?V$Y1+eei@wZwxM9(kSr4NY zeR=L-%%U$ZJd9iP<)w$47JYf;;g&^TUVFH0(U&(K?pXBYt%ti7eR=0$!lEy89`0LQ zOYCCYj-Rn57Ed65#gPi%?BTaUl7B^GZz{>7G9{JZ9Be0;LlU~7GR zw%B0ne0;IkVC#K+wb)=Ae0)oCwb94-Bv+e!{77=O*~dbXt1UhjlU!}}v6AF!n~&8b zSKEF3Omelu$DbrkJAM33(zMIRza&kSKGxVgm8|ly*5;|?ZXfGx-q-H&vC-zKWVMe? zHcut@`q*sqmUf?ytv0_CQsZNr%};^U`q*yMp*kNsY&ul$W2a4r8hq@s=}@DON}CQf z`KYq#(0(7gZ93HKV~L$Dqur)R zM}2hI6zQ0cgEmDv?xWMDNGE)B*%YbIN4L#AbkfHmn|tV#k6xP&o%V6mrbGQcj@ew? z13r%1T-;}ToUpmL&-&=Ixwy~yIB8R)^FB`56zPJG(>6uA=%e4};=bf#z~uG)7xy(EgEklUbss}E7xxVx zmu)WYQ6E=qF77cOS8XotaUa7r7xzscBQ_WJEg#oxF7DetuG?JPcYNHixw!B87`3^$ zCwz?AT-^73jN4q?lRj?RT-^74+_Jg2ANaU!b8$cPamVK3e&pk>&BZOn~VFIj|Vmv_q30PHg88}d_1ywBRlJ3%H}=Eb03dw-jlrW@xCu(-uRfYc~A1z$E?kJl6O9y+q@^4^YOywjqJRSmo{%q z-urlE^TyhirbYZB2kbHh1>g0Do=v;JN_+Z1&*# z0BaoH(ryT_*5NJf#sKRa-qLOgu-@SJ|wLd_U!&TKBV86pvbs#{q!&TK1;DEzb)f%A1;i_s2(CYB~pglmF!}EiV0PPOX z4-N+CaCm;u8KBGI_U;PM?QnZ{2RP*L)ZkEn!wy&Y;Q&1jS9ni=BMw*ikpR68S5|}sb4mCR!pxM;F80Abuqx8!-QQ5Fyt^{ zg8{BO+*d;Zh8^y!%K=6l?yD;SZa7?3R|AYXTvfvX#vHDykpSZk-`cJPxan|TT@P@} z;l8>N;I_kkH5%ZK!+kXt;I6}cH6CEX;l8>V;GV;Mbt}N6!+mu-zP~)!vj8t0F0JVRuN*F|nE@WJ`-|B3~98{m^euigdt?9i*Z0ACz>H6P%s z!=?2;z&D3-eF*T~puZ2zhjM)ju;Ngz?*UdF z%Jn0_Pls|X1o-7puEhYq9m=&7+vHHL<=7^Na;?NRIh1QPw#j9}e#SPrOxUm3CYK5O z9oyv6us^X)F0=MGw#jAI{>3)A%-Wg|o89F5Zy~n0$@kwvY;|ea`ViY(8nz+Cb~pL{ zTZkPl4cioAr%S^&huG!Puq`1f-Q@dkA*x(zwk^bNmzr%4vB#xmJ3>^u)NE&ny)HG| z6=I)D%_>9GxYVpFM6FBBc892Qso9~THERmd?ozY;Av#=Y)*RxXOU(|1=ya)BONcI) znze@Lc6l1w7UGag*V;oIcIjG2h#r@&9Sm{ArE8rbdR@BK72>E%*SbR-bLrZl5XW7* zb~wZdm#+1M=yU1Xkq{?cy4D-wluOr+hB)ogwPPXrUAlHW#DL3{b|Sd+Jaf6t?uVFmxy>Gg zm~pwy9)_58xy>Ghc{*C6F1Oiqh_^1c z*-VIcF1Oiih&h+r?0JZJm)q<`i1#kH*~<_gTyC>hAwIg?X0Jnha%tV05T9LI_cp{A zm)5-t@zteub0NODv~E7ccbC?^5AnmLbss`3xU}wLh((vyeG0MU(z?$fmR(x+CB%wL z>%N9qb!pwV5IpfccE5rtm*8L8#(W7;LLTvJA-QU~B z=U*c1^pelNMA+pepMQx^=_Q|kiBRQHxJ?mudlYVSggqXG+Y(`)N7uGSsPX99wg|Nz zUE3a^!J}q7A~br`Y-fZfkDBd@u-~I*l@XdfYE~8DfJe=CM`-b=*`5fk9yP0u(B@II zy%E|yYPK&zheyq7A{_LnS#5-FkA~GnIONf=`UrX z9+m2faLJ=m-4O;oDs?ErkVmBsN4V@!sh$W|JibdFiE!1USG^I2J$iLC!iYz&jzzfP zQK{n*Mm;KZBEpzQrTQY=@@Uh^2)8}jbSlCfk2al-Fp*@VKf*na>uVswq{sDjCc=G> z>+5WU2Oihgxd;zEuCMbE9(i0}7a~k~TwfO>JodQ0E=73aaeWO&cH5MtJK{q_GI| z9vvEw@ZO_CHzR!T=+LbQA3ZvBJHjWA4&90H*`q^uBYgF^v?d~a^SHF`MfmP z;c;o*kFelzX+4Or=y7R1jIiW!X+4Ut?EUwD#+z#@!ix9b{}KP|afDUxzyCe{*OLf8 zz5o8V_+L*W{PO<$U*ms0i}2g~?|+H^H67uP_uu~<|7#|~Uypw?aW=vlpC_cxBdqm# zLi!@YI-e(`FC(n?x#eF)*x+-^zmBlc=azpHVUy1-|2D#ApIiQ2ge^X|{9NpT&n-V6 zd*E}+zmKrpr#>Gd?C`12$Jhv;`h1Fw@Tt$|*aM&De2G2qY0lRO)jrMn7JJ|`P2Xb= ze5UC~ggT#TT8L2ZGfj)J5kAwj6dU0)P0O(dJ~Olud*CxetFZ?@GxRg|z~_Sh6?@=w z!T*ju@VVgs#2)xu@PA_ud@lHZ5juS?_%#J|`P64^0o^|JSy#XzpZcsX;IL19HWbj~ zQ=g3m9Pz2orUH6>>a)3kqdxW7Qou2v`fM$r&*y^LR=`Q0`fM-Yluvzj6mZ(7K06EO z_o>gW0tS5QQ(3?{pS!85fb%}}*9W3CUPmwwcnDi-9R{{5Z?xyYn z9{9BBPyr8p+H|;pM?P)pDPYRyZaPxHW1qXJw}59p*V54frhTrZV+G9kTua9bnDx1q zP89Im=UVD3;Dyh%bh3b#KG)Kz0$%xCOQ#EX?Q<>l7x2cXO#=nI^=Z?Y0^a$w>1+XW zK5aTzz`ReJ&KL0Br%e|M_~6r~iv@i2Y15?wKKZn1uz=4#Z5k@zi_f)mxqz=emAX>E zH=jyfE#SLPrG^Xm;Zv!R0v3EKb*+F!pGsXXV9DoNx>3N2Po+i+SoNvYSOGtMDm7lf zFP}=?Ea10KrEV4Q$EQ-a3;63(sXGPy^QqL`0@emRE1f7{UBI)_dj+fycy~Nmz=nW# z$M*}^81U}+K>?cr-W@+IU~@pF9u=@PV8W&f*cLEhj|m2K%+*W*djjTawt(t@xq4o}-hjD!QNX@{xq4YZO~72eDxfxCu3i^V7cf_E z3aAg5tG5L-1kBaD0vZG6YOa8$fVrA4V1K|p{=R_bfC>9hz=41X`&d9rz=VA&pfzB^ zJ{QmyFkxQ`Xb+gMuLX1jOxU*q4hBrv_X0WtChSM7Pr!sN#QFqG*kY_tz=SQu`UFha za;#6lgssH-1Wed!tWUs%{fzYqn6O{5J^>T7MLZ7Jc`Zde3Anghi+CEa{o0Cn z7O?%=i31YFz)iiUMZ5^ugWW~E4A_H*ig*>U2M-tVI$#g> z6!9kDsyb4{+klPOTg1D7jd-+(xqyv$tcdx5jd;9>j{$q|L=m3?_F!KTp9A*b$s)cc zX*yNJw7-Rs(u< zv521my}DGyuYg_+7V$fvS3^bo4d~V7BK`&R>Piu7LiXU*BG!gn;lo9&3)zSxMQjL} zt7}DU44JFzMQjS0s~bgZ4(Zis5nDofHCDv7kc~KA#P*Q6x>>}Ikh!{5#Lkepx?RMs zkh!{3L}f^??iNuM(yNIgc8B!pUJ-jjdNo-@bx5!77qK^FBR(i%Ur4zg7Eu#Yu17`G zhLmfnh`Nw+Juad?q+CymXb36S(;^x}%Jr;>rjT+?7ts6VUi#QrmsSiaQ3#rt{B94bt>QfOXLMrvSh`x|YeJSE(NTt3OaVn%z-(qP(o{N5u zr3ra1`XiPmD} zBv&;hOeeXjEnz0fRb2_QNv`TkcpkD58%lT)vJo3gcp0)0n@V^UvJv-}@HS)*Hka@& zWDg!FVJ>73wv;d*vIkpBcptI{+e-KlvIpBs_!zPWJ4*PJBSXT*O zlZ17b@GVK$p%T6)2|HZEk0fC|B`hQfJ5s`8lCa(qmXd@WEnzui4<0LFC1ejCFJU!g z51uIDXGppFO86DB5l@!zJ7goCD&bGaMm$}@-;i?km+&v7TmvPniP(r|N?055e)?<) z>mqjJxf0e#?8fsYY>3#67fRR|u^TUzuqk3UUMgX8#BLlcVM|2AhDz8P(Xh)UY>Q~v zl@hi`H0){#J0co3Tta2Ur8QDQRm7!rt%ThXm)7+X_C#D-H%h3E_&zvV!rqAQgJUJ^ zi}*e`UP4X8_raSb)JA+Cyj4P7#BRJ@LVd(;yi-C$#BRJ>LSw{koG76wVmIC^VSmJK zoGhU^VmIC|;XuT0d{9D5#BO|8LTkisd{jbP#BQ7_p*^Bzk4xx?sM(Ve4o1}MX$hSX zHG5VhAova z60sYXOSl$Mvz6GZh?=d&UPaXGXY5r(&3?sRMcnegW1Au__&>2t5ziU^#x_MfXZRO8 z6!COnO&OCB8*yzJ_aipqx-uR`?7{VAOhxR$4P`uz*n=C(cown!HkC0QvHdoeF%z-< zwv;g&vHiA|@jPPtZ7btN#P-`>#+xKBJIZ*Q$zMri`yiUTVwumgJ?bjPFTa>dW|%RNcYANGq#8uT=#;=I0s;!LQ5l#SVh?tfv8KS&g|0Hz7I?bQUBn{v8%vU zb+U}g0$0_kGO7yf!P8~zF0cpt%h*$34-S-3U0@HMDPwPeJ$SZ^eFgU5xiV@B+*jwz zs4Xx}7s{wBFijWBs4s9|T`HrYz+4TM(O6)vhRSFvFjtq$*k9njx>81SfeE`>#(@G8 zHe5zafe9NaqqV?oicg~?7_Qb94W8|C(7t8@XhdE8OICk!O1dC6xf6J%jhex z2OpGivcMjESjMRWd+<>irwi=CsWJu%6zOppX9^VQNf~Dg|36D_9u;S|-Dkc`rD71G z3aThhfq~DnedBoL_PrkB#Ev_@?j%m^#IYU6b{so#XLSbm>h7iQQx#AJ8bKqPB_tsU z&GS5?fk7YyVv>YFAV3nDCD4H8sh{(Ezdv-=qY^5r-m~{_@3YS&3mcr_KRsO*HZ;S3 zX1Xlw)(ro->9VWg8UFLrWmh9J{1>Lnu10708>Y*yZqM*HPM2NXnc;7muKeom41e=< zN7o9@lN`USLO5d4FBMC&AYroX{Kx5boTo|Ke}8=B_&8 zU;3?9+AWRvSA46LcFQ9E?cd6$mq+}EzLl@8i1?3xE5BSB@t^)ynZl}w|J=9oywwqZ z!?*IcH4%UFxAL;J5r6Bq@~xVPzx`W9`*jh2&$sfK^%4K=Zxx9*@ZG-E*q}DzfB&tt zZezq>@twQ=FXFHIPAauI;$QTgDhYKF|H|+5`L;y-8^2SYvo+%1@txFSTf~3hJLM|d zBmNWL$M*`Mb#N0ez@i1>F$WMK^v|Ne*+sWIX|9MLCjiujL3lo>Tg{3j#Ihb~6^ zXClgiTKH}eWkIbG|JjJ1%O(0eqAaK_;%|ybUoP{_Bhr`lh`%MG+^2)ykLdeeiTE!? zl>2l>{B05CK3()eM7d8lwh>Y8(-ZM`M3npV^86ywm#YzfS48@94a1F@Z7` z0ktsoUc^_QpoOXTMLqoRgNW|}Kit3%|9|}O!w9IH|53!(n4p~ham3e@K+d1xJc;;P z`Qc0a@Za#mPa~j=;aSAjmY|S29`RjGQ1U(z@m)`lSv-&UZX_sqe-ZHwB*-~mMtp+_ zO4(mUe76!53@0PLkpv~`uOq(O33Agn5#PN8x#`=8Z#+R_^e*Cin;?;SAMuqZYSQ*Y z#8;Ilk@*<$ElXq>Nt*L1Vgls}CdjYxIG-ctr%5_J&Xv85p&95Ug9%pXU{03jjT#;EysxSYq?6g7X0$9bI1QSn{ zPf$ob6*UVI6jDz|&B6qQ)H6}DG(pQ2>Z1lryoBAKjhe{>N#D7sd6S?N@qE-&Bo_Sw z|9T;6W+oQ>9Mr(OBx<2UW7I54)Ix`*s9Bt-g$~V8vm{Xq9WF*qb)v3WXyLad>L8)k zsKJV-@h+F5W_h9x5^9T@6^S}X=yKHTO4P!H_NdvNsD%j~QFAm=A@xes981*F_Rgp| zo~Yp36*VUkwY0rEYEC99%=SdhsYESp?~R(%i3)93qvlMaw)$O*n)*bA-s@3wHc^Y* z`=aJtqO{~j)SOS0mh?x>g+wiKABdWUL&6Omj1`ngAGf6@CQPgxLNs%5$O?Q&Q=aZ=ENm9sq8a2I1(xzuob2UjR z`*_q`OHvq{h??t3QmN-r)0d=x_9AL-Bq@}?jGF!=>D8;K8AwvfJ{dJPla#W*j+)^l z1^PEpGm@kt!rQ1BO;QMa7d5w&q-*b^=1!85tPfFhH%SS>$EX=gQj+xv`%6-Q{2Vp+ zlcaxNqUJ%8Lgm+}d6=ZsrM$#EO45>+iW2iUNz37 zl9ul+Dlu=8wBTiNiFuo(1usiV%)2B_IaimM_eq*^URq*4Bx%ZdS&8|Wq(R~G67wlZ zgTfUh=5vw;g)2+Umn5ZIt4hq*Bn=8zmzeTol@r#Kn2KbT6V{fPnaK*SH6>#uEZ=z zRvN#h#8f9MW#3w2mL{v5u&u=OB=n9&qH zm&5dQinQqnJ)NQg-BJ1|MLu(kK1z|#9H&20+`%pVk>U<+OUx>dbm&xxS?!Syoh~tJ zJkp^vC1$-xm%P-Mm<=9X@^ZGs)OvKu%efM>(W6UV&X<@29$C``K8r_w*}!M<=(jau zbsqh;CalgQzih_pJo3wnSe-|H*@D%1~jokxCo39IwSFWdMY9_0*|u{Dp9-ga!w zqcUFy-_4`!;R@f)qcUG7w&qcpuM1oADEaKh);!86dP>Z4uRNu<#H{ejQ?8bnm0o$u zHJ*!Co^qY%;?;NSYTCY5%zr@sd)%yb_W{+2veY3>u^~$mbOUyB^EOw~G z9QUe>ajV3f@T!b4Tw+dorIRBirok)K8!a)7Ua8*g64T^W58f#;&0h83-4fH{RqPon zF|A&ePVbeNOJ0>u@0Xa%UOm$XC8pi0XZosOz@n(^lFImg1+>sOz@H(^h$kR(QjUr2`1?`uLc~i zu|%)R1aIg;ugU~(=|Qi`1n=;3uM+k5__40cc&_X zeZjj^6~Vrim_@0IOy#9!ajFvVic+&ARSEdaQd6C(1bkMhS(Yk|m|bd?r%EH{l$sT( z(uldGW@V~0VqU3PovH-9vec|eRhCgzYHCuY4D(CPx>PB{f>N^~RSPQ@mYUjBEv#Hr zYBr@xBNmsMx>V&LOG?d_ROKMmrDkiYa*(B^=47g_d0SR$I#abEae1lfN|jBnC^g-w zvdNXDrYBW4xvJFkrphK)mzt}ovdJ~2=31(3a&4)(o+_KHDK&kmvdML&W*}8Mw7%5b zOqC98C^dtr(xKW?Gvq$qjiqKdRr$fDQZwQ{-OZ(D)P1^jrRH|3@`Ej<=1!{egRQ0J zNvgZKt<*eCbvL(_n(f2mswsngrRGhlrVRF%nzyMM@E#~N?^C5E2TRR|RB6efQu8rYT5`D5d`gwwA1O6o zQdI~zT57(gYSeM8)Rd$Q7(4O$yRUpQlM9y6E#XX+(Faxs|48)kB}BNh5mc=`=m7 ztMqi5rdO`<#M4w3xy}<$Q#qlJ=bWYt_Z zO+~sk7!2|3(`Dngc=qYC@nN2Qx@>%;)XYhjjgOX^x#_a;+ofh+x@`PTsi{ntjo&Rb zRq3+vu~IWXT{eEN)GSC>AKfoC3)9s{4@%9VboJ3g^dMb*^awpjmzF$657MP2PfE?w zbVc2#C_}n>>lw5ACz(T#LXseM2<($$wA(T#NVEz64yMafs>;lvba~4BGIKaxg~kPC z=195ZW*(%=XO@+jM{X}H zFEfwbURY6Po~BE4R+gD(>C&84WoA5GW0KWnW+GiB)Qf8_%^n|vSnY9`E=G)3lO@>OW+sn+l43$`Sl$rGzMIoN)&N8zhLn^GP5zG$Peu)Gn+DsvY@?XW^+bSCbX~2)MY5=+D{*4$a@aZM;Y>-gY;2`yyp;o zlp*gqOdn;)dyddY8S_Ox6YKA(;4cm`Z9ASL%nsj%+zN{;m(zrvl)uS=gZ8w3`OD#W#)W_`mLeN zG-SwU8p}*$hJ2=}%rs>vdu=W=%^B*qi)H3whWf3g%(Q06XIjflTZXHDWu`qtp3+uk zIx^%bm&?qR40%d>nd!=qr*xE=o(#p0D`nlyNo?lN;DLrU0F zW(G2(guPg7hH|8`1A=sApaW+=ZJDKoD#lwXZvry0txZeynz z8r|K&PBWBW-7Pa8GE@>Bqu-`V8Se2krmDDnzs&Sa)n|FYx16fa^03VGPt|96#P^-5 z&+@p;+?=Wj?k9NdREMQu$|PW^}41jK=xqQ}szF%FLaq`lQeK=2NBeFZkwD zH4c5r_noR~qE~$1saiNOiT_Sj$@Vq=J5?pyH~8;Vm2BVQzf)DReTV-}RjK_w{ySC6 za6a&arfM0^N1o7BEyMZ5bD64~@N=1YJ5?q5FFc{CnkM?n6PoHSZjPCcQ)P)2G4pAv zEOBPce4Z)=nH4i%rbt>WlA?z#LWIo>Bh>KIglycSQRq|Go>4=W9C$*#$an==5(gU zU~6OMOr|c{tcjWWOkK3OE@sYUN;lTW%*9M8!-kk?$&@nG#!PFblwo7cT*_2j-4rud zG8IEN$4qCYVrX5=bY&`rZi$)hOvTWxF>@_bzP~MIu4n3rZ;zS2Og-@(F>@nRPkd+0 z^k?dc?~0j$OlkJ+n7Ns$$hjwG1~U~o_r}bVOnLIYn0cBh%ibR|&oUMB4#doOrhNKf z%uHm;rw_%<^Gx~l;h1@mshsdg%)HE0PIxqCUS-O=kHySnrt+NQG4nc8etsfm-ek(p zPsYsKO!@h#n0c3}y3gsDd7mkdKNB+_GFA7f$C@(b@n^B7OnKQktSM7oc0OjlX3EPh z#7y}#RrnfWrec~#){QYUbDBohO))cjn)JRoX68(j-d~KFxznWgEip51n#S0z*yJ>A zJ->uaPSe)&Hf(a5vZ~A2tSnv3dW}z-rHfgw^V_oYKl=C|S&9`mu<B`X<dX7sbC&w@0rs4wzI=$qW~sLx z#Y|6@dh2n_^k%8Ip2W=6ENS9X>^V!C_zZi_k|vI0&snP1O<>Pis@FZop0iZ1dx1S? zDI0!?J!dH!euX_}DI1=QnV~G{1pfvovCUA2WBd zG-Cb`Gk3EzV*ZE+WNAX{6CRMIaq?$8AWP%qFL*$fH1R7QkR?qlkDHfS%55v+=2ez* z+nI4QnWfxzR@}VKQf@mtZr)@mx1AF=Z?hDq=f=&uEXC=0aq~V)ak?^YK4!^7tK#NU zmU7$qar4>jqXlvEB}=*O!npaGrQCK=+?4w?b-p-mDtwwaToN}keVRJ2j+{W47<tj4 zb#2@%^l7wR6E}-|8f~wOo5enjw%5l^wNIJbhPYYkQ*K)uH_Lp=Z8yfva-VYBO>wir zr`&dP+^qCTsq5lql}}2&C2m&xq|{sEW{pouy)ACm`lQs`<7S;te!e4a*85aJ+Zi_- ze5&N{ikn)WD*3zPW}{D){5^5A$*036_QuU-pFDnF+|>Ex@%!Uut51G;Aa1t#VaojzTid?apm`E+&i(YV>|)78nx;%1MpXp)~h9yfb^^7s>R zv(KkY@MPTV_bC%R6*mWb^6t}dbI2#cEUYnZ8hpy|n&PI>r_8)LZkl|`%rC}GvroBROWa)X$-7(Q zrqd_yz7#iIKE;5xxasyO23(Gt9-m@Bd))N;6azZq=BiII;7Z(F^C<>&#?5t~VnA2i z^!XG6y5r`CPcfh;Zu))Fjo!E!@JTnW#?4KibmLmw4EhuUuE))gPcfh`Zian|0XO1i z#3xnhkDF1SRAnG;Zu_JvH{<4xPpUE)H+Owfm7%y9^GQ{1#mzmRRAo4B?)#)FBXRS< zCsi4Zn}t^&wa`cAH>ZI zpOz0iL=Sw*!ycgrKILJL(F33IuqWt&PkGo=yxS*zd4_lUq%Y%mw@>;qfp`0)FVFF5 zzqI`YKJAybzr?5g()L&Qv|rjjiBJ2b?XU4^zqI`gKJ8Zq@D`u;D+73kPy3}W@9}BB z^yLFS?N~&^?$Fm91US|$?EgOIFI&;C%Y|P*5%mZ&{WB*>K61t!F*uox$$On8;G1mJ z((6=%Z?hTTc%7x-yKF`{US}EjKARzq*I5pJ$fjE6byk2MvniK(ot5CHY{olYXBGH4 zn}V6wSq*;4refxG)_`BLDHVI2wP1M;y6JUlz=|A%)9b7Q=jTut^E&In1vyNDdYuj6 z+8lJv>(qiZIS8BA*$A%BLD{^{CU8Rz(&lwGgS9zmo7brWH|8L2US|uqIfpF9>ud%0 z<{(yHXB)UL2etA#+rbk#B%5Am2Y51vDvsCL37*QKjN^57flWEsnAh12Hs@euUS|(@ zF$XL2I(xyE9L&t?>;qeKursf-AH0-U~XRL7}%Ag9y$&VEB zyp@9>d7U%ha1M&(b?U*993;u>oCQa7&?K*O4!oU%A$y(k;GG;)$?IGI@8%#&UZ(*Z z%aK(#g73-p@gqyiPOtAO~skIv2r*Im}CXofhy>4il4JrxkpfLoMIyTmqlv zFd^x6+Q9J~77==#%iu%~!&0x)4nEIe8KKwd0AJ)#{PQ|jz?V6U3%yP!_$r5iq1WjG zCvzAXdYx|YZ4N_MuhRp5$YDmn>-2&jb4Yc(&Qx_YQ0ZK() z=N`BvKsM@i?t@zcq@!Nv0k|zd#PT{1!R-NA$s=$_Kvwb?+!>ISJOOtFWF=3*-2qw2 zGjLBpRx%Fm4aiC+zlxgZT`e3CLi+fb{_x z%vbPiKn7D@kzmdR7}%h{;Q0U}8}t{v5RfR$0viI1UD02#F~Hyz{RNu>j9$@SusJ~5 zgZ_dS1LQsEFW3^0mQ;bQ0cpv6@KS)(2mJ-x0^~mEFL>ECqeWo5YetK~jsWQo`U_rh zEvg#qbS-Kr*yUQ(GO#Z|xeNUTZv>=9E5QDM)MzC*5Re+J0&fPSMytWWfYfLWI24c? ztp#tnhFAj*yN0+990^E`)`Oz~snG`Tc0g)W3*HGxjW&XJ15%?+;8;NMVl#Lzpml^}K2bg#CI)}kG z0VW>NU+`^!sv7zWz6+3Gp}*k!02!9oISzgZkYb^~;Ku+t7WxZ*3Xo)>zu@NpSr+;W zehH9fp}*kQ0C^Vr3zi2JsLp~FK?SOF;LIRtIQk3D3X+GTzu@d3i8%TT&IyuLYMpP@4J}+#i&tJ^>E|rKwNBgF$KP zGw@JQnmP_14oXuez#~Cv>T~dDP@4JzJQkFuz66g4rKzvL6G3U}BzQ6?O??fX3QAMo zfTx4f)VJW7pfvRzSRa(8z6Z|+rKumlb3tk9NAP@5n)(U65L6KU3^oK6guj4|K?UKj zU{jF#Ecx$D)H5hetpG0urKvN)mY_6s7T6k;rp^X01*NHTz_y??buM^0C{3LQwg;uD zm0(9up}7jY5>#lO4|WEnsSCiaprZ6busf(Iy$I|HDoQT~dxMJ7OTeo^Md@nrT9C34 z`7d}qDA8R8_5~%n%fTB#iS7!pKPb^%2@V7$x~ssOL5c2aa4;y*T>}mU75&$Ow}OiP zHQ;biqPq?p2}*R=gQG!-?gsF7P@-E4-U&){H-dMA65UPUSWu$78N3&i=+=SvgA&~> z;Dew(LD%G+BLA~FZenr(LD^l2}*R2fNz5m-J{^UphWi= z_&zAnJq~^dN_0&Sxf0z$aAU4ScL>~+E783LZqAkH4uf^M65SDSORhwB6x^CC(Y+0B%a!Qf z0k`K$bnk*YawWQB;E7z>**)-NuI%hScq&(R_5eJcD?57#p2?M+Jp$`kWdS9bOSY|fRPy#z1j%FbSaExEF@ zNw77SGK$xE4PMHnj^cIRfNi-HQoPPv@NzDd6tD9RY|o{X;&tAG9l2C!$$!Bsxs+AB z&PT8_m%57A`2=?5QdsdipTX{2Dl1;+3)quOX~pY&1$%R;t)RcNkT%!OD!^;5oy`QV zyLL7U>~rmGHh9CevpHbDYiD!80oTsvfj3<{s{{vKJF5bRTsxZ&-g5110XXd1*+Ou{ zwX;RwsB347!P~B#EdlSic2*7Eb?s~^IOf{fGVq>jXUoC+uAQv_AGmh55`5^|*(&gn zYiFy$$F7~N0iU>bwibNq+F1?w%(b(1;J9mN>%oa!1@{f$^IQe@TJS}#g8N4BWv+tz zCh%3Rg8OE0GFQR94t$-f;JyWXldIsq6?~hk;Jyufm#g5u9ekgw;JyR=kgMRn6a1K~ z;Jyp|l&j#r8~mKB;Jyd^lB?jp7yO#5;Jyzm52>28AFK$ebaDWk8B*!wAUG?;^d0&O z&JHnuNB#@W2{92w{tM0xX~1+8oEOr7=@?iU(tznWSQXNM=>#}Gq~LxMTo6)lKLsuf zDY%~o7ljnu&wz_V3hwpbl8}P?S+F{!;C>EV8d7jS4=xKSxL*L5hZNi!z!f0{_eOAK zNWr}cToqDqZw6O~6x=U@YeEX{E#TUaf_p1i6H;)$1g;AyxVM4pLkjMf!3`k=_ja&0 zq~P8GZVV~7Uja9T6x=((%^?N%F0d}7;NA^x2`RYufLlWf?!Dl)kb?VFaC=C>{TjF< zq~LxX+!<1E?*n&*6x?rsyF&`@{otOEg8KltH>BWx6WkY4a32KshZNk0zyl!#_gmn> zkb?U#cqpXcJ^~&NDY%bTZ98z#!2#$ml+!ukPAqDrv;O&rt`x5X@NWr}tyc<$*UkZ+e6x^4A_d*Kp%fb60 z1@{%;gOGyzO7LMw!F?6@D5T)N8hjj5a9;yH2`RX*1)qi#+-tyRAqDq!;CM))yB?ef zNpv@W&qEU3TJS|kqPr1%8ItI30$+tBx|_ktkVLl*d>xYLZUNtfB)VI{w;_q{Ht=0Y zqPrb@ACllyBqu*lIZRMzl0>Zd%>?Eji~m4<#`g_{a{6& zME3wVGf$#>5S*1K(LDst&XedK2Iu5SbdP{@^CY@Q!FhQS-D6;7o<#RJSd}NyJps!83U>qibM&p3LYvcs5UF)CZo=llI*JFXT!4`oV@gY2N_Ym?!PK2{z?P`v$@0 zJZaw$crj1fcMELEllBdRt$EVE5%5x;v~Lt_%aiuq1~2DH`|g14dD6bSU`L*`Zw$PW zC+)ijcIHX@?t@)<(!K{^cb>HGA=r~A?Ry0F=1Kb=gIDvUeNVt^dD6b8;PpId-!rf; zPue#Q-pG^oO@RG*(!S^5K%TVk1$Z-0+V>J1%#-%L0*CUXeUsp=Jf`!=f5G8A_U4iQ zf+KnC&LjT?NAp-uK>iEf&SS!l{1?2F$BZBOFL*bPDL?XGa4e5GKk{GjULFgr$bZ56 zd91V|{{64eH*l`eoMkOI&#(Z2`8TlAumXYkH?Ybm z;oJ<)H`2a3aDkEbZ2=b=Y2Q|Gk&*Uo0~Z@<-*#|`k@oEXtBtg8C%Du|`*wlLjI?hz zxZFtl_JAvlv~MrC(n$OEfvb$PZ$G%&Nc#?eYmBt-Ah^~j;XDM^7$uyC!F5In=Miwd zQNno?++dV&9s_HQ63*k`Mx%uD1h~m4;XDa$HcB{8fpta+=V@?@kcfqlB{w+-sC@HiP?&63&a@exro5 z1w3GsaJGU6jS|jF;31=gvkg3KlyF`Kj~FGK?ch1~7_cnOhNObRj z?M9+|7wj++-7)Zrk?7t7JB>v5KGx(~o^Bhh^b_85uoBk-D$(mn>S8!7D*@P^Tp zYkVGS$#3*Ip-Vnu(!yN1IE&|h%Oa2f&n3*IvvM}Yo<_YHfZ(O>X^ zVOKQz3qCaLi$;IJM~0oz=r8!#us0h01)mxYB|v}YqNzqXK?OK&loQMZCya7}S>SV{ zoM1Ni!YC)01HLrM3Fd;YjBMloM2gpN(>YrQjE%oM0LF)kt2KgB4*`bFuyboEc_07waFu zSz)bSSOv}wYxTlva88&#+~_YjH>`CaYr%P84x~qa!OAcv(xbm%Rai?x)`RoIY}H18 z!3AOVYP0?UTo`64C;AI63TvUrCU9|BOCdIcOTtC^T( z)(q2KuqUh;rZKQLtQn?z;MK5ZnC^qu!dmh10K6V%w*u=Qz`n2+e>?(jgr&5P!Tzw6 z_6ax;meM{2Z-%9`&%nX3ly)2(3QK7xz*}J{?Q?KAETw$`j)bMOFTv5Ul=c;PJ1nK0 z1n-2Uw6DRtVJYn!a4amPeGA?TOKIPM_rp@!_uzxDl=cJoFf6702tEo+X+MFF!&2JM z;FB=tP@uoy(=aDdpuga=Fh{|lzw;2?uyTS5a3ZXnU?%uHtejvL_#&*FU^e(NtejvD z_$sWNU@kZrR!%SvEYC0cb>6oUtjK3u0qf7enfdJTV*MF7E1ykXtbYJ!=d;U;^$*~j ze71S9{tTR(uZ(mtI4@rr=@PIqUm0mNSe37gbSXGLUm58#a6!H@(&ga7d}X97z(x7W zNLPaO`AW)GfoJoTl&uEO=Swx#fDQS|#MXk1`O3sd}U(m!HfCI#5RDf z`I3rSuq|Kd*GBMizS6HvU`M|6VKaCoU;0o7cIHbTwt!vv(ub{JcfRyt8`zUCeb^56 z=1U)TfLHUS4?DqY`O=47U|+s+uHE2`eC1qw!2W#YTzkQr`4WYF;9$N)VLv#OFHtxE z-pZFK90Z5+B?^bYk$j25VQ@5GqHqMfoi9;13f{?=C>#Ut=1UZggJby;g%jYte2KzI z@P58T;S~5FU!rgte3&m$I0HV)mnhVOkMku8XTc}=5`}Z%(|n1-dGJ}jMBxHBo-a{o z04MS#3XR~0e0g^h_&HxL-3)%omrGv+zvj!OTfp)HrTML3MS;@%OW@1`rTJ~(tOBL^ zm%-TuO7q*nxdn zp{wBH0>z}&{JT_8KV1+FQOoehI)3uI>_U`>JSY!qBqAUnGat}jp=x&v+~P#n4o))puZje#2r z6o>ACn+jxd_rc8tGPws}U4cyQA-JVLCie*3S|F2q3~nos$vpvg6ezcU3hpdWZvPD2 zRiNB{9Nb-?+k#x%~@pUx9M_m*D;a<@T?@0|m5V+ljedg1xl0V zfvp8flPbYWu6b60ZLWFF2iprY^jrXT6iDzEf>#P8c#FW!0twz?u&Y3Vw*>4iklbG;?zC!ied9c1v5$6JUwonnL0cE(_sL*i{yi%yp z(E@fBDs;4hU4;rAm%#2qg^o6`r%)Ym8SE`o=x7J87AkaffY%BYIc9{SH`Lq$=;v8q{58(46&Qc-&1z!|#ZYudN__BzDQ^|j;NMws7D;3~tw*zK^ zZ`=-;1-^AVU^e)!NTF^H_`&Ufx!}hlm9gf5pNdq*ssuk5sf<+xekoEJYd-k3NV2j3 zEH74_U?DiOSefo3a8|K0-NoSSVr9BZz&XXrbgRL+#maP-g7b=%=`I5+iDVE@E0?!mncQ%9d#nPQR@LaLt#TM{y8SYopsY%W%i*a2QFR*={UwiGK!>;hYh6(n|pmx|S!d%(70)hG9Ymy1=O+y}N7 zOS$%g9mP_v1K^cndDcO&vsj*W2<$GFXB`H6i`AP)z^ldT&7#7lBPYSpVkIM|z}v-&BB#MS#fluj@yX4+6H%`Mvu)8s!(C{OsQ zmPDFX+g!3un{6)B6#X85e!`#M=g;83x9?cEFr_@9aFK0R*=DtE*4SpPZE9?@-ZmR- zQ%m#H*KN~hn;SIW9OjL`Ibxdzno9R=ziG5DG})%vHue*J(@pcUo04fZ+vd1!PT1z8 zZBE(dv~AAVrrtK^ZF7O*#`SUqivdO(`=g-+qBx|l5N^-bJ;fSw&}18pLAd>YM6 z+sv}f9NWyZ%~IPev&|~othUWs+tk=*y=`i3v(q-aXnyVcx7}x7*l(MIwmD>*Bepqe zn{&1~Z<{9DG~1@dHm$blu}!aS`fPK9ru+N19k4Ilw9SxhhHdlGHj}n_W1Dxj`CyyR zw)tY4ueK@AqN%XWY}?GES@QkcR@xWl+h&n%7SsHoldk_kmu|UfJfgZQj`CqisIf=Cf_S*ygKk$~`ozY_r-nYizUD zHZ?RqH~5X!gde=OFMObxYOQdpwZf^^0H;2sS%PF;LyCT=qm-{h{~N`$pK^F6~azFG>bfnt=^xHbV<0kYwI=*8N`dw{2 zAAfXxX6 zvUKNeRYEu$3AH=+I98dz{fd6qJ?I~5lly(>A8Bj*1L#NE(Ebqm^`hV4e>{SIO9wMO zhJKquUAprG`WHphey=>?4@jM!^0%*vDqlVW=h#Cuz0No|-=3K1cP7BaNk!o`N#EUSo=&AfpE!fIl{1OC@*UgUsHJEi{y zh)uge5!JOC_vjV4FP^gRNp9hfR!uD?m<+7y?&p%{5I1R1`IX~g&!42SSpC-F% zK~7NkX z0Nf68eu7=Gx&vI|(*lB>AZICL^6D;-!xS>W-5{qaq=9=tj#Kc0dqK`q@PPY34pc}6 z_k*0MV7ui2$dL*Tco5{&1iP8<5Xi9!@4&+#=O(-XkANJUFbN(7IXU4acnsu71iLTl zILMg@kH8Zkhay-5KM8Uw!aeX5$gv34uTF!fd`gbbfMVhpkDZ)9h z&7McVRxyxc2u^?(Kz7-$1RFrM+1t&tjUc=0tHCCa?e&YnX7HWe&Cgab@V(v6&sH&T zv0tU8R&b?XAN>-z+3uoes~A{kx6!jz4BYQmy|EoU=GP#%1FZLJ2z3Q)@~arw310SV z;MxWD_%$x=2K)UQ;rDbx!c`uft%g!?!#c6yWM>R+~RI`9|hU- zZ~fvnxXs<}eg|a#zx9i|;0|}Y`xwYs04I6%9=I!8!gL?xT!5pz`T*Qx4-jCg3gn1@ zgWw}@U$)jhJO)o?yF+#GbhbNG2hU{dnLPvRvsD!t2hV0}Y%u|z%huT9Ie0!>5A_9j zAzSwF5^TuUu>KX;n60YFB-oU#r~Vpj&Q?|A4R|qIh0eENOSTG~@4(hJ=3wC6?OJ%_;+3r$Vuru3TDhqaHyGvykV9MFl2w=OfGo``q&p=7Bfd^ARe+e)oKYDsUj%T`CK5KEgHLVFCEm zHI0SfE4SwtfgE&TJ9aVn{V@egz{(uW`B#J0Iqpy$T$qgwg&Ym`cY+N$Dl+Z@8*`MZ>;^eC;X1!!56Dpoz2IJuqY}EoeIQ3A zbb|Xqj!Lj`=m5x32{xi11UV|<5_kyYsDu{qFvw8}&EOG`lMs%BM?sE1I07C6Iq1Ni zV{jbgpo4wj3Gi`_-039v#66JU6v!zA>-mAxAg2)2fM-C?5U`S255CKhWS#{%PGAAA zo&z~f!0vB656*V?fnNYQ4B!*5Hh>%kU_(bEIM3Y&-UL><`@oyQDt90FMR2~m54;6j z;O+x&1sA&ez%PM|+|$_hf-~usWbF>;RX#8^y1H%iN9Po#1kJqj(p% z!rds|4Xz5P3wyxT0d-+7xF(=3yb7)js0*)wH33DZ>)<-~#DYGM!wc+*1vkJA0fmEp zu+}}iU;y0c9$s)0-@x*P31N;17y~On zjtIB|&ICCkU=*AMazwx|I2+`MfFW=W$PocHCzuOzL_j|{59Ek|KCluTa}OD)0$;dC z1k4B7o^Snl0mz>--ERvTf*Oh8$q^&zXmsfYzcn_ZU)&0{v50W*#|xj zZUNZ`{uJB_vJd<*xD8|<_(O0z$UgA<;0};|;I^}Ng6spgowW;OAGqzT-5~qGZD;KP z*#~YrYcI$?aNAk?K=y&#&e{*M58QUv0g!#*HY^?l&$^qF4}t8#ww-ktWDj;Dcm!k* zwoQnRg6zSz1BGKCd$8-l;~;ymPlG2wHeTC2^(4r~>to<4kd4ytXcV24v&4 zb?JJLjn~$t&w}IsKq=rku>4n)oSp|Oenolp1^ctV;w}{cxBsd>P9u2WSIN0johHx@ zHUAE7{+|CUd=a*z&%cFRzURMzTj905{-5AW-}7I=ZLlq0{xN*{d;WKDJ8UbOf5fNl zfZKnh5OD?U_>oelPH^-`S_a<*-v5!@u^W8wBe`P__~=KP`{)H{{aBIkD!BZ|nr*)Z zuK2N@<8^S|kM)@Pz~etwes=?W`)j)7vVUR1w11?lp$4EI>gu_h(2sQ)<{`xmTJc-)&7Vw!fjsr1D%0)2m04K1Me>M zM>_d#4Ekf8cXto^Q{8KGANq5~hCb&3^p{1d`c9kR{eryTLtgvu4C^RRK>veL-4y3B z^gkKYO>v$;|BEplw>?3B&ya44^9=eHzntQXL*L<+Q=AEChP?7QM5)+%+6%BEL7w&! zoS7g`dj-xW6PdT*ssu&BcVMl(n~L?a;6{5F4@C%Y zlf9h^5e9eKTc{9Wa94tq>@!F$=M=Ag0rw=RC%=M65|s9rFG`qp)LsgN2!r(r$}eYv zXA_iP&H~RRD8HNyo=;GIIR|XxGA#bvT<~&&rg!Fn?FkaVO0XkA0$2t1C1{8{AH0#E z%EJP%KS9~cLU15K*~=pEc7hV|#o(O;CE`oKy9r9ftHH4ZCE`oLdkON&W#Ih;dF68O zL4roRE5L{Dqh1Lc+zif2Ec#8b4xF7>^y}aja89BY zwrvIHCaUza4V;&#g>Box%0w+}+W~UV*RSy3c7pR0RU6s`E=bgL-)@jgmwtgC*aLFw z($9f=L9Si;8E_xSy-VMK`#~;VDgqCH+`RNt;6ae9m-4|wAa^er@G!{bOCj(GxH3^& zEslb#5>}OKL9i9%hNl7W64+udcA^LYw%VJWC_;dj5;bsW2ip?mkR9OVL^Ti`r<-)(SOjTyV7#d<_mJsUGnLlT|Za3Z6=KlVI>dvU1$zU~96BYX#VuEaO@Ua{H4tu2tZWy%LHf z7`&S-<5~kgNtPS-SrnveG&Ps9h7o45q>MuAa#noSMUW(%8F0e91 zdogx{RVgY@?*Zqhs64$FT#%yj^geK5iiQ*W!9^(=P8H!A5L}(2B@~CiH7R<& zhrzWeim^w)niR#@qu{y}#n@xu`V@7*aj-T;LV5z+m?9xP32sVp_v?b2QxuO+gLNtH zeqC@&isErSxHU!b_$;_DMM`@P+@B()Jr5p8kd2cqOo5OcsWI5zh1E2UKhrBjbKNLtmGQl znWCcVb+9W%rJp{qJ4IrC1MEqWnD>LdDH8Jm@M?<0{3duUMH)2-UQdxm4S{_r(x_YD z-4qG*FgTVXfgSIG*Pq#n(LL~K ziiQLC!DlJ%eg$wmMbh>VoJdh6^%3|fMbh>d{G6ik{S)v@ipKX(!LKPA-#-J(J?i;! zu)?FBp8#ii)br25*&d}|FTgn-Wx6lHxgPcWD{!7iJwFLnderl;!77h>{tY{Y zawl6mU+5jkrEG2BdvL8sef$Be@u-hKg6ll$<4+*hwl(mxpF!?zI}d&Vxwy^t@mFw@ zN8`luB{+jel34-Pc_f)L!7U!06FUps>R~b!{ROvq7-*os;C4^ZKLF=~J3LZ?dEj}E zvY<-vf=5|U71(C)i9>(EL63&y3&0_d6mcQQ^=vlbTm){LBGp(7HcU}&v;=INqIakU z2d2mimx4o6)B(%D2U9eBSPqU)k$SEGUr&)Zt_0sqQD|NT&h;t{T@B9jN(R?}OTGF+ zYr*wicfT08->U>}9eBzs0a*`nUE6y;?*@?D(rf{s7995~I-cF52s3vwt_A8x-N4xg&*)U{~6x*J^wYl|9iHh?gQVm9d#dsAM*2m0Uv@N!G8`P zh9AR!1|NZ+z<&ZCg`dK9lzt3;2LD_5IBZ9+e+ZxWp8pMe61JnzKY&kt&;JTO{XPFn z_ze7#pZN(~55I5a1LCQCgnd5E>2T<=>oVUP35HqaA}%4t`S_8rf1y* zu1Hf&sTo|ErX2esxHe5C`xdY!O(pwQaGkvxjIE2Sb*@x-|KJJGdpy ztqp@)?X6%OqYLgxlbLjayVF!0>H_zrDdu;B2h$Yjd%(l?YA}w`1-X-~3%m**OOpX# z1G$yV4u!9STuWw$!hIn3lG&l~4Uj9vZ0gt#a+BCWZ~)}mFq<#l1bfpYz=PnmG|dkV zfqiMp3~zz`X_^5W2Dv+I9sg|v3Sr$K`!)~;MF_eoOG$ZrgmIDH{wrANY^| zvFL{#_BFfA=7%3?>?8chKl}w*&lKkq^p_+(Q=HGxUonL>#rXpLC){C*^A-AQykUw{ zUY(HtpNWf8oC@e~2#Zsknb6;ALE zuY|tU@}4T_JKfzlADW?sJ_{iC^7MsJiK=FcpfdM{2`J{?FagE6VS+L>MA^v}AC`iY zoow-888|CJs=pkh)?~xj3UG0PRDUJ7#4QA^0;}!y&}8V~+5{!3YrqnHr>0Was-ffUR!9rWWi-ve?*w5@>e1-T>IR>1dxToP?7;QK*}1J-vBfD{L8s5=O9|MM_-2;_=qTh%@c zUbHtwQzQYY9@uKqQILv&tsWc$sR(p{$H5-APH+P3b?XEt!K;a?b)N#SC92ka8XQPe zwsHo%nW&7k9;BvloHsiQj=F_}b0F1&{k(b}ypt%sy8zyGYYGh@HHDr0KqE+b8Q zKwt%k_m3y{=ZxWSzUIITRY96W$q^4jeF)oALZ&?MlgRj#_ zI8&VtI{*JK?at%ss_%XOuMLE)22!)qGl4Oj`PF}%@zHQt1kv-%yp*{u<}EtrAG58zhFK;-+d6*3U1 zs%INyAaXn04jG7Sg*zYvkz3$S$Uvk<$96#mB2_o-hMD2$*dEA0q=q&2LIxt$CEEwH z*fk;*2ham%zi{TN-K%|=XMhHtWTEG+Cdo!GSWVIey=XN_ z4tmLIlCJ1wt4X?{R~UGT2HnxCELn*LJpYpSXXHv>=&_y?;uziv5~03uqLdUhCt>?)Oi^SnGrb(hr!|D zyu)xvEv3)v2)Hz2pVyIanet@``LHo!UD45Sc{nLB1~Q+aPUl$I63)MjgG^$KqjWsn z6|s0c0Wz(ia9aycMQi|IB4mc4kkUzztGO4P47r5A2J0Zzq~?~UKq{^#0>V_N#R8gT zoaWXnW4-$=JRNIwgJv0LxYZAu=~h2z7S`ei^?hc$U%_**)Cl+aq|X`=@xB`(fOObup?US?*Rvvcj#3 zWF^+Ms)}Tl`+j1^>fFfH#Eh$Tzldni#G~8o-iB+?9X9*87TrbTDH=4Rd-()MgLUYB zn{#YI4_IRLdh`$tr)aPNJwjtC8f-*AXPA#!O7u%wP0?U8dYVuZ4Yr_X>HU&Cjb5fx zofNd9H)2c!IuPk z&gK z4a}wH>Ho1Y+m4Vhp^=(2$Q){Wm=2jZy%AG9QjeKOn{+jlDD(DP}82`Ey z=zp>Xs1I+#zbpj$kJUgAH9rwPrM^Fi!}VG+bA1Dco4@2M6|~ofx5F|W8acFY)Dnp0 zI;_xPr4~bs=e%2LIlRVip2hDtF=C?t*>F}O#QSRb(gfu4|gUX9!5Lgsn*!#v15ue$!dAoIK$v&n~x!}-_(xFnp9Erf(q zwL5x4!l~LFMUWX?1=(V_H4L&PkQrSC**qzPix3Zw~g1t-)%<}9sRfwV?0qI3YHHF5zQ2xFPH_Oo8+yhEh5e(vuhrr$O%>)I(+w%P5@=_k`1oGvMB^&oC423#S=pL3$FZ z&t}5|-jjd_y(a+=c~1f!j3nK;XHYlLUxEYEE@>>5sWu7D-+HX^eUvQR{Cz$!Q} zoXK1bN5$Lg+XR_r9Ks1};F@^*GuOhs@wRxf8Foyt>tY>bR!%*@7C0iDf?5yj6Komv z2H22b>C_wH`ULAcZGwjrY%G2=Je|P0WtQO(0;$1bx(f_736E~K0iafN2UAyVgKa1! z7GuHUqx_HCdGttXL{W1`NPQ4?hMWv{g`5O;hnxuagsg>oA*++r(cBkOt(pBH$HD_4 z$H0Rj^#MB+auhra`E^FXBO%p4JsNTtJQi{&we@lSR4uSnOXY-HEtQj4Yc4fPd&;er z%4w`+m}*s=aVt0KtXm_n=iE=>^KOmCruGU~Z!W?e-3xJ=djU>&&&L_=dAJkSqR%-v z(>)t^###qD6KA<+;B2g=q4l_ndm7GhPsLr`Q*bw|8e}r=?w*8uV685##Xa2t{`54ExWUkyCo z#;%(F@KhTcxg7wRpwjO!5HkPtO)i8%y&~7JV(psCXsB@0c^=)$F0kBm9^Ga)l^u%i zurAgxbf?|waX3;!Tr?Pg?y-*5NOUjD!lJ<_^h4`TjYdC;y+qj<^ni7u#-g9Zo}p|U zdYGg}4X~i`bjK7}B3w zMClSZBFtQCfQ%5TkF*rlhL!pzvnXQc5>N+C-Wh*aB%26~nENHc@Zb3TYD+z-^E=k@|GoA#I{u zxC7EA>H&8`x|rSIF4!2cncUrQZN%!eJ+L`q_1a#zE@JiCK1gr#@BG+)xISX_+5xyB zV)@$#AsKOh;)FwRN5oQB4ns2H{y^ywxGQ4$phw~Eh^1#AgL@*D+j1Q4jo7vrCm`)I zh3At{Yo*`8r`&Jj)3_7m>V%$gs}p+Gt+dy3ZavR=tmW3~gr??)ZowUKXUdy#ntLry z$6A@K&Tj_J#;b5A_ez|J^C(w1?~JvGTOmBltq`8=o{PJ<70z?q3g=z1)_yCTcXKP8 zcgF>kE1dUmE1dVlg_J9V=ep}~9_~%KLU=FtM4XScqFf=oz&#!p;$q4b!h7Qqtgu~# zOR>Upv3nRU!DW;W!F_N)JP7x755%Roobvv-%w2=~VTC7!`Es|ydPwv~wnGtvFA z$IvYFW1HuhjUKd-iaF>ZyMOpx^wZe=oHq|WYGW4j(PP#!T!4OVdD08f3s#dXLN8iP zvKYNY5@%k~=R6~^PD!BX@p{ibNJ482CR8VwrJ+l)s=gXQQQCZSo~j@~5^ zDH^Oqzo#D>4OXF#Y%pUr`q&0Dn$RaUn6URQudxRqtn<3){8ll(%8Ax0Pw?byK=D}9T2!W=Hw?V47 zS#Ud~ic_m(2P_Ro9(KZ!;mF-CNDWra3A-Uxk*a|`kUB*@oxPCCLGgSaB+9GHvLCLD zSjXT1B#3`O=|RZg;79NfB<{Wo55r>-K0pL!$Vk3Ae@9_%*r7WHE8?iv+6Kq-BiHfC zyY4b71?EY4^nH6TPa?*^DLaMkuy^n@x{KZ}Go9!MWT`MXj(*5U)Fr_=^yAo9JC(%q z-Sd?FlokVXo&}NX94}5uRTz%YvS+{e^(Y|yipxsHsp=cv||^@8x?~&kT>co*cI|dT?xBE-l%WE?vS>~ zC9nsiE%G(k6Vet*gt?HmNCM1*v_;}zFUXr3zLP%TWFzgL^e--kI zAZ-TCs1!r0`Sq{_Qq8Y}eIVKH>N@s?WV`F_D}_|YifCnUW0*bO4{izvy2>G+1vQN- z;E-_EvJwsrXDzGXusF*&sD{jN9^l*>=wl82p^r5TfTO~>%zyIA}E5p3t5s(bv{gjS`)$uk2Gz!+lTUU29>>u`~$G`#c z_Ck$?bfGl_G!705H+C2g2Zx!(6JU=78%L>yY_^~V=|sq83&-Fjn3rI)x07M71bZFo zV17b49u5lT&x{^9>nw958(M&AMhXH1#V4YF2wrG--j2u@8vgGj7gHy2+4(k%F#k&GdO|;>gm9Re1nz^gsj6}>9Nu{2DkkYO~5~;oPX@jyJ;v(J)~gu8cAy!_+0rzd*ywOkKL)#T(pe z3~s~)obx*()TV;ScZpEn)t$AOyetTJKl&x!;?@M}R`=t$)vf%eZCD#6J%+ctHBYd^ z{V3k))||mEJdX4A4(-Mhu-=tD?jPg5xR!FgEBoA3Xg4Www$>w=wd@Y$dv#cbS-t?xf~ojuPF&09!Q3Libr6kd1z1bwC&Npw$66 z=wYh^x}ry^1CoMn=x4F(>lvdCc!KUceBYWgJaZvJz@}hw(VwhglZQUE>BL^> z&o&v8k3O;{P67JFnmC2%Gi&1XMxR>;x(NM+Jg7^8V)RAq`sMuR*B?trjkM*pETN2f zgG*r_$SSLgVPD7;LOWOrduw{}(x41d1zo>VPjH+kP`jfag;nADrE*BMbB59iNVRhc zRzju?6uzq9fQW^!YRC-25lU;|pooR9{%~-_!q)&eBwQ*s5DpEOiVcFaFxK*8gCU*W zCO8Dr!(9o7Lb|o8YlcDUr3N@0(t%aqdjzD{Ivh83n1W)XEtRX`@VoV<6qn zIye?Gt*Po^9Hix<(ZBJK>TC?00M|rp^tcw%p3yMgL`Y9mL&lRJ_1%ExUk8&RE32+A z=QRwsF{_lSbQrJ01RZL1n5e@f9VY8gr^7TI>UEf|!we3S*vm=JI#UI+beN;VTpi}= zFkgoSIxN&-kq!+yEY)F|4vji2*I|VYt2lhipLVqhnsivB!)6_}=&)6XRvotKuw928 zI_%V8mkzsi*rUT<9rVHL+}zH7TYZMEKfxi5*QbtOpEjI6Q&V7N*j<_m2Zw#6X^=*M z-sO5o-%Ic3bT~F#bTk7pU7!ZTOi15LZ{jS-%z@sn*^myG2GHifC2=do5sL=c8fPOGOCi$* zohV%fnJ!3&jgSHS&*5^&0RE?N1!MsKW4ID_jJFzk6--u7#QL)(UHegi5u-*1@cBEWZV2$J?c|9CD-N~88$V2^NJ(^l9soDFD&v|mPW!ZtWQTvN0iPKdXu{T*;dyroa=ge))mf^&C4 z))Z;nWjAC^k!plJ@Jzhz5VaR(C0HkAAMBpMd)zkIUl_T8n0{CDS4P8&FFAus^ zUmn60l&iix>{fkw1na6(9eLEP*3B`j3sLpuaraN~39M^Vb>2z$E%=mM_1|fCdwj-y zGd}B9y?74m@>Y#?-hDkz?H!hD$f2XV5~sN28%iRs^UyY*SBaQ_2W zy8n)=u!8SjaJ5?_A2sgJaDVrwc!2v8JP<2pe}o6Q|BMH_Kg2`af5JoEAK+nFq5ge5 z-2DeU!u=i|=~gRr6jrUEmgi{q+jxxocX+H@Lz3gLYK}MYc=vDc1os=b*8Mu3=za}P za=(fvyI;X|SQXJrc#2y&GE?0z;A!sXalQLFJl*{)p5cB5&%~jYFp38su~p^7Pxq<+ zj@P?y!yDXc({IFT5Gamqax0E)b}No;aVw5(b>E0vv9%-cHurb&cK3C7hx=N*(|rxz zh1LAH8t-;rh4;9>gZH|x#QU&XD&NBU-T#IUxW9=Hy1#)BVKr(l$A{gQ;Un&^3N z@iF%$__+IGe8T-Td=jgTl#EZglkjPGTYScS5kBj_5TA2jfX}<5IJGEjaw%SQbSqw^ zxjW)?w_;a@Td}K?Td^w>tGT9l)!F?woaO!kXS@H3ySNq8a@>k(U9nnxieuf}ieuf~ zALAZw#k8Jo#k5?khN9wFo?CIOm-~-6->sNd;8sj4#A;tE{`7V${uE&~ITdq?-HJIS zSgp{PaUZv0PG78ssp3qjTXCigtF5Zo($B5fQjXPpeHvG|6=y23TC|ESRc^(WYPVub zja#v$KUU*cv1Nc;v1K4udsy*gkX!L&Fjf;;ZI2;t#gm~}t!BlLVQ$5c;aCmnAL9{j z#gLI$ZEIccquh7k(OB(lUGHPuy57fPHNC%w$GLBz*)<+_ZevML6CkU2Pg7b8v)fpT z=tS5nT=Y5#=7)=3C&Pkp(Q6$n3>Uplfh^tCxYAU}(p|M$r$LtPs-<5KOT(3}(;_D&DM8!_@noU&fLa*CI z#cuQl!=$XmLcbwVj;u@c9s{3bU7|lQ?#Ws#^f5gX5-!mv^yx{sM4$4$M}tG?OS&4- z;4u29b@h&*)NroiD9j2w>BnGpI9Glgb_wUoPr#h8zkU*S4d=>FK?b|keLD>&L@bf& z3}jG2U9z)qW;k2OCl!kq#4 zhre$pcp_p69hopS+|r~o%#5={%q+<2fE)N6WEV$n;&X75HvEeQU3m0}Wxwa3M=dp@ zEBch2aw0R*(k|5q-LY14sTSygl|!jopeJ5}75Q_q(kd10^RQNgsny!ctqy2DJ|5-^ z6hMA$jbs$U(_xZ8Z+J!{8I1kI^I>K{G34*k1VsrXQpmcA z%U~Jo6=oFngZbe)rgF&8zQ%wnAYJ)pe#=T;Bu(iS;VP^t-9lWAHI18(Yp^bhY~0_i z{=)z~gz`*05Nkhj^%Dl+5m>L_V7KbjA$TO^|G-1tdNqe(jlb#@9PUl}bvdK<10f;Z#VrV;P(VnfmAp>mehuxo|pU%%TUJ0U4al zfioe=jM;D&WSmxm8nYp3i@Jj5KynKI0_VcBakfj|Jjf`5qW^rD8*i7*0?4K+8qHe> z*_~Q(ei3AUm1X>Ki;E-e(%9O%0x!XtxG!$NU2t!_6nDpYTsq5&BR4Z7aP#FBLK}H> zt0fjKN4MGf&=n}fg6T?hH^G!?S#&RZeME!R=zg+hNrXoa*u?M}^sptauSGwz3EyV) z3qHO~%c3V4GbIM2rx_=08>~mq#BP2+HL{=b4Lo`|7C{@)D>nVR3B77jbu)U+qUsj( zx<%Ek=nadit>`xvRkxuxiK=Ybh2DzYoWYfQ^Bks69&Y|xu!FL9V>f?6(ce=e#r$78 zDS3~PBQoRB`xbF`qYtQdiOlFj3om=oM;3+mp--6nATp!Rcq@p^=r5Klb`X8Ryd9Al z{hb9ML}v7*Ejm7eh|IHj_m0A}a3u8@%m{<@ahR!*)L#cDAj8c6avOwP{)(IPbog&? zi11(D38Aw2X?xcH{e}oPkJB@b*I|MVwK`1HVUiA$b*R%}iVk`uZ=TEHj_c?r-IN;9 zkl9Io)w+n~(w>6U5gMpG4HQYb93O4uqx~diQFS8?FP?=8=iHC=fcVS9*`R8T2AN*3D=6}xsY(J3FkbR9ftN^ zuuB-)^I=YyLS6u=$Q0!ZVYe{K_l5;=v@)nNU}2o)^F041$EjYB(4&cH0{cfeg)F2#3O6;mq+cNb2-{ zN{2&cj`bdofNTP#UuPto9PY4FB;H1=$H4XRmVh@Fw#Hjx#W=Vp+@Wba zWN-eCJlO=8lVC4YEo3%WFVsZH1nwp{308%h2~CEB66|AC2S*KfxLR^{_F)k^rZ}jR`i4I|J@W2&)Fj#zVS9X2BB);cakWY8ze$hGt+7E-_W9 zbKR;^=i#1|tAR4#t*+?;tk|IHb)j3;>msahq3U(9Th;3ltO%lNvB9lw&Ww<(=?nxf@512}6r-_dR_&PtAn}9{UVbYtKBJz%HQIfO%&*! zF3;gLZuL0Vy4B-s#xv08udQ+xbMe%-D;oi zbKi&eW8KH*2l#;d9(>S!H!tKNcS=8A$aQ@4Fa^5rjk>i*-0IdIb>EJU;bEMkZtZa| zmrr2bF6S0}(yb2IDLjJmoAGJ4hP2LL)gkJbopozy{u~}n`L+1G`x>0uC%pAe8SdyV z#c5cTPYF(U7vl`9`be#oPHr_{GqI{DHD5csd*LjsS}PZ4yL;j;SQS}!oa63>yJFRC zIk=m<3+|3p-KiPe!`&J8#Hs-`be`*0lQ<8nQcT0W+#PW~Rz0cfvB0hCu@I~3)b-fg z{W0yJqCS!Kw8q+B&dg0TDCSX^ZC--HZ1X-Sg+(0Epf9@Ha?DH7eYRw`4E@M5%lo0n z$Q{2VC`Uh!wO>h#xBa4vQzKefTS3`Vw)sOP`jsUGR-tFuEiM{VqvzQnE*jLJmu#NA zKYGntfdkN6mQ+3vy+f+i6~Q3%UhH4)*t3NHD1|2&%r`!?ZuSuLXUhj1iaxPM;V|^M zH42BLFRW2G0)1)K-bh5dD1qoW3ep%l4@W~fuNq<*1L>w7=k_yWAqjkTlb|2*t#LeN zl72574{1H^h7({>*mS6ceImAuY$7aEuQWNB1j~6E-Eineeqb_>`-juyb#OqK3^)Z2 z4x18F;jnPA*)&Kl*j#?B9*zl9vZllFVT*1CoESDRWAeHen3*l0pMz={)S9=kUS4FJuSqy0~ z(n?Zir2*0{?+TYfX5ZCWSq3*o=&U3MjgYoe`_nw*JifJ@$Mo3$23NqH5v#XW zLfTTF@dK;iArkTi@u9nvvsUw%UhzAy37!ly!q-4L$Zt}*7SgtQ9X3Nc$gjY4u%i|z zUmCPPdc|Me@k#xj^%T-_S_n5lT2AxfM%W|V7Go34jkA%g&5&MmJtu5|G_5p}wH5Xb z(}7!Iah$y;+h8BfdM5|lVQE~fgF3>$<_C80n1y?T;7-WGy#a6+>>pRH7)?FuF(xZ^pUHcaO z)Kq@zGroU}!dY?l)*gqX0sNKH6Oc53&*4cpH=K7r1?Oqr{nFqxoX>M9o2Y#q&-F)6 zJwxI0I6@SoM3D7^zlG=E$~b%1&qMOE-=H+Luhy$tTeKrw6K8$gG`Ke07$qIjJ=fcw z0qLG=ShEwPso6*`DHGC-?x3A{IyCCALI@)2kZ19I{XiB5cje_ zZM}YGx(@&S9pjeklodLx(n0r*YyY3zH12YL+8z4-|HBRB+W+r&jvMMv+nrB#`yM(J z>rkRYA07JYP^v?j4*hf}*P%j(N*(@_3w~?!ckE;PAJ@HII(7xy1zE@^yfYu`abX83 z3z8wCZeBKIk6VrQb%E@0tKLfvtPitay29yU_DeTN3W-LNy2F`a_Dc`QcDEZT?Fnax z*)O?}?QYeT&x3TaG}P1!vfZr`$MWI)aMY;)E(o(<3gN;q`=vKr6lT8^!NpUKcjBx0JtkmyBP=%#oOwuLGWeE&biA!9 z9s)_QQAIfvo{hJ`@L`bsd$TAV4%xr=92^1JzxNCr2}#B|1xLZ`Ff(~HWdGh{l#YR9 zCabkF7Sb10Yh@fHGkGT*580kqZ`K6JLg4kV7P7gn`s5QKo9n7iJ_)isST*5fI5NSS zBz3Sh!8*)SApO=lPM8Ymx9T;U24^JLJWV}ZkYL+8O@|8;EbVs&T%KS(>X~pwf~{Da z1=)yKEsEK&CBgP|ngd%CtiqWKwXCe<`f)B^j5 zTeq%<1H!FaH$b+#Rl8s#WKyjHZh}md6~WDri85XDTOga&=EJR!&1&`fwn8?m?FqNR zDQ)aCxgAbzW1q<#kbP@a`R{~t+t@(IF37I4dVP08*4BOo_ds@?{RHlX>^l1q+y~ip z_CvTIvg@p7a1KCroqZo3gzP%|9y|nBw+UC9z@|1<(I0_p+E_(@6ta9*&AVf8a~n%g zJ`P#4`#hy5;MO+m7euQ9wzgrzATpRCD|vqfPeYdPJ_gS~wwiquo`nb6knc-d0v>Eb z!Y>j_^nu3m|FmXt*pm9UcoOEi>TpaMH39WC8F{o*@&aCfX{J z&X65yZ=^H}rX||Gs@X6-(RO3*0&@~=z9t8D)w*GpnZRy|HmKJPc2Bgao9?hM(Rw#M zAluSj$hkdXzeF3<%Z25M7C`bKo60JH^n#U%7C`dh;Bd#+0!XUA#>)yJ`TZKy>kY>y zTC^{MlM^kN7en&<70gTEltc^WeITj+t0?UY=Oo%LMWt|VxM6M?Y)G^u-+pjuqP3sP zVN&Uqqy}ycmk{)at%+g$h1(Ksu4N$Ho@jF| zgW!%tn`;>i4{z7)XwfGB9C)%zKBjA}t8;KqX&nDV1+bGy6 zYN^$uVP-Upzp!)EQmeFK5avh2aYI-T zwb`1Z7z z-mFEiE^2{)F`N~(z`q2}j#}VvfODc&SuTaF_fSt|8JrijH>(lOkJ_8H9I^^Tb7U*v z!l-pSSHeY6OZ;607e{SObTwQOwQfrjY=~MdvIZ`VS}n2`E{j@}Yle+ci*oDW@~GWs zyald^+J^h<;mWA>W;Vc5Hz(W^W^gIbqUC2le@fW6DWGTs~VfIDV!#xAp09ccsXJOxq z?5{Wn2Wo3Z;xA+u-A`d^8Sn8$b_H~V>~^chNE$qJkyWATklk*tqcj8Nx3z_LonTE{ z8|2A^lfsQ}JHv)>GutfK($+rf*>G1|d$KO@bX$uhIWRlPB5haLJ1N$N|Dqc#N{Yq9 z?yxe+F8>~|Cdsb(p0GB_T35MnQj%SNF2F83i zshzb37r^><_6IG5bJ`I-+XjouA{`hB?r=GwG8!!A(QUTP#}ahAZ6nu!?zC+_mZE!X z8@XlZKAJ5_K_j|991PJ8ZOeK13rliZfu68+yDL#R5x)vO#o8sN^U<$kx>r>bdM0)O zT7#aAX*cDy=s5;tqd_xz!KUcfp%?9BZ8=uD7-*r1a3A!xzuW>d$&pDbv>*Ce~T8>-k;9YSl<6bjx zH}`bh-Cd7+;B?NZ!#&-Tajtt3&chj;Q;U1KC*XYdcwB%pIcE$mbdScp-J@_3?#wwO zaIu%mB{+-np}3EG2=411j7xDZ&e7afnOk#P{oH+VIo3`fn&+x;Yo4ppU4*N!cKOiU zR<&DmTQ%-H+#eTlj^?%oxO?D%Zq0KI!Wx21$AjIPpBjRzC{M*hy<8rKHCp)(Jly?v zJObBH{skWCz#4zmXLzPt zpW#_pqxG5)p6%A>c@EZKyFSBn-I@@d=hlSqe5}nE@5Bq-DR?2)0^Hm2BKK{0aX-38 z4Ax$Xm$)y%4Y-x^ui>R`#k6HuL&Hh9(cKm=#~LkGOk3f;0I$RvKyHIqxfAeeyo++h zv?jM=+8Vrva>cQ=ZpE=?yqEIRc%AzcZo&I0KaSVCkKqmOqj;nH2;PJbaQ-2@*?kai z!KWx!Oxx;i#jW@><%((B+=^-2u|~Q#;vMb{cqi82cMIO-UWa#Mjfbznd)!TUuX{D# zhf^6s*5_frTc3vm?x*oVoW?m%;zRBy@L{)-4vye-&UqXkb^jb6b1UiKIPSzbij61S z`dpoK>vMGqXL8O%__UYHXK-iAAHZkbKgQ?WKf>p6F6Z2VQ_Dk-#2s-S<->8Bdl*i~ zng>vP%Wx~cb;6n&7>G0718`@o*@9}E<*vfn?n>MRYcio6=eYafu5QK5Zdj8HeQ2RsOm-@?P)Z{iVn4ClO# zN4j6bquj6J(e799828I~EFR0xD)x?ZzktWPpT`sMRL=PYu665rndsK_G6_%P9L3?u zZpGm`tQjO-FH_vQUZ!GAD(M=T=Kcw;$C_u-H8S0;Yh;G|emoP;;+*^NEcd;5w)+Qo z4xYm~cj38i#rb(|#rgSoF6Z2i7q}JY7rJl7i|{he`7U1Uz78*OUyB=XBj?2MQuoz( z8P=@WcW|ToO1vCvqU>9Eh5O&|O02oFEAT4!<#@IGGTekUwRS09Dad={VL zoCWwC4wE&A|M(2$b0|-(2+vVn(-A90MAt}~Th~as`$3$6&vA~fmrib7FPUy#FP-su z&bbd~xplo{yLG*E!KoLA8;j<+$5P(aJqCBf9XV$d?(QCmd*C$6hvS~^VK^73Q$7Ue z`T0X}FPuTS>ZyFU>Ztzr?qb{zXH%{^tK6+RtHP~1tJ2Sxt8f?2SN&D(&c!u2hw>h{zguJlvg*N4V4QNUZ7aR6NT4PdwWFB_4w{JN_{q z>;4Fj!wX_k#F|!r4^MLc9#6)aX@3XTxmA}cfWzBV@=V&hG)26#WS&H?Nxuxa=(OUV@>3%{+i=f{WTYBZvUrvp8H`u zA1l8{*VF>HuBnAsDL=ZV7P)mzEyl_M`XOH8)-~0Dl^~$&XsP=iybMpITy;>R`%b(Z zD+A{?yuz)zW+hf`(D(2v_bqs}y8~{*$^^O@uW{dm*J9-ksvc=}e-p2Be*?GR#hjx$ zWxe|{yutl-ywR=tWs_U=%Vw;U!LQ*h?sj;qI~lj)2F_9avdw)F-j0`2uKHz%TlLFM zKS$n$wf%iO-tCUVd$4xI5Aa^M>Xdz0o8+Ix``xNv4q)w@e+nOTpTvjoD$0-J!|r4F zi2Eo$>OR8g-m!|vEtipIdpWsJ+@y?0x7wiF33Qtcx}8LK+W^}sbg!*^IgReO^)6@7 z!?sTFEP9m80q#tLenz%HQg9wU9=k<%7t-KiYGve>&n$_vBl?T2kW52g*nW=b=H;W@k589d3ry9g=r>k`sEsf#D8F zJt29Qhbhg4L&I&4@*q3&DS4t7Bn49wa`|v{nCe*o$A-H<7DBQyl|RrM)`n|GiXfZx zY4JlbBr&rImcaTj;j<59AxZ;TW_=;68E;v_pK?os4oh`drbD9+%XL_x!%iJ`>9AXe zJv!{wVV@5BbvVFb2f0Oh)`KcItiw?qj_IHm?3U9yoYCQ|4(D_@uR|)Y`7LQWr0bBO zLnj?FIg~g5+@7|x3bJ&_)}f0IU3Dnbp|=i2Iuz?rqJ!SbTdH+9slzD_dechz9a*jT zHCP78%S?v-U|P6Lr5v(`Q8U^VkZjE;tc0E7Y$B!#_6%>nUJXgi)LcXjB=2$`><>%A zHH-rw8yan)bRet>Z!a|nl6|SH*1?cn4K;T?1hVu|`G7+qyBapaVUS%7m%`z2Lbw&| z2v{3ua}guq#4tH@6lC#=l0HVm8R6a0#=r&PEu+Rlwmlri3F9DHjmjMw56Nn*gcBe+ ziN&xMl9Qg2|92gPO3egRGCqgi|2f9A&_%a8Gy}f@zS2gsGI) zLlzQ#38%yT;cW1(3~;)^P4Z$bLn7B^N=KA})c8VR5{@l1m^fcV<%B0Qmm6-$}rmiN$eR2H$qmxm%>euweE#* zGbAlX&$|Uq(@l`6n4m&{D!W#p!$S?*uqZ1+>Ri~C8OgB6;8iMzUgfxEdM$KBmO$33v3 z_+z-I``>XcR$$klM4nrX!(LcH{vn+2R^zY$EAFd7Sm;)Ru(w;CtRlA>hsF2^=iiG< zyj<>sRdw8r`?~MKrEWD2%iJ2E=!aFy+>XoLYBW~3)o84Ae;-$2RY+bq~@;qHIKBe1GKb*4tT z3-BncS}_lgcIVW`2f$QCW$J4Q@=`ZjM_h0c$teX2XJj?wlp6&hw&%vtL ze~;(7-^KH=>iW0weE0A00<7x)ExgeECSHWqB6tHYcE667U^Nn6#SQLP@KUUHgRZq@ zZe44QSWO9CU(4N35K33zabbSfN;o0Wa*9?#Hl$T0x*ASQv`VxI&PcR8p*3(;nDw<5 z&JMG_njr~m%0gKO7bIFnPzxk?O^a04Lvq*t3OB&UL`#9(2v;Q9wt<`A%5Y2D&2V+1 zWdv=3B)9#6AKMDoCfeN%S|Rsbf1A>6uqDxw9k;{vi7_QR?to;!DLH5-B)RPcxC@fp z_8i;|Np5=v?tyy}*`t*(57ppOXx!&skN3M<@B#Nad=RT`wiX|9ufd1iP56j=H9lGu zX;&7nRV;*gT#28+$8mrBGkgLM#tK&_@o@YAK7~i)`|xQz9xJq*!IQAU##uZSD?FUT zGq6I!c{~SSgHx;7@E-TU9q|&Z%Qp=-VqK=`coo*=n1P$I+DDx*>D$`$B(pk_oI++9 zJIkUwNi1s{WTCra$#a$v}<< zUD0DC$VP*1=x2O5*k=~~+_s|afgUGsj2mL2Uyx754KdL#`HVz^JoJQZQQiwZNn?f^ zVxp&Lb8tgU^ea9p(V!4L%_k)q^hUqtgAxsj&@pW! zvDJSy=uKPw*B`ybt)HX80Q6g12RIP@&TbAc2)%790tcga?B<+9(7V>H9EyH#*(t-& zdzPIt9R0yMm?O~pmZvfj{gGQna|aysfn}_WMt_QRpll5KkldAMFc$rpj9c!2gFYhR zHX4jaACoc0&2P}>F>OmmFV#(p5<1ZKO66$Ty^yv zyc4T_p6k{?&OEGS5Y^T5v64PiKQF-gl-_|Cx>Y|f!usIeiWlR3SOYmruo69V(KX-$ z_-4EmAH+A}Wmt(Gs*@YB5;{~TFULya(1p1IAH`SWmG~G|J-iAZ$KS@Q@d>QDw+Wxb z8u(d*PvOh)T6`L7u%{WH!I$85_$*fMv86habeHB|qrrN3zkNzJpdZ<%WFz{qeM&Z= z2kcX_89iv9k}c>b_9@wl9L23(#e!sJ>lQiF z&>I#x)6s7%a%P}6t&;6j6KQ*+s-d<)W=-UK44ZxLa<))u8+7K;w|MkzI&wDzSvm1 zh}2Q|sb*0al7jyTZ_m>cX7Hzv;WM6#yWv4N4;SEa+zV@)1XXnTco6P_3-EOOXIzMt zFsJy`8?VLB;UcV9qJBj&*0p#KF2No7gNEQfxH~SzeX$aQ)b=gKy8Ta2T!u@q+PnR5 zAFK+t9BaRNwFN8iT&%cQi5u{zZ+-x(Rt2PKJCsPr|y8C*YKt$Zh-|DxDhg1jC}!LWbc%Z~SJy zUr!`B{>+eJj8Vnb$^|j2CUVE+)E!sYaM5fYT^H`k zGY8(B8d=%=-C%A_r3|(ux z3N)hYVt4Sf%h7ikkZv2SK-b6gpFPQ6zmiA%-}9Pd!K#q|)nB1@{%TI)2WP{kkh9<# z*k0*|$-&yN)PCjr_zRkAA}PEuvv~m~@LR0o;pO(5wV*5b&60xk=o_(=E`0uVJLC;K z{HAS$uo3;6ZHKi9eTya8+_M>dn;~@W*^I7apE~ZeiN0f7WVNEJ?A}S+(ADf26b-hc zm^Ey6plfWegq`SG))plNyU=y9lvVtGSv=g$!|%pYl;E1q!#zB_K9-^;%a=UWULM{+ zl5bM558W6`Q9I>xzOkQ&H(93d0dzB)ZzTl>QTtfRW={ElhlhCBA(k?ghdp_Cn1|ns zrOe}@{-Yy2{C+G&NsME8zN0+6)he1}=r*fpj-%VHqB()?u!`m+O0kOO6uOg&CMh_L z?uw;s=b4}3;Tay@9ZOM5=n0{u@tp^rtmCjJiMQ3axCe0AnqDXKZ_4fyKUwKv}0ZhMpM4Yjw- ze%0#cM}i!lj7G!n_|ZS}^(9|9dY)n(^y1ljXfL>~)O<_OjpAowDX+w(yc(DCUP4M*BrYXAl8}4B~4zU!(b& z6p5=P`1ItvFT_$NQgR{^_s!;qgIr2p4nL>ipQlUXKYfMt3H#6f84uZpgz6+=ArJfUa1;-hMG|K7bmcr`)+=QKPgfTqas1+-!i#FdqE_Db zN{ZNbBPEr$$G?8vd{az|tYxzwEP|nU3DN}grDRJ?7`qj-p4F*!o))XnT zDPF=?17Az|+Q8RFzBci-g|DrAweq#yzjpAizIMjZg=0F2r-38*1qMNOt)P*Z5H=Kf y+HX@n*vs|lw6-Jv)i)>~;^ll|tvRXx{_DKnLn&uwCS`wIh2}iOeT)_!`zs_#d`P?mT_=jlZ3R)_@kY{%s#QB|>|OA6@oZ zlr2UmA9dE2hIkgCrNs^kiAzgk&lw?6Y+Oj~{L*dDWlOt|JcHK+uPH)Cu_&R1_T*S; z$*~rpb;S=!Um{dpY^YjCv0v4;6lbW~&8k)@y%?eS%GwBJ7hBTC2rVoYs#cI{T~M5q zx`6DL9lCmyF*)8dPMam>>5LMABh+9VK6Bj3HuHS=h}~eExkc!BMTvjZ2z~!gW=4}_ zFjiQn>K_X=WEX?swd6L8Rz>O_v$-t)0?Nh;`;=HwaN_WBcMoU0hox8g9EDF&VuXSX z^yBoK-AlunBqQ@ZiKAjv$g!<#FqAhfPkZ;D+96|gJdRF0`R&o;PSlR3LTWgA#*uwQ zlrRFu$|$zE`ogP#S0M)dvJEVK$epu7N()Y8V}ypv{%IJY=Y&Y%cQw~I1A*hh~PH7sZdHW;P$slmqt z*M`V0wof}X;aU@a&um@Xu&jYm9Di|i9paRQbCEpaKX;6BCQdFfLT0fqElOt|lSeXU z?JG(%PMF9BWgd#yfumF3D?B=N zvMf1e1#X?P3inP~Wv#CZ>)F@OjwdHYAc^cJC(W{^-FNQ(si^tm=3G(y@JpX4FE~+H zOFnWuG9?N_Q%2xBQ<;Soz~rPa;BUZ4?|-OX&&QMBnT{wE5zRqFS=l`Fp_K4T>jSGsdaH^(g<*^2=R2Sj_oXpoD`fwI1JH7xC(P*h-*-j#ch=h zjUhG@MrE~&P>Bwf__DE?l`7f0i$Ef&hm9<5stjo0kg!EoyFLKubE-JY;_fgP8u%s@ z;*i9wgm6Gl7{YN*hcqxmJ3-sEqb`fvk1Mbw8Vx*#RB>AcWYcB>pIYb0SH5g&BNX9a zY;CNpmHN#%%i<=J< z92hY{cbPRw&hR@3v^7L0&a${;@j-)_2_M5D$0Chz(sp#?tfh8B0*56IBu$_!+K$3b z9N;5N;7H>$a*PXudA1eI_AL(P7+r8`t`b(TF|R7?eOV?VwG5*%Pl$|S(U^BdmJs$r zRIDJIh47WYc5PM`s+p{2WvxZkKOb)9WT0PGmSYzvMPm`vS@Y3bh`A{eTZnmihO|R9 zI8Xbw*MMmL<_j#K;?DX@?` zq#HK@q)A*sKxuVAp3M&f*kE?q(%PzpkiiQsPuQCPTsFp9-yVS9$h?P;X+8+pj>Ejx z>1A^<9Km57_nRky2iUkJOH$rrtXx{L%=ZjchWRXj-OWy~LsQJ5L&Mw@_yte|{+p6g zX5!LB~F0abPZo7&sqiBfwjr8Q6fc71)MzMqmPGJMc-IeSrsX&I}yG z*{{0WwSi|Kioo+Y8^W#yyvpkPeg6x{G=1*?GBUER0nF{esR@^c?>uu}sV`^-EeOAZ z(wA+D;Q3m}F*Ab8wUBH2gJCV?nRA1yw2*IR2iIs}fteq?N(&3kf?%~47MVrC1_%tx zS73(3{NJNyPvW!?YGa*m4j?nbVjyzz@Y29+)j&43UW-QaQRDNtuNpa2e-`s%KKf0_ zIm;pbNQ&2E!H8To58*Jj?qshUj2y0zS7~v>*I|+KC5Rd5Y2HwaTF&or@~1>B8k8gs zW9uF4f1@F-0*FI$+$cFJ7$!U2$X1ch)Acxvt)F72FBww9ld<(*sQIQ_bCQ~e4LQI% zY4a;;&Kg{FMh>UxQO0}r5sqj94w(#N>q|7V4Cc;|>H>Dy`WDr5ob<@?_egavISv{* zck0*=%GkM9Wb6m!$liu1$A9oKW~Urn^Efiu>UO@EbU~MMJ~@r8l~m_B&RwB4QC;9z zFNC4Ipp30is+Sm!`Jyg3lT*3G;9M5u&~dTx1Oh3z&{e-=x_;ix=(Cb?m9!I*JSjsN zBYB-B|B5EBbCEZ?$W>jEJ9UQ)cTVhb5J;zls1xz;CSa^#XiG z*0-UtkK^iT(pVXs8z$JwVCeU?o3S?cO@zN=5jFR~)& zv!o9vdjzN7p|^k0;<^5uqUTV(1uFkS0Xa9t=FgjE^XE^q`4{*>@(2?426~#CvpB@8 zTFCY@s4c;Gj4OSM05;Nu!t0rZS13zTo}G(_Re9aGuuiqhYXx;Kc$OXqoSOvdT#GE) zj#m;(Ql9znm@c&=+eb%+W5bE6P<4Ath+=#wHWpePUb#BdIWjU-6^f2+?;VN`4}@;G zystmjb45kPRuK-Dca6u!%KKtFf(J`?jKAcz+Nr*_Ky1l*nx=2Uk z_4Sd?>)Prg5s?@ii$(h)QN)%IBjcS?Z0v(|d^nzn^@&Igf)ya`kBy0%mc~eRZS6)` zS$|!7tElN{i*&R#MjBhXQuR$;Evb5adwZ(hxg}EDwy`r(Ta!|?&s4!`cI}4hjSaIA z%&K=-W^F=9t?lk0s%u)?5tS#j+L{Olvc9dcHPY6&DbilwQQtW&Qb?tFd~gKmW1d&8 zM(X;9MxqJP(pp#FK5c_WX>nO4ELxfVcG23=R$pJ&F50@dbhYRCLei|pM#Q9C-6sErN{ z^+bC=q&cg5dxsi_XQx+4+oah#C#+GsqnDR!fq4hCb1y6w^SSntkMEN%n# zK|90IYWnl`BR%!An72j8#$ya!_m>J9YsLClqHDA-nus-w#XhVq6A@*P39(DuB&s*G zcSOj5X&GQYsUQOsiP-j0(Hk9#%cjUkfB$$a6)G|qhmD$(gy?eyStqYuG>pXt1RO`j zP;6L?MQ@Bu2xp;Sw&XgYZkKGiNuH%Q@ekfQsyE>76OBcC;&>B9wYD-`aiy?(u`**5 zE4Hr^zImA~c%3r?z98Sn&3to#SY#9!=i$k-*eEiV8q16lW4XcK61<}rnW$vrUdsC# zf8JQa*d3fZPyR%NN*3O0Yl8WA8y_|Aux`)TXV(M^^!<|tya(3=v)O*TwJ#%eZ)ICj zx832i>H9L<_@Yx2^xtjlGgJ3#>S-hOA3e9;eIMq%-ObB;_iX(cv(~%g=QCgf%6K+-o*NWf;(dKXu^Xdf zvGMZG!T4BT1Xo64S2?bNSbJw{M|sD{j%Vm`ft0pEQxT8iKZF%ExuiHivl{}Rxt(V@t|XnX{EyeTMs#T641P~eAmbZ~4OHLP<*JBXi4cyTq=n}l`5Fzn1g zv(I{F&wbW+jj(Ufcg*_1p0K^hXB{(|>;=9iJ9DqSAZ%xbZOd0_XZP7wMf0J!ow?7q z*Vp2^589T2LI1K}{^pA)hd%fvobUgj9k`TsKI`^9du_vKy<^;G`Y@-{o_{S2J3r8D z&w~fccif&QiS5k658A?KeeRZiJKtyhQS_s+-}kC*SabUAOlwz@Y`z=KV0}&Wn`Rp8 z>tMA413qj2Elt*6M3b*sGv10WOMKQ|qhGqr_Z=d$o#&wMe%RT;L$~y#T{-R9PZN9y>?JKtz9s=BFXEI?3rP8+7Yn|a6^hEUybj=Tx!{L3f9q_ase%IE& zp*1&3W4Jr2mR zf+;*v{SOv%YupUVE8!!fdiH*=uJvVOCmv))O~-Gx?NqWL@TXxNU>< zFdrW5CHw92a{9Z8Qu#(Zx4Cg6+YM0N11f*o@|l#Q+~~6oC@;7Uz2#n9!@6XMSI!pU z68@N0h}FUec_JlOi8HXrPX|@jin(ZCr$w217n!jb@ z7;c(;i0~O@;-kcHn!HHZxR&tg-|7dz3PGM|a2ST5dH?MW$Ti4#g5k}~oKnT4M_ z3{fliafXFph&r)B#Y0X*RExLSh{A4$sF8Jjveaj~X_;>))5Q|_s^=;e;&m6x`RI~T zSz=MD&WeTg;4YT@sy(f-#Ik7tH4Ec+7fY16MYM-KGC#jh7YpmvT`W=M7SW&YaMQ&? ze%!^Hk)K+3Gy2zg+HoBD75>1}=jUKtpBe#oRLBqM@`%~C;K-uYEDSobGzGLQ^mMBo`lkZEp=4!!@ zFSJiexk~LL=>AJ(8=7Px=MlBusG!WR2f9#R%!Q{43+?$;svLVR%wGkt6d1r}&85_z4;}Tu8tSpUIip1GlmzOW z>pFnWJ(Pi?3U4CTJ9#DUgItbD-Vdw*euC|dLVTKf1o1iQf%j97W%U5{xV#>u9{4S# zKT3rElL~*N@D~bCD|~^7_|7Q#Ert9<&;CJ$1qzoEVZWT%fblCtH&GUHo&n`coOM_M z~_(P`Jx@KhyXse_bWSqC@Y44%Jir7ywcf^S2+7=KA6b=e^ucN3b_t(+Y_r4UQa}x?jj=oA1mYokMd;-uOlLkTNQqt2>;BZ zdASp>iR~tikBCc4m{&U2Ipt-PR||nDknNWdvG|ZeDRXLRca6fW3gg6;LX0W-CWUtp zD}*?xR`P(7KcwUviOYoeh(ftu;Qubl;5kTye6N!4 zSMoQA7vS%x6h5l-PY`jvpH%p?(w`#YI{&%CUn~9ZiCE7sD12Gz-z38SJ4&8oLB?X7 zr!bF*xI)BIAxadMDg6~hTo3P4SgrJpMCM1yTa?_bV!qp0E6mC)&SC~+^PvHTD{JqBUd`sa|3V)~&w*`59Aq~Go)~ohT0r_?lk%tcx zL)gtE7UQEc?Xs{q7{%u6WJwZggzab*d*NBKuZZRXS zi!vZ1o&!Y0@f#xi%U!6t*idwr2#>{v!ub9ej!ne-Cc^k)o(QY&`g&hOn#|hJ7wg$E z5Q+BmjKy}o8x!{w(zZ5cP|j{KdtBVIcz3p$77Sm6d&bAZY5RU*e39Lby~_6r-o5`a zYwR-&&K>#;Q+H|^`3!^Ex#U*Zj9{de->SJc**O*+9^Z}~GrhmrFccjaCx5!816w=p8KB0I#uH;sCe_xc3}N;V(|4fW#c+D>YQ}&(O->B);ryL`}a>;Z%M(#~kwh%KepAV!+S=9ysXl8;r05%_Gb+H zDDJg16dz8L`^Tc&m11W6X((<`{P#?)}O^ ztG^VGs16Ri0K}#;QE6tYlT5 zR<2~#IaRP)fyc|=TfTz#Aw05DkeNkKK?;r679Osj)i}A<&G}|KEAV&FAE3l$p14`K#__sf%h5eX~UxVp7rpJ zy5gIs?AVXLH^7&QZ#Vd^hpda{`z!3+@lCkmn-62!k&nM`-0|_dCiS#o(R}>FEjQoO zuK0449sBWjl{>!E;L9hGDw^-Ghwl{l3Sh(hanC@@U_})H8e0?6iGp_g+x%jU3#Fq`3d7ur8j_*njpZ@~Kj^pKLEFB+zce(S&@7{GJ zQbqF>J9epc#ox*Fi%+DoXuBn_bI)70%Wn}ZwO@QfO7qL{XFF7Be0YUU<129S;WKoK zkL$<1t`aIf+OX*OcpbRo3%U40%8uju84h<|c7u=WMHkKYEEI0OQt;_@g(*zM_cher z@!g~1qYaDZ`!ecozIEVZJe;=@Wk-3`GjI2TuLpWvG~bYCJ~n_4KZ_(Ee%_?w>+sAk z8|a5NESj&?!n-^GWYSE=}V9KO{0D^T&#hDFEs z0T15+7ax9}rTA_~-5p;D1cfA0Mf2SX*&W|!!Kde!Ym;^y?{zr9mx}KyG*C|)7R}d% zx|{E?D?UEQHD5Kz-0|_d&20JO_ewY4Q5PStG0nHo;Y-EWi3Y|;8y4EJy~q>AR-?D4x_`CaR=<9A-S-@my0z8|)F9JQ*yrTX*x8Rt^0W)KZ=1h(*WCQY7nE8J{wbF)7@M2F00?vQ+js8Y zF?+$@eLLpn_d)q{4}R>|%c%U!11D!ojy&Uxr`JPD-n(zt zaPcBCF4?vd5TAL;Kgle7@W4~DC8xTHc%t3yyXP-*jk@wcC0jE3e@?QyuzkCm?3zai zvtyRl80(KaP|cQXbgU^i+V%ERE3=o)ZJ&iVtV8Gp7Q|Cc_FSB+4~%C^&U_>|LmRHR z!bLjyz)-g2aXBQN`gW9ccl)jpSEX=ZUAE*&X_Z}j=k|74ymPx*`X=+Y9$23(dGaE9 z+jsBUGq-bg!ByOPU^rXyghdp$E$s4(>>m#lvL%mCYVF#yzYCqqHn=Ih^}uAdFyK+H+x_DKec~ZcTM}h zAgpsqON=js8E8q}S+CB0Icx=oh;;Fux!rDd{_em;w&bis@r`d0aRQUtkIDg8vZ`N)ZTxfmMwYO|J~ac?cBEa5;t=r2kP09 zr$0iVAbY<$FqJJCd!$$k+jd>Ff8Oip4?MyGoGW@T6OYjCfC+Ng{|F7*bGg@t{`?Ud z1em~}_dh~|_U`do%I_Z`j0`%=pz`n|%okvSe0|~(b^-ghEig_p7QI5nNlq}fcMk+! z_Ojppvxt-afN1ToRJ67|d)0?uBtxCY9y~g0GRDgWy4~%2cJANHKiR5-M}eGyyt<2F zhhbXxlI$%9Pf*k&yIn?fll8Ig=4z{5pPtHg9z0GV9p3HMr#kCLx}Ecy)owRC^Wa*g zwnA~T_Z>V@k&e>BDmGC%Zx9h7Le(+MNo3x|M2qvYnml8b=RIwX?B< zhiAtN_~r1_Xm?+BBg~bQ6`&N>gEa4vhKnHW@ksF4zU)#<+OM#lh!iE(N|FTF?|hm- zd(fu|xL+SUM(GYh6~pzmy~4f|4<4)NYYbfg|0Kc?=s$}vL=r!=44P-txEVf_b{}pT zB9Xl@j!0#Hj3biSgPJPQ2AIl4DkHD(Gf1*XVoRPb5;!kU7w{cR7shJ*BZAzS1il+# zh!nmTVTdID8%fAYIEY3y_q^HN7j^gSTgYy)<%XPrf@<(W)NPsDRWwHu`#r&3+pd7% zYkWaTJQjko`L0C89ql&iQ`wAdEug_iBtFg~!h90{%p<~d5>E{wOIx$HCrC&TPxFX` z1kq22kRU$BO0uECOb{Qo&5=X}`X!&LP`~0+73{y*rVD`XWECBVbis2)FTh5<)^L;~ zo*7{&cZ@|?$|+BeCxvY6jwq?ToE>4Q48^QaxjNHo(Jv-jNbC56k5Z+5gk`D3ei-Aa z)P5Y}spS3#l~~rGHB7B$eE4ZU%Va1Qz9!F69(-+{qa66kXfnvtr}8Q)N3Y6rRDL1` zsNB55>Ie_1>>!=lz^ytzV2wmrDy8)imP)E%>m(f4?6gGdxi(Kl3V$mGU)IL~nk9rm zewrtYMj;?>%2Ofx4j)1YgM5x91GQ4G)da@&2pQ7btb5w^@ouRz-Kdv^!mc<6I+xo1 zpj|(|D%$Ruwn1+xPn2ZV56cmu{U@uvh4qU)%=(Z9xe*MkvKlUj*l4$${T}0^q^tl1 zb)uYo(IcUV%GsAZ5{jmreZi9GY+~JHQzS`%E%-Enw$G;txZRcpRrs*cL z%FJZ7Tb(M6O;#(}cB@Zry@>MlCC>IG+Rb_>vDTMhUIL6G51yi|Jf5k{lv*fSKbcSa zBIC{abSUyAU!=OVlQZSBzA2SPDFk`4FVQOJGW@uMrz&F~MPqA|rS?RK@=712xdnCF z&(G3>rzw;Zh*F+zb*gBvzR;<*4otMG-OZ)RnQHcjgC{A?qe*Oc;H{Y^t4MWvrh|~x zM7I;|y3%>j5+@DuH!e}5KWNb>Bk1ov_-K{*G4OA-HAUMer^}mELN{2<&6SEG{>j$R zP937CETvnSYove~NEs-5zLs*%}d>;3vvyVIH}cQA|S zmP_RcU2C(eYJ?j$!{MW<^x;ZFwiuTa{7_^qhQoO*YxvMl$!kJnUpA z-VDllTN{n2$6lKUohnU5i=mzeotkdNEPY|V7@FmBsTGC&cpkPHuLpmZxAk0(T@hbB zB@fz~8jnf7G$PrFy6SK8lI>D7_17N!GgY%r)-|gg&HLR4pP~dGZv-0{8&badOuo9b zE3Hzry8JTlt#(3m!@)mSW<1uI(L^NK+8Xm%C1OOX(R@4Nvv`SJm6uGkgBRyBCZdl> zH8>-0>P(xFN<{WR9(K!?O0>=t?1Cl6-*;DJsp;;n9)N zZgb*1k<)6sjS!VI3=lAXHh~z0YcrFRm6_%w z!nnfFP$N6aXCu(4x$Hl;ad%F;kyU-Jr`*V%5YTjg2ANsz6UfaM`VP%0@m4<6r&KZ#SzJ?cIJ-%CRb` zinX6z5WDqqtDM!W{o!1QVg5w6#=12Ws8nm&=d8axc6PO`NNS3e{Y01`*2fizo7<2y zi`}|&thDM_3dda9grzRH*n`(=&SJ)g;P?sA?6+)KH0XfZnxYRL2KWf{nYhqqd9}Q0s4TcPWB>O0lM9(%~)IDtf4zr z@3gaP?F_5i-8?(LWA{S0edXTH-1bY$IA$?-arSE$w&uXT0>yliSam;oYWI9&+ulpJ zUAS|$j>X}6>)iS5J*XyZ2#Wcw*5PmW*;&x z8Ea?uLd9XNLw%5}f%fL|ww*g=S}ReFCHct8?1lR;ZtR|)+lQP8L)uoSi43+kOY$Gl z9Z8)*m0?N05Wbc4Rbs3W7+l+z#Ffp>6)AX*HM3J{G}%D$w-8@zvxdN-yJZt5mV)tS ztRhLA)pEissGqawY(au{ftBP8d`MEi;8P2d`gxyPl+-(X>ae8V?o&r3^>dB`8>K?G zy>DT5+b)&pAqY@Nvosc_~_Th^F* z7P=UO1^r}OPJ-UrsJS+~b9Ar!~$|g8Btz&lha6LPS@e(`_vVT@}Z%9#Iv;F&T!OgOD#8`LU3$a5c0M30 z>0JR?<&m4C(!9f2IE8fxEu`Vxtxz1c)Y49z7m}R&(Q8W15!0RVZmsP!S)(3RptIqS+@y%U8;|dR{Rap;741Z*4mg^iWQR;m?<-r6vb_c4d1c;beX0WZjBOe~UEk#@i%9NXiwuUc_6RR4MZd@K zI~C1TMelbinyFmxcPg5xa^rU@nyE7N7~5|!7#EheZI(#0{rF9`fY5OiO^5Pmt03s6 zL-G5KVz;$b<%avZvYM?C8m2?}nXSsI{t1&NqkdCGaB`HXI>tvwnW{KWvZ;w?rgY|P zKGCj+O}j3I^p#gMw>T(Uhrh|%r!?d(s zl%e|(*mxo?b$*=t=C5)s8$vcK~4M-OpMRG-8IXChnahQrb*ajF@tKB35@ z;24!usfESv4cHjVPIALvsK7eGYG5PieQu$VSF2){g|e-*o7wpX*QmVqsA?w5p{_c4ry}8+;OGYZ?YJ0_KZouhL&QaHK5Fmb+C6 z6P^y*Vh0mMx2fn#G*)W0>X;-x(eqSmdYo%;D4CNcBPer&r1 zQOwwWnXEVJ9h@}cRFn!hsk9lBa4f%exapT|adYi*u)_;0$7V3qA9AbM)O0gD)+KDI z)w4(Ygep#gIJL5kdEYTEq23_T?2t4h~U^<@}%q+70CdicKGd!{dG_cq9fSq+=X;A~Pe}|q@ z`sMni#|n!YxP#-F^Ep?K=1}iyW6m3uIYtjnTw}g5h51>x^o4g?^+u_^DZ9uN^qW;d zHy7r(9F*;IRfJcR%K5NQdgiT5SL{*JqXy@#0nUQko6pX3nF$9Fxn4B4@LW__vwqy| z?wH#fuo-!K6@9GKu3`Z!yWFJrPLP8K~F52iBfnSMmwWME3De*(Ga8!A6U9dcvNU~4B7{BXxBhRqT$4{FrwMU zCcsjRo6>+=m!c8FfQ$C*-M)ZR7LK?`T!{b9bbudP+Ak&VF$f>>5FYY+Gwkb(X76`N z=L*sXz2164(6+f^GlKM9S8PVAZuV$Wwd<<35f_hUuXIW03eu}x&Gv+#J<}DN5u{hR zVlz^8okx?ZXS=jE?8QL)JeNj$L3;sej){ZXG#JDoSCE+n?Fv^=7{tR}L1r1WEv}%*Gl+d2k(mZ@&>Nac?XB1#a0a<^Nx8#yDsl|c z6|T?>DW7$PkXw*;c_g8CnX8BKI!um~AUTr!Hbo0@eEKOE0_jRkQpl!uwpc|t!X4;i(udfTz*6dNf*d)YW z;ERF8L(hJ)Z6td}kSu6h5w|*#WV1mSQLOcycleC8aYH6UT`GQ`8l0^?BJl{E(3QOwblLIz|7zIJ>AIWTwm2e;D|MP0&QD$*8chV zZM$Z7oGohK=t%+bT=eCqh#2w@=*t&oab@|k*&Rdhj!N0H11k36fIF3=Qg$YwZWgj<=BSh%3#jJ`*=Odc zlpV)-EXR%kk+<=x5MG)mQ+n0^p~Tmy61%>yua02)OjESi_qkQzbWgeedF zygd7;Ee{6!vOI1Bl(czJ5CJcYenW&#tKaqrtiDlNT{KqT=vn<(I8#>08~aw)%k^%( z(=A|!R#)d6`&gZ?k7^gtJ?Tn!W8V@^XY*i1OvoIebF+VUe{Rn1a(|Yyd)%MrV~gL> zox&jv{1kQmZS?Vn3>QBy$9)%5=Q$gaK7Ns{ErKZP{6LOM|8i46md9!#E9-ogqf*vc zo)NOL&L0=Z;&3ozPY$TE&O0~C1j1$^yE>4Sb)M5b*Rpek>{`3XClFNm6-6cbNs38} zei`85ye(R6e~wDoLED5xDyn6DIZvkazsHj;hy;F`Vp8*0w${tssMc^vgiiV0|A*GF zR#oyl`ugWFMcRxb^$w}s_M{*++!n?wH^(f>$@`(pW3|YZfAn`R-wkks~-QhmM`}`#@h>Z(>bN z3BK-VM{pemT3s)Y?RKZ$%HC@`8gc4G?5}*<&ejEyl03;?uLyVVOtb0my>W-@N_uZ! zf4MnR=Y0!p%)KasGRC9#x|GdWrNt(MqgJZ7FpIsInH6!%y?uS0*8bWhltJjz?iirN zL=z*HgVLU0QZsH+ z1q^D|T8R3bJXAo)TtcbR%9as?MY+yphI{a-|1=xITYapk*Lj6o zAY9i|f*5bM8zsbG3>YM}c#3#*|>McT)89yC?A|N(vkXQATAja#H5?C4+hFsrM zf*5a2Np!Rwujwg4jKF6$FCA^i8a*aL4&NP=Zg)wjIDM5_CkC;naN;qx0S%UDC zl5Akdd*&(;qCDI7>J(x3+wF`^PUBuAeR5fvP3;%@Olb;9qS!54yT;YSX_)~>tfkwl@W%C%r$$95M_&Bq!^34 z*z260VjB<`-|Zzpgdau(CacwE1%Cv>L%jruu*5f0*gymv65opXAB*Yi-XcV)24ezq z(%B@ouLZ<-4?gv$d@~V*bjNBFHFWvoa>zKUmjDq?$O}~Jo4Z3ec_uyaU%do~@I619 zv_YK)Fc@d{79q-*-)9LF#KP$48>U$Qu!szC`hu|<)=W)Lu~X|zv?{oAEByNEMWu*! zt=~XI0Ea^t<6@6QL*2HR5RpC_6T-bU59uR|2@&a2F`-5kAtAPVv`wE~Oo&K#`aY1k z!@+6X&7{Y%zt2h>#6A%zV*Rx}+sO6mMLX#ai)a>P3rlhe6$@VV<7Oiq`i zgLl^<$Pw>9{hFw}avtU@ykHv&^ zebPuhn-+zLbi3~(&frX!pcY$3dy5d|84(ekF@^H<-XcV)L_~C^6v{+z5u!}{(S*oR z1D6_c6JE``KiE@(7#|MCDSD+biQ7ai8S6i(2cP;wF+N5@t^a2|_|$(&%)%MmT{j4S z-BW@XFAD}b<^ji)%bV-dlcEVN?aetak?H5Ec=oQ0Vy#$C5^sK^qEDp4)Wv-UV+H{!Tm*r%Lvm)Xr zALY$GC5Z9PNUg)sJYz?(2cP;IBPk%b8awa&YD=yOyt=0ZF`PSC>~KY1?O{uf(Ek|0 zuoA@hgk7dI7*o?_8Q<{&k6QionbdSHP#R`^YI9Sr)PLO`y$QI~JrF5s=yFOW=Z4?z zB|wDlM>?+=L?$)yDurm1wca8`Y52)-g$-9C$7aT>oAuCW?p!h(z5o#(@GHF#5NCB| zi1fxZo7y+}wM1xh%7Zzs$iliFeCnU&+t2mDu6Y-P72rp`1c>mzzJUS(aUNg%p#Jq~ zHnrdC+b6UuTX0IXBrDJpdhn@#hF`&iKF@NBw0U2{seP77%_l_+!!6y83QgadW>fp- z_;RpXy6k&>zq54tEVFd_`hF}4cUo8()JwOo@9)RpKiR_c-n??xF3+>7h(+r)?$lS1 z3BYA*o&j%9%``+#zqhy;t^Tpww+S?nc(;NZ!qYYB@gFQAL!6(dWz3FAwulUImiLgE zo|FyXH;c#+=iyxTO}@~ex9~*5iMixKVkv{<8jURgYT1GGOZE=DvSJ&Nzth~@s9 z`j??VC$oD^B>`n}8mC+yFstV`_4i?n#_eofYi{cA$4sg|hLvoym8GweifVJRGyRfx zYP(DYM{Q@OI=KHSR|Ma+s1!5s!IaeGruOsIgS|zF^5MJ)N~>F*X|=HBAZ+=o-XcVK zX6+dhj|0@Q5vZrgk!62$nn4IH$@c&A;{>*5!u+0>qo;J2GN$F_YNj-Ine zdUsC=V%%aQXKg`y%d}p;`&g1o-OuE?2*a)?>P8_E$(jvEdDF^97qE{T}Ka7P4lSX>g5*M(Q2G0HCT zFxv%^CZapc1_&+c&k;TNtU$-xd7agt?zGCyO)_TrcrO7WI8Sjp2$($LilK}zor}d0 z31aMyCL$}U$i`QC2@v5wq5{oU4Ruf;+|f&b2w$=ts<9FlU;?kZ5a%(_hy*eI)&@jI zf(^j|8S5=VlzPMxG%*Kce@_Wwyue1!#uCwZ9h9FfB14?}BPpR{a8R!9DM5_aMI_42 zx`W{yu`t$J31T=$EQ|!~Kt0YZDVQf9>$oj73D;QUeV+rHy zZU$@h+Vl{7qXS2%*RcsQh7q!eD^fZbbx=p}E=fds2q!Zg#}T)H8{c}aaM$wX^$w#< z++kNfdW-9$b$B5_&lm1mzOp=7syA>f21hkRD$aIc*c4V5 zz<3Iu7Q!tpvu4o2+mK?-V5uFLNMmt|cL=dWrjGr-rKbd|*iCi}CI$-{4=mwLce%#d zPP3_fzK_qs@7DI=g~B$j;ER^*%-x9}ND$+e2u7#uP7FWMQ-T=(9FeH)qY-;%cL+Of z=qW*rx7#txTDr47k9Pzv77)X|1c>l7-&wU97GXLIa~Id=h5kcnHno@7U`nPB?dp7u z4?+m_kN4nH|Fd>TrM_x9=3jO?8+(fo<(al$5>~LS;Q|&O^6A)3bLTX9T!=`Yvt7L} zbRkw7w(s7rvh|(C#fbKUm|Zx`=Gpa`#e|6Tg;;__^6k2JaWSI(#IA?fTmr2q%Ir@` zE_M48Tp2TDNiKDlC%7^~I4sGf?g~4M(PqlT$F)*BX)l6m>tMWu-K z#(eSN;kKZRKe3n)k^VVfcoNAk<8Lo6Mzrt8k__wKrxz0<(&u9d=Ifrbx2Y=?o`v+P zDA9hLFJ+NSS$@Aya;Y1sAwpM{*Fy>2f|$%KNpNM|dpOBux=Z6VVaTt0d{GR=CY#j2-I3h)?4Y}mRR~y^=FJw3+ zvbC?b2vMHzH*};WP#W9*a`%G4dBU34h(fX`uBYoXm1HsF zH+n2lNDkxBol6v$!`Naq@hhLp7V+yJ?F?Pe_zBGx_HJ>wyp3Ch=Bqu1S?6a9)a9+C zdhqGo6C!*(US{-<@4=`3V{Ei%(#KmyrItQ!^~GKSMEI($OGFSI3itGIK0{BL%e_U2 za*m&jKoK_*G{*OP2@v6Dw(l}_KpD^Gi7L;h#bsZ6bjYUmYi)NV2k>T1%7!9;O$8+ zb>D5@IuyR5?pAqmtL#`&cLk9re$K}#0*;YLs9 z?cOMdIzNeUSFm*r-n|AQ6%I5LJMknI5p-S(_mefYtO<+Wyo zD;Oy5aQW4v2rqAWOucFUgW^+WEFa!@z;*Nyy^2^d}X81KR zHV;Ef?dPZ2)PAw;a&6kUSJA4-a|);R;8Wi@zi9QxYFa&NyJRPAZ#1;_zL@QjP3>sb zCQRB_#k3`x+Aojg3>T;{+Y)Xs_uy0i9NX>Kob%wc(EeA|P| znRa|pX)|;{FRt%k{-&1z5u6!;L}0btMb@_yQ%q_)M`0b! zntVWIFscbAHIEKGBJ6FM$-q~8@Tq^d{gM(>7EKl{t-F9l4}4zy;_fa?E98NRV-HP~ zsE@XDM~m9NWcR|p?q##v@dXZv`25Aii1uO|pgL&J#mCoYVdricRzGJkAtGJudqd{7 zGI!aWnmRe3U$iMHKJ{-)xM22*?X!Ej`xdtC*+ZYPs-AFYqC`E_en-Yhb@zTgXSru# zcKh7kx!v;ubjKk{67$lSWE;liFrRfulEjRrUc%_rsPJLOxxIMtR2J+HVwgEeV*cFD zhIHNwtbZ5n-;32yeqD>s{K%qG#QK!qxW!mQtcj*NJpIjH0z~+Z-4?ReRJv2!rbIgs zww$|&3~{#F8K=dm?K|J1+|yHn7(dEO6!}Pcw=uU@9)CKurvx#c7$5ZYGXCGM?5~KI zN#1IPZIa3@Ou?=VNO&LQogS&$zI#7FY%%i-nS3$x-QJ96;eXN$~oL~7m2*tou- zf6Jm$%*ID-bqcZgQAfTA(Ut>*)0BEhO4pb#g~lZD`V7DQDoWhxBYTMw)wz_K7v*ZcPN5H{9@EPb`P9aZ<&`N-Rz=L z#M;?Y3J-{hqJ86{QpCD3D#Z>7TS(^Qk+VgFM@S*uM?TLLhCOX@F`|{C zwcVhJa_4~dKZhVkyr1@#<8^Ui-h+oAN4zZUIp$W)jhroz&~r+PSZ|EB7?Ib__}m{p zA*(NK&K{B^F?U9*rp82L)sSyK6hR`sv!|eQqw_6?B1puWdgeylaa5O8Ck{!HnA1HI zFHe}e%(oqiAQ3;>Gi_c0)voLuk|Z(zB3;W+;*Ewz{KX;25$`wlldoYt10KJnBL{c3 znE!W(vc$auiwSbwXeC$TiZwj@`&@^H-$l?}TD#m9uel?1GrHW)rE6hBdBxo%w z$4wGJ>)6#In;*gXJWgdui_Av_1)YyDO8P4C>YX4u?`HF+p`guSja&*YmlqImCC$9z z3n>KB=HX;@*9?b5&BMI}M@VNhkTrb9)ci!Q#N(hcg+62``=+(bIf5b!Jc~N7(pUJ_IhFe~!I0n~H8L!|Zi z;Yb)n?zmmq5ZpFwvfMN6%u{g7J7>2oIQ$m`)*?rx?fd2~o5fvL^X{d=RsO(J+dj|n z19l009%{wD*47A2q@-F;&3{Alx=L7qK0#T6W@BDo*Mpz^`gJ`%RJ>i;Ft1x%&%5UYo5I)l6BRq}Hu041eHB8khZ__s3g>sj+;rm*mjBMrZpcgs) zG+fO)?Ale!P&V_p2>2-V%@s)R65nI(Zog#P{Kd07u>5|KLONO@Aw3Irh5@@?fxQb2 zOD4^)1@VKjPV4!;5r3l+zZqMD=6f$Y@V%EGq6$gBe}&uyjelKBd6gvyLTFm zw`*9H-I@62wP*iF1{zMi!Vm0$@Jf| zYAw#P&FM~Be9c!2a*nKvDbEc}kXH~wc^5%%F$nRNobbvWFw{LGYibS=*S_fA! z?+@})!5J(kFVTLB3CzJgqvH&BaF1gPHl}rR zgq}`FG&DBHOH3Ybjpwmo@_6g2TpoXxt5dd<{gEl%kE+t;rx#=yeRS1wxrB#SPA|^`qLT9{Se?_LB(u9lVNb8twe4EX+HA;q-LqjO|j!OTpUCH(^F*q$QTAdGuX#a3dPYeL~=c4itE<%3x+*q z))iombEYDi)}}EWneAzD5hBigqZrBvL|)q)WfUT>>TPdfJ!H=BEi+7OF6b?@p5|<^ zqh8En_!vTu>n#K)L+G^LLhv$#p3pn@1$>I`b-hK35Lv{BBM^B_ZuJtRZ|A_x5L(28a5IEX>5T+8L+J6nb6*%Ab1z@T3cd&tepgIR433Y9 zj6metNFUJTiY3)@E6+uDcivg6dC zbGYWoNE4xsjzE63YJj7Q{_NnD?nty_*M*qZnGc$23>AN((>9T*W|em?$keg4utp88 zzg^Y0Fu#EF2{~yD&Pw_pIEsqU{ee}>7B1YjfXd=hw(VWO;Sdvy>EsMR^$I-Kpc8yZ zCionK@Q}h>=~0OJ0Ln!U%g1WW>4hD$3$r^Kv%9wMxe}+|fGXmFKdtK9v3DPO8;7uW zVLQ4poh~GH&dy^<98gi%pH?lI!-33WR1$+aiOJpDc4S}1+JZ!W$?E=n{Ei;paL`aM zS>3mNejk=2j#W@ESv|0@`|>Tj7k0Ggo;Qm(T1?4uH3Q)Y=3?S}$FBh^W58Fe?%#FU zMGHfC;@S%9*G+cMUo>|yIQr9=uY?VA+b`XV#mr-}wJR`-?HlA$P3sCA`Md}pUAzJT zjO?(E67;QjVW@`l2Yj*nJd~EnB)M(O(aV>h6kmna5?QX-tX{hP5_r$lCV?`$eHPPk zAvy`s6)PA|zD|f-dFSr!mkNKbJqxV0Yf2Mih*|e;?+DM|kHiFH#hOynXB?#>v(*x;K0mh) z_nS^u)MJArX7=pZwr>_+`i(Yc{RNvFRxd@Harvj(m;Zty3?8`o7qJ`t6C##f?#mDQroh$G~ z(Vb(vuP}*=Pln~c4yJSTiPe2ABz}Ye{>18KEha9$Pa-;BK|$jG;>#fMFC$)&**>0$ z^Qv5!Jimh)8Nzh(pIzO@n)y`YVL>S3IlIRyK-^aj6Ubsu-m zk2K&UpgfnjgboM~nVj8$+}DO$Sd-N?N>BBjTPPzC`e=b7 z7z>8PC)ni6THmsU70^x{I8>avV@k_*8cTbda_{P;&>e%2^!vT5SG2eA-dzj#{T*Uu zqE#rO?%RX$kQBtpg7~1PR$mU{C&`F0x z?B6_`)2`rgE?v0yu3lD|hBf~$pcHW^NV^X%Kzk@!_u++K(`XZYuD1C8)ywOZGH#mU zg))tIzi?^M*aaC3$c5VZ2*Mpb(2Afjz?Hqy;W+=&D9bah?1&$W?DnWc4~k??H_75R zvSBYrKZwqOAJ%)JX?73FuHZYy7Z7Pscc&*NRU2Uo8sZ{bJ6 z^TaxywS}&B4Qxa`|8w*xGRuRNazkDOW`;l2JHsyEll2L*jZUPIMzW;<;`Bk1uhA|G24F*9|NOsfJH9 z&6~z@-M|XaCa|A@Q9!pKO~gpK*4*{JZeS%O8}&LI^o=|fMaNw{=}46lQhzSHEzxOT zH?Ru&n4uhFpF17|K;5j}&A80wOR=#7P z&d)b%)99EwMx7mjZfOXPc}9*1$DA1w3y?fJM}*|lLShk;45W18EP+xHk{d(fFeJ~) z5g|FM$KAId<~XqER3DaqgXPbUS?iRRgTxrA9ncuG@$02pZiSG8KlswAOYG1|OXzpL z)i~;;J&aa^7(tcNY5;V`Yi$~EI_4glJ|O80!T4{DbF_mqg5xmyc>z{AfdiB;XyGS1 z!s`I;)-U9)R<1(&r8#nmOM z?Oh2F^p(g#XlohYifQ5DGN&F%S={Tw5>`kSYhBlZEJwNld~3$^>%5#88QFDsd|;rD zZSc2dhytMs!tc!}c3@yxi&FvnYzZheQtXM{0|Wi-E%Z^-48I2kmf{VRv*89c{NmX+ zJN(|*+p2p8`uO=i`&{Tf1Iut+w}mUrx>nsYuwuH2?<;`#c9ZBm1B^?C-QR#In=-#= zpdU&gony-Po`L0pR6ta9tg>|t-al?z7tY0v#W2ra>y)1iEE^+c%Z}=`cB9-K+ctk` z!IZ-rdxD(wbAYhkJOitC(qTtikg7ppuNo;$9dX<@fOiyIMNAcR`QA6s*9PG}LHAzQm4c96J4|JbB9qo*g>+2KDdZIs)%GEdvc6i#6=|Ez+sFco`J)7 zsn)dy1`cCU$R)wRVQdjak{!kob4QW}4&!5-k5+y>#`v+=9X5_UthXbt8l)pf5JhV{ zuNs6SN6<0oq^=qijvUGU%_G6i5xiTVGfbfR^avhBGa;X`XT(_ZcX4ZUQZFCu=L<6} zJS46A$(Ii``7mxMCW2%c|%)jxjbtw>iUJ^6e%oFCP?Bz@|%>hQv9> z>X#2L8*8`tiBX*oP$tWpT388(Ls;!s0HuUr>J;0;$B|Q$rT4|Nr0swG;BpjltIj(SG4U`zZRBEO;SnDj; z#*IP!af5W?Hw=n3#Vy7fL2%atZWvrPUBdisg>j0c6!Ex-o^;$W$Vtc5E=U_H<36E? zLUYrF-Bpv78wUF^C&r1t*Q2tl4!vHqv&2Wo^Pw%cd2lI;>2hNcexn~=FzMYq*w@0S zeVQwPK6AG%#`>0u^%_6O9qDj%YVR9d3gfv8BCFv0;6%FJ?$4CKR^}u13YG7ui3sDVTQFD%*Cp$YR!AgG*7pDyA9XH(Gwj{S9-u z{Uy`93!N^^wQ<#57#VQ57(=1XBPd&D0D7J2zb>H-3+{8Z+E^1nibuLObl7fg@F~dJdyPl$LJ!p@l=J2tS|zN)!n}4n zg-V?E>@yAJF0@NpPSqKLh4nA&ldZGjt{&Jn2ib_2o~^2~}g0shbZVm}rgTN{VhSAe0*wyriJJ!v_XepmS-G_#PLD z#DeppBfv>2!X=IgBn`tO0cpf>$OD7RD_D1rp21l_X-jpdBuTfEa zHO1+iU_LHkU}4M25965cnq~!P-u=RYrSAD2uvLBt=Te-EbHjrVrhib&jySRf=fmp& zr7W(+m}ytLvUpIYjl5=!h=H~ls|BH$J;(HF*R0_L>m}}QbPe{N<~3{j%XlE%T@AZt z&GOb(5Zww1T1V10nS5TeW`*vNpK9Cp1OxgT0UN$;(yiIuZLgQupMpb&QN&dDqePhV_V_X7v z{h#3ziYN!|EvRtr_jF_NZEKc|gaewp;JE@SS#D^M4)3*1g8s0nYJMQ*po!;OUyexA}_FZ+IXVY#RRc|{_QIs zv9%R~jCov1L2Tk%OFprN1G?Bud$bxTZ(nm1+GVq|wKmk9nBu?WZ#Qwo?Q2#FGA+4) zp`HjQZ(p;T*G(2Ko82)ygaZ<~$=<%Ef4s~*UuO#Ub`&n2lRb^=%hdhsVUF_15XNFX zm0(iZfJED#hp z{v)Ptlft~d&4jgg+q@2yF=^25yjvQ^()glBoUS%Wyxn-^?lt|D6065wn!MhMJuHn-jGq%|mDJ7Ii>yK$#DcsJdcda^CH0%= z$t3sy)>iAy2}$0I$|K2xm<$m`(w}6-#i}ko4aK{<+fc$%e2q#`-JreCXCP6<_+Knr zN{z#Hx{C8kn=zBLVm%X0MJlb5p1@6fto#}zNu2I9rB(ZF;+8{|Pg)hncjSD)reHJ8 z!&}N3lBmpithJQuJvtwB$i*J3=&~+ySXhB_S-U-!r^OQoD(eV2RpIdvizN=rT%YC< zMok-Y~oJ)&Zv(+Xg zqDVpHsoW$O>bUq|9>i3Zk-#tM(Fh5D3Et;fJu%>aTpNO6-@G%8j9tlyxcxsjBPvvM;ML_9dTMkq8_+ zWF}S&hXg%R5aj_d1hmKYyC3GVkY4GZn0#Kh0E`_w%QjD)WB+G*e~X z&!1+h%s)Ar6_xoX*;>N$7^0Ru$JP?kaQs8kpBT`2dVu5RNj@D1c_e+APe*}D`V$<7 z^R%M?In5fv1q4Am-&$_AqYGVCXX~~LvP?WREmfBw&Xo1jo>1V1+yrEoKmMJ(NV%5rmDUi>z)oli! z#1$rWZGLt8Goj3#*$-_;QrcXkb-L*0N<7X?SVJ{XL9F|J>grIB(_tUWW_Y z?(g-OLAt*;;7O)63csHt8Ber$1fC%A2qV}-H*eJ-X2bmfgUE0#d!_x&NDXW7<}n-< zq+waes4zZrjb>;Dqg@q7WjJ(Z-rSJ^nfN}k^vrTW;rEe^r6LT&PLfAhCyr$)Z{jFH z0Vm6hA^2UyQCs)-FwUcy-;A~}t#f}DvEyJ|ffx(x2!@UDs(|U8VdFRKGi>@A`#0|I zQGBV^&!hY*w42BE*f%vg42zJ2`@4vRE%)~@R?f^6%nPG%IMdh$hHD#xCoC2j9L7zk zXT~-eGGYJJNHAK$VGr{gx!Wkt*+|<(%^J!sv!%i87x1A*Q#>Lva?48uMdD11!XTlH z{Vh+Wg552TP{rPsN2p)VP#y1Fda0b-;M4W@4MqD&v9Q!pn zXGnosVkQ+%h%tmU%NV_Y(@ZgXQLJo9LkAt4VJw`)leOSv)ndMq@@=o@fq z&dm>Nxhto~{-MBbO)ms?YkD!TThoUFyET0zuv^pD1$Jxtde|Maa|2e{P5B|(z~-vW z9)bf@ZNo-ffM-KZTx~~vY?qrUgQZq+T-_vT$OrAAyRc(z6^X)ltZM)+H5K$=%78=i~Z83b2QXf<1Av` zZA(I7Q45<>#ygtK>oMX*#;pk+;kvd2T|HbP35_#wH^*5-dwA&(q|HHr#BKQ9XObavXDJC(Sd3Op;@v4)|oV*r|jAL&M&&CSOqw|I; zEiLkdlta0;4j z5g)%$-=KPbf=56nxRbR{>fwZC4zE0|KAU|*f=9f!`{NrfEnp!P`&Px!t;H^vPuSzQ z&jg7vMzV;;>(a8lidPbd1}(f?6ciuG6f#ye5DoT7)7Xg4KzgnM5; zr_{@wRYv2{$@;kLVxAKgF5E4cM7%gGT*bt-`k)^uq9@*5!Afrp`oHlMc^RyBxr}N319G@1Q6Tw#cSgOe7)G4)JC%MFZD4$cQ8?CRhE(~G1 zp3A99k#94kctt!gl;REJ?scv(rDN%yTxV76N+$D=>#P(LomH;=O06NxrxUCKX4bh@ z;Fi>D(`*_O=`(aWJ<-<`FW7YPH#ST~!;d?zIw*}lyOQc$Wy-AY_-2zNXY8G)8En#m__&11;Y<7y` zI|)I2;*cDC|v|Gzxp~OluZ#tl1ma+1{`!*l6ZHEUjCk;?mls{0B1VSj(iyQ6h-793Eq>cn%BQV&;5;-m^sx z5za@#11^1fSi+}8+>nT;$nha%4Tpz6CH0C}zl!@*4h|0{xwJG(SUQYbr*TU;GNi2G zz`#eJW#2EBYmC2#;nP1PY>~sl14%9|{Zqoy5%H8~EJcn9DQh?+{2^iK2rP9zz37#% z91wn&uvCr*e@s}q4o7O^zTs$)vWA1f!%4kjxFBczEr){NCM;bqMy@|3EM1QmLgJQk z97tKiVZiwkt>?G(@M)^e$U)#Y2}?H!OT%Si-S#)QpPleh+utY#s{4~%wkYRI!=C3hV*e#x z`WsE6n>ab!D8TMMJ|OAor3Hozui-UDSSVl zg2lj#0NyByw@SMca%EvnltaX0{H++NgQFN85*|72s;~C-M>#}t_WM{1qz=BJ=7&Xi z9kts&w;){_&RGqUcz@}yQ1M+=p@~k)o3>~1>~xPV zd#n-hdb1px#Ez8Kl0_NLZWW}Q1qC}WMiZS{G-n*`g54#fgQn@8ymoBlSeGz=1UZ{c zr8R=3>}Z+E0diZ4$uhenUS{jiAw_e>(J^5@2gii@>yWdA`RkCg9jUZNa*HIYSmb~j z&X^68ISbZHwg1gLUXQ+6!>(z8}Dfzt>uMh zKYgKx^uwG>yrJw32~GhEba9;`W=3(&FlHig&PXoumsZP&B8&?)k2!inG)JTGTr4Hd zBja{6l8DSS;ZZ{*2xZR95 z;&yLDj$WTghck(=Ph%}ntFFP}0yG50WS)Y<1%??OE-(z_DmYwVS-HanmX$kPU|G4t z1(uaNT%cJp@XB}PB4={eeQB<@mdtRM%t8)@XCo}D5E*<`TE)odrC7s}?q9J+(0@kD zOa^@U*g@#Yb=-XHAeoWaL21Qe2gQoT4vH0v9TY1TJ17=ohp?X;W^ELa{q+eR>*8B; z?Mvw43GuLfNxY%#EeTEm?=i=9iuj~ooHL9^GUA*O^v~I$2V0iROrJ zpvO|;T1wn*uB626E~3YX+s)H#Z%m{!g5EinBN?~`JAh~f%+auzCB8YDqhUOb63Y?S zT;g_f#U*Yx*IVLt4LaYD>HGs z8LP(aW~iDU^_ZiP?nrJOQ(7$p)o_(d^Vp7Vh~{V=Vw_lx7^TMTW{?`Un=xwKZicA& zQI9!VhaAOgmJCqy(Gj)edQUz&61+%sBz0oZk>tdpBgu(HN0JkZjwFZCk=Kj!OBY@I zB|E#}6qBX&G=F?Dn%EBVVs67gIk}&7!eq#@3U~oIp;g4=D+$&x9%@OjM({#QG-tBY zE2fyt*~WOzxV;uljs0H2e0F>Z^V#zy%xBlPE|u0uHWD{pc7D$7HL={I3RL!fqw$;# zhg&_mVA%g9%x4FfFrPhO!hCjtBk`OKqkSbRoa_Xht7&e|WG}cOp0kl~Q%L8G{b0g; zc7zG@*%KzrXID5J&l&r|;M9{eLrwud8`GK;qt%`MK_#VycRjr0WEyNpJhLNbVQZ|5 zCXt`d2TN1lY?pR&dF*#Jl#SH?lN2s*A2J#1S z7V(1PgGvj>2ff`-kWq+51Nc8_HbH-yOHXTKfz}Hx@MQ9A&^(+{_quA*c|KVJZcQ(5G&QO+^1a&T%yJamSszTmSp^4YDa=t{FNyHZ?cr^0r zyf3MTO9$SV&rYcVMgiB7qKqP*or^Mtv;PcoTW-mFTOt;4?)Zz`8YYcfA3$m*j?j4H zAf7)|kV9c8Wm$zVl(MX17)n{za2QHi)(D;}_RA4wRH~Du^F+=zrI^fFE1xr=iA#IA zoJq(b+!{@=3b=QYU=?wbG{G9iG1)vzoo2r`&Z6l*@qowNU0oJFwv zBVagZ|I&zi05+8UD$Xe624Gl)`h*9UMOmy28mi^eh_yjOHC)^p_gj_Wz?8$2yaJxt z%vFrdW2KHXW+KI;Ez|i73QfF#=S6FDd#Am*RjoBBweOtZ=lr~<@_H9++p$rM; zQ%r(74@`-+t2OZ?T@+G|JiAg%LhcK)uON%~j!F))B|_CkyMy2)!E8@%cCVB2su>=C z?bfGS=ZbnUZ_Ci*$=sO;#pSt~)AaUa6^}mf$o5mLB|ejgBQ|p$6Z0rj%`^j#^GU>u z5Wk9dET$0H97Bxm20zNfG^!6V-D@_5w4=OA-< zr7h}iS)@n=k9hm@c;ul-@_1v@GQU?Rc*Nt=hk^e}(8Clohu7(pCElI{k9e2o@u-JK z0Zsihn@9M-?!bZ!-Cy@elghB zr%Iay+WrKOa4!h*tMt(QJT1i};*)~%)ta~qX@*msRA;NKf$xa3 z2=|_#d;te7texh-S_qn)S zgghk=DKxP%l!GiywmTBinds>(NG2hjiJr&AL@x)~K_ifmLH!e15KKY__0KTfySOH; zvDUc~a$`Qdl3)_@nfZ(hCLWo|S;^v&fyNV4OhP_24=FV9TyPGOPL`0zrvW$r6x|&fLs+MKB5J%*{L|=4Lra7LSBHHN_<46C+kq)4dIC(n1MH$k99`OF-`P zKO+w*n7B@svyx7hLE95jOj>zH9#UxHftVa5oh%`bOEC#~avoA>;w69_B#TEvM%uV! z5;D@p1vA>l;baMUNlq4XA$kg{+OV&@P>BIxK5)gJB#Nhc!c98dYk}E z!42VCvN1eayPucf5${D&yaK*%AH$QyabysM&kMSMRe=e)`3Eut)f(V1Byi)g{< ztXLSGbH+hKI&XJ^N4U%K#!(Ni`p593^MdGFnILAWDCGd$WCM01+w zPUYBl@hkJ)n!d#3+??{6M7+>%97Yr0tuxDXR%>Q*QaaI@{RdovIsC|AwDDy!sPFLhn z={AYlpX3sCFoG&{-Sg_S249KkqFYnXWjNd7K9iVd`c5^PxNPegN(SnFUG`PGRs-@4xQJakW4~4$5K3|d-GW{IQN$s z57uc|0+LC{V4cP=u}+gK@%H2<1?eok>hvU&kj@bkkBK8D-uPZcgn@b@*M5SP9K$1E zu)3#t;p(2CH#bYXApS5s;sx=C=7sSG>8Jz}&)IflrVNjG&bFh=!?vRrY*7a_KvYKO z$pfuI7SaCGk5rYGdv(Lr7{U{&X8X!z6!2DRlu^WdHfL8y+4Y4ui*|h_Zx^(%w3GvD zDKKZVOIt=3!Tv1|1{R*D@W94!V{5F{6drR<{}4>G2U|QHHeKco(}f z$+1mxN$~{<9u4>#f1087a9J>i*RHEghG1Gi9l;}BFfGu$a9Yr*V_MMJsy1p)@VimV zB;u)lmJJg}yF3#GqXk>IQxoi47#;zGeGAPC_bmjyuIAu3MA9OUc+T5oEP1Vm1wC(Y z5cKL+JfcklpOIn`u@=cPHM4I6}qDb_gaR&x$~j>Aq(pv??8xOl4B`z~e!B zhDk{09VSl`?=blp7h0Whxgip+ff^B`>qU<$Z^8%haa z*#mw(&8Ec%Qou!AV@d$aLndEKvkCmo6!0)^5e2{#%E$5?ZqCP+9rdwc=Y6bM@=id` z$CgdtoR1AV?_4u*gvlaS#KhGt?1BkWvZi0D2!QvE2&C8+bMGn+&4nD>jqhCj*dna(xW zJ}sNLx%O$;`Sz(sM2r zlBWXi&ULN|co_FE!_HN)Wapam@q}SVeQelyA8VHETys9Q?5K|oJMUx7lAUYL$Ce%S zv0>+ZtXZ;i&H31}37qq>VZ+Bk=UQ|+*KilIu9*Z4cOf+syO2R=2rb>YJ~zQ5;1ywK zDD|>c5gpyRz9GRQ9zQngb=JUR=NhbBbZEHgT%Ggvvgg%IB38oARWWgXH19>zxjHv> z45aB?ovUFU(|svWbv;N-cdpeSy-G(hY2{>KrDo!*3BHwrp*z=b|IsiB8SX!7CiWl0 z&J~83&eeHG#^%99uD{4du1XhMS3$#{WcEzwnrokyO=I(Ypw`Z}Ppv6C*IfIwYy#)| zKn2Xp@Cl1$=bCGu8d&bd=Gv!W=lej-lAY_nrP7t1>o;jOOiC)L+38j^$Cv;u~V^8RC2^t(0v)t?@ek*O+S-3Fu8)-Ii|J!f=j&`;?r73$t z=hJY~UOoGlbNFwifD1S(=k+T#P1zF$Gh&xbi-T1MhaJv{Elc)V+4m*qn zTNOR^ls#e2$Ce%Sv0>+ZtXZ-r%=y@|37qq>Vds6US+Xb0`Pj0fJ~r&Uk2Op7ggGBu zcGSm)4Ic+RAwqTC6Yfj!2>JZ5=aPEZ_s-+#p72cx9`W80!DCDq#Aq!}fK5*rb_j+^ z#IQrqOmql-A7kd!>|@ran1p( zOc;d64m%9p&=V?6*%Rh`Y}vFp=VQap`&hGNPnh$uWk-E%*m)momh1_0KDO+rj}1HT zW6hF1Va~^vP2il54I4i88eFY`7FD0Bcf@!eOu{Uapur@}FvCe08EE9i_L#s7PGvb< zf(ECuEEip+*TvQvs0+0*x##BGglBhRctmt=!n-`2TnI8Q@#JQNbFs=*l8x87SmiOp zZ8vR(Y`8n)>B#_QuiwQQ&1_j*OE%eD*~u)(N!&slvWOE!(TvN+8Z2&WLu6BZZX9wL z528mQWit(ybTp)V{9{iXas;oXMU=TME0YlfYH?KAn${(`L_I5E>pE;^$5Ca2 z8cA}AdS(K3eR!(V)B)M1h7+jr$@8ZrP&Z)tGH$DER>dTjwr)(Ij^b6RII3(}g(R1# zqY2cFI64juNxO)AfjwY)IB;-ZGIIWD~!~Ic6S@DB&;x(lu>wR!e+%Vm* zw7KTXS|6Of)>^XC2S@7+6KAiZR>~^xd_^<3Mp%PaEU`3A}e}uiNi3lEEIaem}2sA=}ZDlU$ZmA%Qv^p4-qxRgg{TNeNWhmWC3j zBe}Va*66ZR_mc|%>G|oPeo>lR-huYL@PjK z=DhIeria*zOS6eqpdzzGD?ntHXa$J9h?-~xDl$v70z_uP=_TC?5PK0d(F#;#mS_ct z%z|xugDTrrq7|sfEYS)OnI&3*ip&zNKt*PWR)EMX(F#;#mS_bkGE1}qL}rOrpdzzG zD^QVHq7@)A`*bjZ)JhD^YVzsOaP`PA*#^SZBhAF>k>9X1BR)B?T!My^6T{6-PBbSz zIk8-#hLaP+%}q`;Cq6l`T%v}P6T{6-PBbSzIk8-#hLaP+%}q`;Cq6l`T%v}P6T{6- zPBbSzIk8-#hEsII%}q`;Cq6l`T%v}P6T{6-PBbSzIk8-#hLaP+%}voYM-DIH6y0)( z8cxv-H#bGs967uUCEAFL+%^QkfYHTmG;dD{4OKQ*6}$DP*|c`h-voEGarrg@EZf(z zG@HN!Dc}Omv?YLL6YEQ}3A{Q5T*Nih1h8ynOVexuuSx+AXKzVq%7(Ti%_i{56z~W> zpOCOvwzb33Yyz)H0k6YX3=+Vyxn*fKftRO%*JJ*j0G2K8PiZ!R`%}Oha4kOpEF0Y) z(`*7SO97AKlK=@|+3x<3W)rwC1-ub=spG&ZvP(4(722g52x7Zb15v?Us)4BJF4aH~ z-lZCditkblLDhzj&l z4MatHsRn{jFV#R)te0vaD%eXk5JY>a2BN~fR0C1*UaEm0;Cn+5@QDGWRPG25hf8OM z$;J^booObP&isH+Gi1PbMv_a=b-_?)ba6p8jw%PFaFs&q$@PSAmBMgys}!0eN273l zX1TOAoSzwPZhodYawrPtXO>IUaDHaEx%rvq$kq_f&n%ay;rz^SbMrIJk%Le;KeJq- zhVwJS&CSm=M~*<@{LFHR8qUuQH#a}i969`i^E1mOYB)bL+}!+3bL7|)&d)5DsNwv~ zaC7rB&5;97I6t#oqK5M`!^Ql}A9gfH1$+;s*~DEEjAvFGU%N>F%l7sAG@HPOrGN|g z=u84wHn9iOYyxK~;3B>-mjITn?140!z<){s590%M31HdKewStw_>U>z5xjVs0G4g- zw`n$k|BwP+hYv|7fMs+0O`1*Mhf~1o@!jVHuxxR^PO}O8PzrbhKGU24mW}TIG@HP` zPXUkOtI7#r+3tRoW)t|q6!1p8Zy5(x0bi5#c`)JmURV6mK1liN)~bK=AJg z9`O!F@z#e2-~Ql+Eft9J#nB~{twUg!sd4OYzz9~04#vW@(G98ykPJ`jg2V6oZXSypMu zW^!|iNk6_n4q0?R%;aih6F#UW)=d0!lI7|YC2D`jJOXNpNH-y4SM90`S9L@{@v5%kpLkVQ(NDapBlZao+RLi0BA<9wS8-3gsw3)&SM{Q7 zJ@KjzCL3hDsuxH9Kf=xf%#*Dw^Fg%1NtFJlt@7(3m=Zz~w|-s>DB>+RD=^UEma?cyMP z4m1cwp92+!94LTe#19MxA?XJOg<)V2kmo>ykn{tC!jJ<6aHRMgXb_S<2PzCXPyh#u z&w&OZ>2sjMkOKv9y!aew5RyIzDhxSL0Edjvfd(PzbD+YI0|ju@_#9{ul0FA23^`Ch zo&ya+(&s>hAqNV`bD%*;`W&b*6UjUW8bmAeu1*fp+dZkp z(UW&|agcdeCkN^6o=9@^#X;s> zogAdMdm_ovlXrD-ka<@p2kGseNOJUeyJxWO>f|8Z2k$hCKkk2tgYZ);& z-tj5Jne>iNSa5v2o#Wd(K4sAJj!#%{e7v25+dDpG(DRN@Sa5v2og>>jK4sAJj!#%{ ze7v2*+B-gF(DRN@Sa5v2onzWNK4sAJj!#%{e7v0l+B-gF(DRN@Sa5v2ouk=1K4sAJ zj!#%{e7v0#p?7@BpywT*Fh5Pw8Q#uu{MNLu^AExII0q^9=+%m)gXHbvAbk!rh!*-B zs4(O}0eKEI2uVLMC=3IGfIJ5pgrpxB6owoqAkTpYA?b6V!jJ<6P1 zJO>(tq|bp0Lk<*>=Rkvy^f^#r$bka#9B2@d-tH+3IZyxxj?aMxA?fX&!jJ<6eFX z{6Xg+Wq&8KP$EOTu(mOt3 z!SV5Sj&JYyltIrsK4HP}@pcYw@A#BK&pSS0!SV5Sj%@GvltIrsK4HP}@pcYt@A#BK z&pSS0!SV5Sj%n}sltIrsK4HP}@pcYq@A#BK&pSS0!SV5Sj%M%pltIrsK4HP}@pcYn z@A#BK&pSS0~kYDfQ?h^reI3?cyMP4m1cwp92+!94H{qfd(Pz z2L^>$pz4pbO&pnyCF8ib_JfeJ$o6p-gYgOKz&P+`b{ z0`eSa5RyIzDhxSLK%N5)Lel3zg&_wD$aA1UNctS8Fyuf1c@8uPNuL81h8)O19Hh^I z1|gYub#jnC2TCoD9-jjZLNf2_lUf`--tHNMWZu=uL3+CU~x$m;-rg4zo@hQWZ^o~zhaD2R-0y~{aBsYi`xykn}lFVaS03@*HRo zl0FA23^`Cho&ya+(&s>hAqNWJ*zq~gAS8VbR2Xs~196Z(2O5NA-qp!L`Wz^=IC^{z zGziJOtCNHDc28lUf`- zc~_VBAoH$H4$`foc}65TdR~-f5pj?|;2fmZ^sC2-q&UdDtBZroyE-|@ysL|Y%)7cc z$h@nQgFNA~>b7x^-tj5J#qo|$Sa5v2o#Wd(K4sAJj!#%{e7v25+dDpG(DRN@Sa5v2 zog>>jK4sAJj!#%{e7v2*+B-gF(DRN@Sa5v2onzWNK4sAJj!#%{e7v0l+B-gF(DRN@ zSa5v2ouk=1K4sAJj!#%{e7v1Q**iXE(DRN@7&*SBgXHZT$9~36Wzc)4bCAMl_2#96 z^eGXI@a-e`b z2O5N=&w&a<4iu2*K!cF zs4(O}0eKEI2uYs<6^0zhKpdpcfd(O&cXe`*J_kxIjvk)_4MH;S>f|83-IH1zJ>Kpa zgk;{;$w7L%C$%_wyxlVh$-JwRgYU~>Fu7>;^^^q&mbi8u1*fp z+dZkp(c|r&K}hCZogAdMds2&|$J;%Fkj%R}IY@8!q!veyw|fR5nRj(^kYk!CT^wZI)yYBbxs1EpI7sjKl;NJPZ{*Q;}b@XZ|NX;J7>W+77Tjta1K)H4PWnKpSO#H^f}NV6nzd<7;>P1JO>(t zq#qa*hJisqo&ya+(hm#@Lk<*>=Rkvy^f^#r$bka#9B2@dJ_jlcIZ!~J0}Vpb=Rk!a z2MWk@pg~Cb9H=nlKmmCUGzdwb0~LlGC?L;)1|jKlpu&&?1#s;69B2@dJ_jlcIgo)k zNS^}@LNf2_fp9B2@VJ_jlcIZ!~J0}Vpb4-5*!z#t&cfd(Pz z2L^>92MWk@pg~Cb9H=nlKmmCUGzdwb0~LlGC?L;)1|jKlpu&&?1>`xykn}lFVaS03@*HRol0FA23^|a2I7puZ4MH;S>f|7O4wPCP zJw68-gk;{;$w7L%C$%_wyxlVh$-JwRgYU~>Fu7>;^^^q&mbi8 zu1*fp+dZkp(c|r&K}hCZogAdMds2&|$J;%Fkj%R}IY@8!q!veyw|fR5nRj(^klyY| zEsh><_Y6WZ@9N|rz1@>q96irZvxqpzmpKQiHEG7-rGsQ34l?iR;vn;`P7X5f>f#{t zt}YHT@9N|rw=S!mXdI+>e9CYpz2g%W93OAz`1X!Z8T7p46BZmFZ|C6lj!zl%yyFuV z93OAz$o7s;8T7p46BZmFZ|AV~j!zl%yyFuV93OAznD&lO8T7p46BZmFZ|8vaj!zl% zyyFuV93OAzX!edz8T7p46BZmFZ|6|d|_E z%P8jU;vjtvGzdkX0~LlGC?L;)1|jJO28Cf@5Rm6UgOKzCgTjyl1>`xykn}lFVaS03@*HRol0FA23^`Cho&ya+(&s>hAqNV`bD%*; z`W&b*%NxorBbxw7Nu=d&EKJU0obx-qp!L=3QMJWZu=qLFQeZ9OTAj)&0gnddH^> zXVN=9VZrh7c8+iF_>@7@7@7@7$rJz@RYXKmmCUGzdwb0~LlGC?L;)1|jKlpu&&?1>`xykn}lFVaS03@*HRol0FA23^`Cho&ya+(&s>hAqO%L z2kCR5K}hCZogAdkfl`a3$LBzUkj%R}IY@8!q!veyw|fR5nRj(^klyY|Esh><_Y6WZ z@9N|rz1@>q96jFd8H8ls)yYA6yC=0cdc55;2+6#wlY{hjPik@Wc)Mp1l6hAr2kGse z)Z*yzcF!Or^R7+~(%U_$#nI#KowD zQLn=As8;~TxWD&j5R(4hpTcnOPXNcbH-iQt>CK=*GK0&NF$IXhe0)hE`c${xrq!i2 zoO4x;U$IY;|kRiv{rMj%8~W3l0x;dh3furgS?*D&mszlLbZqjGN45itT?ucC?E>e zA_~ZZ7EvI}{S{FlvyvB4KsL090$JInhyt0IyodsFqD2(Q;xwMHGlXEuugSY7qtGP(RrlC!RZ< z9cr+X3K6ftP6~{6k^zqa!A>fKWU!M0qn%{H$u-zXg^&z(Qed=`3^=m}JE;(o!A=T{ zc9H?7)nF$TLNeG%fzeJf;G7!lq(VprJ1H>QNd}xygPl|e$zUf1Mmx!XvuUuC3LzQn zq`+t=8E`5Mc2XfEgPjx@?k$cCIM)3Q7lV-WH(V6b4HuW2SyCKo$f8Ce8nUR;m_>yY zS=1<0!}y^zjvqoeh{E_`6slqTP#UwS5RRjeMU6r=WKpFtiwfaT3R%=BR6`b38ndVn zj;4@BjY2hKQKd193gLhXS=1<0Ll#vUv#1b`sgOmDLN#Pjr7?>N;jju>)F@O#7F8Ov zsE{Iy8ii`eqDo^HWg-qWWKp9~Euw%NYRIBek7KKd0&%EC6p%v=UQ$#!wu&eahgw7d zIn>}KMU`W#hyrn_MHG-j4PH`IIkt)@5Qkbs0Xfv*B}J8EtB3+|s6`ZzLk(V1R5`Ya zC=iEQL;*R};3Y+sW2=Y)ai~QUkV6e#QdBv%f|oSfi2`z{!AnX#j;)8}`A2S^KH57} ztvg&VuO|+*hyrn_MHG-jEuugiY7qtEP>U!ahk6t5PFzU7BvdhFn%bFNDYB?hsD>=6G-gpI;!r~tH44=t3do^`EGqRl zwn7#)3e_SC$e{)=DfKwEf|oQ3)glVWp$0E0^*FYImoy61A_~Z%1}`b~IJSb9Gz!%s z3do@bFDdmnwt|;53e_SC$e{)=DfKwEf|oQ3)glVWp$0E0^*FYImoy61A_~Z%1}`b~ zIJSb9Gz!%s3do@bFDdmnwjP}4A91LU@(xw&4ntl~9BL5-;!ukyActB+fjHD63dErn zQ9us$#@?awjPdMHgPl}}vl{HAz-T8K@E8#6q(VprJ1H>QNd`Os1Usn^lEF?2jCPU% zM}M%B3LzQnq`+t=8F1(aJE;(o!A=T{c9H?deXx@XAsOtXz-T8KaL@-ksSuLEP6~{6 zk^x72u#*ZQ8SJFMXeSwPxCc9_5R$=83JmYaj0`x|{W~%SA?e?dQAqE|IETuT;!r~t zH44#?MU}=ZDx}DwMxh$U52bPZ5K?4Oqfiawhtilug%nxTC{#lhRT{IXkRpp3g=)y6 zN@ErkQe;u1Pz_mBY0RQRiY#grsv(OijagJkkwuL{HDpnxF^dW*vZzt0hAgTyW>FzU z7BvdhkVTcoEXqV2YRIBSp;|-%In-Sjl18CgL;*R} z;3cIV$5!x?Mxk0n0Xfv*C8Zw6R`8NWp;|-%In>}Kr5?vt@RCNMT0{Xk)Zith9>-Sj zl18CgL;*R};3cIV$5!x?Mxk0n0Xfv*C8Zw6R`8NWp;|-%In>}Kr5?xDgYx_%4)u}V zp=#aX6L~#xs6`ZrLoK3!9BL5-;!uky5Qkbs0Xftgxvx8Rj#jkBI~&yZ7Yyh058Rg@ zQjdDu@=Frl&hhWpIadZfzs|WZ>SviAN4{V6lI!sMr+(E-VbsGiJ&t+51`^jm&xf6tixf6IhN45WwP8sz4mvq9ymvp?HWY`DM8zM^E0>)yZ7mBbVgp$-BBdp3l2F zIm^4}k{msGSC?n=c~>V}xt~jN^yFP#9?a)mojm1fACz2dJ{+5bCbaj7AMPaz5!a!_f-qpoL z=3SjkWZu=qL*`vwEM(r*$wA)3IjXU7klyhr!(n^JCoDKV-p<+4J3eL5^NvqgaD2R- zgWEekWzh4EPgrn#yqzQ4J3eL5^NvqgaD2R-!`eGOWzh4EPgrn#yq#m(J3eL5^Nvqg zaD2R-1KK-2Wzh4EPgrn#yq%-jJ3eL5^NvqgaD2R-L)kk%Wzh4EPgs~cfwyxU`?(X8 zLC?>fAdKctSUO1FE)LS?K!Z^9IZ$E9fdV*2{J>xkl73)N7zPFbc@8uPNk1?s3^`Ch zo&ya+(&s>hAqNV`bD%*;`W&b*$pz z4pbO&pnyCF8ib_JfeJ$o6p-gYgOKz&P+`b{48%d^U0obx-qp!L`Wz^d96de<8bmAe zu1*fp+dZkp(c|r&K}hCZogAdMds2&|$J;%Fkj%R}IY@8!q!veyw|fR5nRj(^klyY| zEsh><_Y6WZ@9N|rz1@>q96jFd8H8ls)yYA6yC=0cdc55;2+6#wlY{hjPik@Wc)Mp1 zl6hAr2kE~ums%V>;R)L0vgB4|c!DM{eq}xZagcde7YCVlb#jn-R~HAFcXe@)c~>U~ zd3Wa^SB-=8j!zlRq<4J6g5%@u9N*sYDTAJOe8Pg`ykn{tC!Z0uh$aA1UNcw?6VaS03@*HRol0FA23^`Cho&ya+(&s>h zAqNV`bD%*;`W&b*$pz4pbO&pnyCF z8ib_JfeJ$oWFQXG=Rkvy%)2@{NS_0x7DtcIfd(O&cXe`*-tI{)jvjCK3_>#R>f|83 z-IH1zJ>Kpagk;{;$w7L%C$%_wyxlVh$-JwRgYU~>Fu7>;^^^q z&mbi8u1*fp+dZkp(c|r&K}hCZogAdMds2&|$J;%Fkj%R}IY>XLkksPn@$+XHgruK8 zOJSHli-9=EysL|Y%)2@{$h@nIgUq|SILN%KlY`uM4szW%NbmTR;jq2q6BZmFZ|C^- zj!zl%yyFuV93OAz;P#GB8T7p46BZmFZ|BJNj!zl%yyFuV93OAzu=b8m8T7p46BZmF zZ|9iyj!zl%yyFuV93OAzfcB108T7p46BZmFZ|7+Cj!zl%yyFuV93OAzQ1*^b8T7p4 z6Bg!2$3j4pbO&pnyCF8ib@D7!-zqK|r1Z z4MNfn3<^UI6p-gYgOKz&P+`b{0`eSa5RyIzDhxSLK%N5)Lel3zg&_wD$aA1UNctS8 zFyuf1c@8uPNuL81h8!p$&w&OZ>2sjMkOKweInW>^eGXI@av%e7kUj?*gk;{;$wB%Y zD783xd=4}S$-JwRgYU~>Fu7>;^^^q&mbi8u1*fp+dZkp(c|r& zK}hCZogAdMds2&|$J;%Fkj%R}IY@8!q!veyw|fR5nRj(^klyY|Esh><_Y6WZ@9N|r zz1@>q96jFd8H8ls)yYBn=~AT@N6(AWEF$+H{dB2XGfbDtKpbS=)x|;PU7Z|c-qpoH z=3QMJWZu=uL7s39a??0S@A#DAOnS#BEI2;i&hhOXpEBrq$0sZ}KHkp3?H!*o=y}H{ zEI2;i&XMgMpEBrq$0sZ}KHkn@?H!*o=y}H{EI2;i&N1yBpEBrq$0sZ}KHkm&?H!*o z=y}H{EI2;i&e7~0pEBrq$0sZ}KHkou>>Zyn=y}H{EX;_{+c}Q?jQGl+=V!zhMl<3s z9VBlT2kCR5K`8nhs4(O}0eKEI2uVLMC=3IGfIJ5pgrpxB6owoqAkTpYA?b6V!jJ<6 zP1JO>(tq|bp0Lk<*>=Rkvy^f^#r$bka#9B2@dJ_jlcIZ!~J0}Vpb z=Rk!a2MWk@pg~Cb9H=nlKnCIU~>Fu7>;^^^q z&mbi8u1*fp+dZkp(c|r&K}hCZogAdMds2&|$J;%Fkj%R}IY@8!q!veyw|fR5nRj(^ zklyY|Esh><_Y6WZ@9N|rz1@>q96jFd8H8ls)yYA6yC=0cdc55;2+6#wlY{iL<4Y}$ zo)@NBL>#1_9bapP+3^{OgUq|SILN%KlY`8=x;V(ZtBZroyE-|@J?9{|jf3=#PZ`dn zcYMNvlgPwPM!h+-D?Ht_R@hO9zcYMNv=Rkvy z^aF#!Ffa(nbD%*;`hh`V$bka#9B2@dJ_jlcIZ!~J0}Vpb=Rk!a2MWk@pg~Cb9H=nl zKmmCUGzdwb0~LlGC?L;)1|jKlpu&&?1>`xlUf`--tHNMWZu=u zL3+ClDBgl`&BQM zLC>#xDU4RVTslbJE)LS?K!Z^9IZ$E9fdcXzXb_TqU{Dwa1_5~vGzdvQFenT;P(Ypo z4MNiAK!qU(3dnPyK}h->s4(O}0eKEI2uYs<6^0xrAkTpYA?b6V!jJ<6P1JO>(tq|bp0Lk<*>=Rkvy^f^#r$bk&RLHZnM5R!RUCkN?spw!~%@j1{SB=fFL z4$|8_sm0Ob?VdqM=3Si}q_=xgi=)TeJ%flUf`--tHNMWZu=uL3+C< z_ZkQ39iK9sN$>cC1;@wRIljH)QwBZn_=E+=$J;r$z2j2`J@5F01;@wRIkLUuQwBZn z_=E+=$J;rqz2j2`J@5F01;@wRIi|hiQwBZn_=E+=$J;rez2j2`J@5F01;@wRIhwuW zQwBZn_=E+=$J;rSz2j2`J@5F0g>}w(JIAqK=Uf@|{5t2tXr1$=gXHbvAbk!r2t}U* z6^0xrAkTpYA?XJOg<)V2kmo>ykn{tC!jJ<6P1JO>(tq|bp0Lk<*> z=Rkvy^f^#r$bka#9B2@dJ_jlcIZ!~J0}Vpb=Rk!a2MWk@pg~Cb9H=nlKmmCUGzdwb z0~LlG$Uq#V&w&OZnRj(^kUj@WEsh?a0}Vnl@9N|rz1@>q96jFd8H8ls)yYA6yC=0c zdc55;2+6#wlY{hjPik@Wc)Mp1l6hAr2kGse)Z*yzcF!Or^R7+~(%U_$#nI#Ko4`Q-(9?9iOn^_;@?Vw|9KX zpywT*u;BQ3I|sLSe9EBb9iOn^_;@=2sjMkOKweInW>^eGXI@a-e`b2O5N=&w&a<4rCw>(&s>fkj%R}IY^%a zr4~nz&w&OZnRj(^klyY|Esh><_Y6WZ@9N|rz1@>q96jFd8H8ls)yYA6yC=0cdc55; z2+6#wlY{hjPik@Wc)Mp1l6hAr2kGse)Z*yzcF!Or^R7+~(%U_$#nI#Kohc-c-~RAL zX)SS(c~=()nRj(^ka<@Z2bp(uagcdeCkMH9S#`g0klyhr!(n^JCoDKV-p=vu9iKAj zdB-O#I6mIa!R;NNGU$27CoDKV-p-Nj9iKAjdB-O#I6mIaVeK8CGU$27CoDKV-p(=Y z9iKAjdB-O#I6mIa0qq^1GU$27CoDKV-pGU$27CyX55 z(n0cej^p1h81&xa9Hi76F1sk^?cyMP4m1cwp92+!94H{qfd(Pz2L^>$pz4pbO&pnyCF8ib_JfeJ$o6p-gYgOKz&P+`b{0`eSa5RyIzDhxSL zK%N5)Lel3zg&_wD$aA1UNctS8Fyuf1c@8uPNuL81h8)O19Hh^I1|gYub#jnC2TCoD z9-jjZLNf2_lUf`--tHNMWZu=uL3+C<)UX;eKxnU6J(yzIpFs!*DfMYyN!p!>{(}f7MW}Jjs=53!0zMqv( zYVq1MepWt(VOBl?9OJKW*Ulgg+)vY@Fig`TfMeW$w`&lR{<~d;;k#V{9OM2&4ug>N zA95%RA94ub824}X8HA*Nvrl1ovrhoWxPR1Z5R(2;ufp)CR{+PjzxQVllK$SG!f@|T z0LQpDg9ah#&7eXugKpJC>CGHIk1HuepW@fF(z?UVih3MDVYP6n#~~C}3s)Lf3m3wP zGOX}u6m1PFJSvSVJPP4B3TxXLg=$#aPH9}*P6&rmSk=oYRKu!XO5>_tLO7bjs$NE+ z8dmjE8rQZH!T}Z5wlfOVu(qAjxVD`Tj;XM=ol&TUwe6I~we5s(ScSFij6yZ6ZKpJ@ zZ6|~yE39p26slouJEd`LJ0@a3izpxp)glVWfZjBZEm_m1hyq#EricRapkcLeX)DK8 z5d|yGP(>7w4Gk+iiYmue5e2feO%Vm;M8n#4qRO#VM1ibsQ$zuo(Xhg!sB&x-Q6LN4 z6j4BaG_3F_svKKI6v!GkMHG-F4J$l~D#un41+vUd5e4K*!wQe0%CS{Mfvj{>L;)Go zu)?FLa%_ba9*rUj!U~T{;|h;V#GDpUAnvq?0Z{oce&(+Q; zHrPppIR3Dvhrnnj8E}3Lc2XfEgPjx@?IZ&p0D_%V2+3e41x7o`fTKUyNrjLMc2Z!p zlMFcYgPl|e$zUf1Mmx!X<389)g^&z(Qed=`3^?e6om2?PU?&AeJIR0}KG;cxkPLQG zV6>AAINXDsR0zpnCk2Lkiz5S$b$`RfASC?_7lm}g#W_@#lv|)7iyDP!$f8PP78Sw~ z6vhvuPz~dU(l~wyDYB?hsD|-FY0RQRiY#grsv(OijagJkkwuL{HDpnxF^dW*vZzt0 zhAgTyW>FzU7BvdhkVTcoEGnePqDG+_vZ&ISMTHbu)F@O#7F8OvsE{Iy8ii`eqDo^H zWg-r>hyrn_MHG-j4OvuFIkrL;HHx+tQ9uqgcuA?pu@$_eQK%MCKn^u{NvX%N6}+TT zs1{K`4mEg5smHMuyrfa67EwSBHF!y>$FUW>q*16AQ9uqgcuA?pu@$_eQK%MCKn^u{ zNvX%N6}+TTs1{K`4mEg5smHMuyrfa67EwSBHLMmc^*FY|YT-tq8deKe8dnQvA`Z2P z0&%EC6p%wLqCgyK5e4EQNd_GH!A>fKWU!M0qn%{HaUblYLP!QX zDKOee1|0OkPAY_Cu#*C#on*ifAMB(;NCrD8Fxp859PYtRDuiUPlLEu@yO9CMx__u) z5R(3(hC+I%;T$SUibD-q)F?zl7F8OvsE{Iy8ii^YKa|GtLr9TDjY2hyA4+2u6;fnT zqfiZ5RB6njLW(SE6sjSMDveoGNRdU2LN#Pjr7?>NDYB?hsD>=6G-gpDMHV#*)sRJ% z#w;qN$f8D}8nUR;m_>yYS=1<0Ll#vUvnUgBs3D6Qg=!H6gO`+g99zLl8ii^R1>{hJmy~)OTfs{jg=!H6gO`+g99zLl8ii^R1>{hJmy~)OTfs{jg=!H6 z{g~QRB6nj zLW(SE6slqTP#VV%Aw?E73e_-vD2-WENRdU2LN#Pjr7?>NDYB?hsD>=6G-gpDMHV#* z)sRJ%#w;qN$f8D}8nUR;m_>yYS=1<0Ll#vUv#5|FiyDP$$f8PP78Syg6|$&NsD>=6 zG-gpI;!r~tH44=t3do^`EGqRlwn7#)3e_SC$e{)=DfKwEf|oQ3)glVWp$0E0^*FYI zmoy61A_~Z%1}`b~IJSb9Gz!%s3do@bFDdmnwt|;53e_SC$e{)=DfKwEf|oQ3)glVW zp$0E0^*FYImoy61A_~Z%1}`b~IJSx?kf;1b6p%v=UQ$#!w!R_HKk@?VBfLY^y2HQc z^~9kTQ6LVrhyrq`MHGlbEuugiY7qtGP(P`8jrQo&<r+=2qF2QIsk`>%H3!_f zmlh1Idqrs7RF5pK-xKTYkcG|3NKVwZ;rz+-hunrADj3@Es?dh19z9L)dt$vE`gxa= zk$$D+WJN!=a+)FS*Cu~3 zv~H?LzyJK6SZ{}-Dkmd-wc{@z;)C1pih|(`y)v|6sz>)m{GM2Er-&+?p**Tqmsb>3 zx!Rg;D5UYm4S!Gt(eg*;@wOr-QpFpqKDEOk96OuF+iJMQb$611`Zfsii`QN{I(y$E z`ClI0PW6jm4_|)W=ZMN@B`U)QdkTCESM-ZuCue&*Sz0Pp&M1wNrVn44wrVRG;+GIbC4vlJyD?{x#;Sc9s{UX@Q zb<30HRA`Z%03hlV@l)5Uq!F=eoypGo%9 z=nSr}PKWDu^N!@CHAS$O_a`T9E<&?{#)COJz3c(cJ*EtH^OEFX8XfuouH27ZoaY=< z2K#w&y`Smg+%3^K=Z@#a$CSZ-UY_iy(V=^G@py#W@x17mGT6@#)ccu^XH2fJJDmUB zFM_@NPSOcxmEi%Uf*s5M>KDOIe!JYsbR_q`?hZ1h-HJlx^63jU0$kt$?P9M0cJRPu z##tx~e;#UUFBkc*=oNtc{e%3hFnnzOt&7%QJQAPCY31W3h42lR33jeKyr8JZdF0

    FT3{X>9tQ8bkMmjR9QN9`4%gQqlQI^A0J2+~+lh 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 z z=GV`OU+2uPpY?3XH)@8D`#5(oo#@E3xAe9)&Cgx$4w|i+SbqHRn~>tpogR~Z*okNiFcOajt%Y^t(T4G8u+YQld=^w1 zkIE%1sLPm$WkF?tG^bPiY%LTwN1$45p5GS^G4sF}PV9-T5VcWlz_doC5;8ZqK1L{2 zP2EH10B!JekFp2 z8Tz~pCIN^;&ks!j2lc)FwjT;5nUus+CT?_=R17YN&vCtctUf=rMs2)+&n3R&@AmD9 zuCR`mTitqZS?xubnMobb__?Fx5TmCmbp*<}wxA%W=GGY1MZ=wcem!I}x?Ppk6Z(g+4=jEEv~ZJ64`B>l6C>1~j{JuZ9t@)*c{g z!d>PuwbC1mu&BpqIcn85(*TH1S+li(2n^?3s$AM5ZtcD3;M%ypvbHiFtX{IZ|G+BF z2i)@1qIw6{BG^;?ZU-^a>ZuQJtBWtM+Ej8i|3bg%k_Fo)@IC*D#5OgCG_!Or;mLCM z@f4IY&Tu&eqn9i5dH*G*P48ve>Qm#%=R^@pXbl^PRd;>B6~QoEp;-YANn9JY#Dzw; zG0@v%hO=7;Cm~vfb8-U1q`8|jR2Ky8;BClOw}orYRb;#8nXWma-e8!WzHbsnZA8+} zDh*I-7k06Xv>UD!35?oD!nb9cLCzxu=tLy;&os~Vc#A@`Hzya(x3t0WyY~dtMyKC> z{O}*^H)mjT<>Jx_+^ozE1$*XPa3jsE%#FyjmewD;`eh?=!$#ctbsr|dOL>mrF3NDj zF-Xa9+qj`<`j5BZMw(ff2q|)3_z+|TZbVRP7G(Xk0U-BT#VzCmPwc5TY0_sG@Lz@rTd1DqjMw_~lz-WBCEsMK8U4eD4ux{nX1E86?~ERxge zy(O%F72@Z5p=7);&!dTRSY-zb-U;Op#>ryoXi_*OkEOe2n6Z=fjHEt_?&PqP*dY%k z<4RxGTYK#hTI+a#PgDaLupW^km5YbxNOPEmyT&6K&LiB^wc}71q-Ax(Oh_A7x^-+F zA_e<@`+kDPUcpY!xLWDr0Tudd1y2&WZWNQN$S0j7mrd!3z` z4Qz{Fo+Ki3OlxZc7b%_Drev>g3w|g?Gvz+!X}a&KoiaV`__UvPa2f`<9cfCRcC=j0 z@G|{{J`d~RBzO@QvYqyv)a#G7;%o0b8q$`A1CWzNsc#}JgPUr}qPPK3tRzEq zGI3qH7-(3cWjGFz{Uu52AP$=aEpZL0_aRQvZ3GG0@-pp-u_Jg+?e<3JGzL9>wThE_ zeKY;THSwfUm<>Z;xB1ztj_LSlxQqa@@W;hvq|9}*4j_lf`c^BI$6M=2{)X2x@xh`U zO6-QYSw{v%+gl@C^LF!9;OJ|M?$;V^#}v7N^Iw8I+xOrUMDzKj2VtU+7Kx3tyO~|1 zI}@jR9~+cg8|`&iyeA1Iq;^jd%Ef zE~ZA;`zA??t%b#e>R636VKOe?oM8rylNSfDg`%SBjdo>wqmB;_qJUMjh1*Iv>Ck!u zf8ZpzW`GGZ_KX@^H*CU1p#NJr>>{ahm;YbNRq?j5DR;@CveEOj33^s5Z5?K%gnnF zaPJz9Mz2pJ7Cho#{QhUaqrbX;*S?*Y$GRO<4gd=SX!)+q0i?z5eLF7f?_WKzV};IX zZ=D8`G7@-HT5Dz3o{LuYui_-tZRBv7$}Wxgo?jEt*QmaPmVuO%jN{HFG0G9V;M9?wMEaQ*gP0- zZqUwryH}|ruGq~*3_%wuKI0eLmatqwauj#+W`3>X*MB&)&h+31s8Lp*bg5Ucmn{jr%46|D)f`Vch#Y9AVO|QJ;y>sSLgY zZu*fznsXBcUG^O*1*K7wa6_EqKFE0Q6b+=~uZhn4qYu$bmXN+XYYJMrZsQcR^xT}E zJ5JI>Rr&X(V2vIM`<*FRqlLnExhofvWtj4r=ub?54N z#dG{5VvH63pt2ns)oLI_V2qm^fkX+5O9$4*>i7+Ji9%X=?@mKwmn=-Vx&4;*Pf@w~ zwF^wS7y5Y+=7(b)+G6#*oj)R1L=zy>l|T2o3kc_1KxRO<)FZUo5#Xon^rPA0!;5?F z@O?}Z)3FM8K>}B1A^og8FkEakM|dF0ohS7AIGUvOkvfMNLAVZ$+uElrz%#%o5%3H! z$^|?FjM4$SfkNwseb2U6-j-9B_ZJg|qqo5DO3&JyvU~a30Kk+_D2d>8*PlY$7Tj zdn>MEcoOasAzL1D%kW~g?Kn%Oh-_Nr+*1^DB(+?**$29Sr3zABM0gsyrkf*>DD3EC z;aTg{VUn9u2?BzYRUijWI9}ck!jtkN3XCJgH~6~j*OZ}hn5+6#qNSUW?wJwA4tCG?-ZN$Ncz5rpgdOsp z;3req;OSH-1h0!3nVVwSUu$(t$K0@k_;EP6GUyDK@cuhmD2^VHGO)XE?<)2j-8m(} zMi>`mim6;_;KHLJW?^j2GWAZHKkz9(c|m{^F&C6HK$f4_150DNB!LDvSn7{(XV7(h389NZ7R286RUjNYp_zC3NG^d>rqUe3 zr(Nfd0hM*Q(KvzL+JqFK6X>-P&)`V>bzp%$wAKnd+>ahHpjw*8A%~D4IaJHI=j?i# zvOu*AXWw@J(GRFF?s-`vEW64tn*7~{E*hI#@38#N0m7|ze(Wcm9)cy0Tk+t7?wjO6 zABB-e+a~glObo2{D$W3n8oszG@ojYIdJA{VyF++1yb~x;*R>CX%*hv$94bX?n`d(cdt6W6jvJ*hM z6p6+`w_u%&!KxFDNtQ(u=JPO2nTS= zuoyhj)gvs6b^bessQ3YbB`;GqdN<=4T0h+|6zo>e*p2{pM}qYf%TZl9unJ>DaHJ%a z5#QtHHk^bl=>f)@Bn?^F28h*j8^WU8Ag4!TVSsc%Zr_&|s?|DB^09eh84oxoRUz-- zfxxukn7Ms1P3jM8H~>nP!h$eYY5v4z6$0LK%7*iRvWBG(0z`!0dJ3Hpk!T6M-8%@ck2k z8$IxS6M>sN@Vyg(XL;az{8Av{p3*vxeCA}NtC|BiAau)%6i-$;&zOv4we$4JNLD>h zn~Y@j^VG>mRzXjhjAS)*^<*Tgq9?NvYlx_M#QTr2nT$}UcALLnG2%pQGB?I*8GgO5 zVRf50I}he>deg1t5NN;LbH3+UhRL&p6a9=Mg|qC~BSHFD$AW3LszKN;a;vTwW9A%4 zm*@uQF(x8g_2CAl`Z%iov0u(8TBm|5_-a#J)7guDirySlws89U{eU&rce<;1ZiX?a z_+efO--JC9H(bWDHzD?1l7;9^JUL@R@+LgJ;%--I!RPzZH^T(XY#QT}x*5whw<26p7vuH)6F1{yiCj3{R

    b0|mvJ?%jUs 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 u6Cv=H@&!7_{!Ghem_e&3iav(7It1+h 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 D;H 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 b&{4`W+H<)W=1K!*QFB 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 literal 0 HcmV?d00001 diff --git a/MDK-ARM/DveC/buzzer_pwm.d b/MDK-ARM/DveC/buzzer_pwm.d new file mode 100644 index 0000000..c076833 --- /dev/null +++ b/MDK-ARM/DveC/buzzer_pwm.d @@ -0,0 +1,35 @@ +dvec/buzzer_pwm.o: ..\User\bsp\buzzer_pwm.c ..\User\bsp\buzzer_pwm.h \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\stdint.h ..\Core\Inc\tim.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\stm32f407xx.h \ + ..\Drivers\CMSIS\Include\core_cm4.h \ + ..\Drivers\CMSIS\Include\cmsis_version.h \ + ..\Drivers\CMSIS\Include\cmsis_compiler.h \ + ..\Drivers\CMSIS\Include\cmsis_armclang.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 \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\stddef.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_i2c.h \ + ..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.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_spi.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 \ + ..\User\bsp\bsp.h ..\Core\Inc\main.h diff --git a/MDK-ARM/DveC/buzzer_pwm.o b/MDK-ARM/DveC/buzzer_pwm.o new file mode 100644 index 0000000000000000000000000000000000000000..3a77a24dee739659787d7a33acf8fe92f4b7613f GIT binary patch literal 14140 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

    fr?lT3IM^&xpDjQqwxEP`IX}K6$&*QUaTqG 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

    ML{ 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

    KQ72J> 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⋙Oi<@?IBb$W=W{q>l0Fx5 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

    m59d>D%mo?*DVI-i*cStgpi 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 literal 0 HcmV?d00001 diff --git a/MDK-ARM/DveC/config.crf b/MDK-ARM/DveC/config.crf new file mode 100644 index 0000000000000000000000000000000000000000..3ff275a183b5af724c3f8454d687f5dc69a1137c GIT binary patch literal 18 Wcmcb?!N9=8$N&VgH&}p71|`Yd3TNUgXmX%07qX)VF`4@jDCLHZ_& zXlamiTPkalz6WB1$+|^gOT(>PHbY8NBABw{v+Dtoh$gih+h?S zzBVIgCF`aCd1fqSl;6s}{B7(z%X$p?9FcK8;|NputL)>bQPO_nsi4BXhg=ZmzAka6 QaQ;bLP;#Hoc|V@@3t|gB>i_@% literal 0 HcmV?d00001 diff --git a/MDK-ARM/DveC/croutine.crf b/MDK-ARM/DveC/croutine.crf new file mode 100644 index 0000000000000000000000000000000000000000..919064d5977bb185f4611b611658209f19943c1c GIT binary patch literal 40868 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 literal 0 HcmV?d00001 diff --git a/MDK-ARM/DveC/croutine.d b/MDK-ARM/DveC/croutine.d new file mode 100644 index 0000000..9c5415a --- /dev/null +++ b/MDK-ARM/DveC/croutine.d @@ -0,0 +1,13 @@ +dvec/croutine.o: ..\Middlewares\Third_Party\FreeRTOS\Source\croutine.c \ + ..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\stddef.h \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\stdint.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\RVDS\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/MDK-ARM/DveC/croutine.o b/MDK-ARM/DveC/croutine.o new file mode 100644 index 0000000000000000000000000000000000000000..cbbdd9bcd690d3d022a451fbef127ca38425ac7b GIT binary patch literal 584 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�LC>Y+TNW2&{odB((4 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

      pNS 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ÿ$E$Bv52T=Sv{BI)>%BO6F*yrU_ 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

      DQomrA>>*h@N{T3ao-@A9Xo_88{@O8f(HWP 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 literal 0 HcmV?d00001 diff --git a/MDK-ARM/DveC/easy_control.d b/MDK-ARM/DveC/easy_control.d new file mode 100644 index 0000000..164d702 --- /dev/null +++ b/MDK-ARM/DveC/easy_control.d @@ -0,0 +1,41 @@ +dvec/easy_control.o: ..\User\module\easy_control.c \ + ..\User\module\easy_control.h ..\User\device\ps2.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\stm32f407xx.h \ + ..\Drivers\CMSIS\Include\core_cm4.h \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\stdint.h \ + ..\Drivers\CMSIS\Include\cmsis_version.h \ + ..\Drivers\CMSIS\Include\cmsis_compiler.h \ + ..\Drivers\CMSIS\Include\cmsis_armclang.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 \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\stddef.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_i2c.h \ + ..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.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_spi.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 \ + ..\User\component\pid.h ..\User\component\filter.h \ + ..\User\component\user_math.h \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\float.h \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\math.h \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\stdbool.h ..\User\bsp\pwm.h \ + ..\User\bsp\bsp.h diff --git a/MDK-ARM/DveC/easy_control.o b/MDK-ARM/DveC/easy_control.o new file mode 100644 index 0000000000000000000000000000000000000000..6b9475bf59c0689ae4d4bd7adc5ecb71ffeb3fc6 GIT binary patch literal 17476 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 HI3NE9kilGA literal 0 HcmV?d00001 diff --git a/MDK-ARM/DveC/event_groups.crf b/MDK-ARM/DveC/event_groups.crf new file mode 100644 index 0000000000000000000000000000000000000000..0d5f0fd05c8d6449a7f31b3e68f8e884fbb21008 GIT binary patch literal 55218 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 ro=tdf#s{G7dCjR$5*7N@Xqub3M literal 0 HcmV?d00001 diff --git a/MDK-ARM/DveC/filter.d b/MDK-ARM/DveC/filter.d new file mode 100644 index 0000000..fa5b12d --- /dev/null +++ b/MDK-ARM/DveC/filter.d @@ -0,0 +1,7 @@ +dvec/filter.o: ..\User\component\filter.c \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\stddef.h \ + ..\User\component\filter.h ..\User\component\user_math.h \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\float.h \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\math.h \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\stdbool.h \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\stdint.h diff --git a/MDK-ARM/DveC/filter.o b/MDK-ARM/DveC/filter.o new file mode 100644 index 0000000000000000000000000000000000000000..cf2ca7ae147d3ba0b55b16b5ba68a96e9c0b9e33 GIT binary patch literal 9952 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 literal 0 HcmV?d00001 diff --git a/MDK-ARM/DveC/fixed_height.crf b/MDK-ARM/DveC/fixed_height.crf new file mode 100644 index 0000000000000000000000000000000000000000..ba092b66fc3cace5333397f4ed271274f36ef726 GIT binary patch literal 851953 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 z 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

        1FJW(S6M*V^56kYi1dHV{~7$%Gej9`r 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∾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 E2Os;n2><{9 literal 0 HcmV?d00001 diff --git a/MDK-ARM/DveC/dwt.d b/MDK-ARM/DveC/dwt.d new file mode 100644 index 0000000..ba3250d --- /dev/null +++ b/MDK-ARM/DveC/dwt.d @@ -0,0 +1,34 @@ +dvec/dwt.o: ..\User\bsp\dwt.c ..\User\bsp\dwt.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\stm32f407xx.h \ + ..\Drivers\CMSIS\Include\core_cm4.h \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\stdint.h \ + ..\Drivers\CMSIS\Include\cmsis_version.h \ + ..\Drivers\CMSIS\Include\cmsis_compiler.h \ + ..\Drivers\CMSIS\Include\cmsis_armclang.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 \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\stddef.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_i2c.h \ + ..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.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_spi.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 diff --git a/MDK-ARM/DveC/dwt.o b/MDK-ARM/DveC/dwt.o new file mode 100644 index 0000000000000000000000000000000000000000..5223992e08a65908218f5f6d185e6a041320e79e GIT binary patch literal 10828 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

      190Ae2W8kl02d5+mks*|;GzL~s9PLJqo-i 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/Y!mZ9<#Cx38>(GW3>OP0}I)4`LbN&z9?yR1P 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�lRq?-l9a=gM_>2q{St|5mv`Y7}|Kt17 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 literal 0 HcmV?d00001 diff --git a/MDK-ARM/DveC/delay.d b/MDK-ARM/DveC/delay.d new file mode 100644 index 0000000..e2873f6 --- /dev/null +++ b/MDK-ARM/DveC/delay.d @@ -0,0 +1,45 @@ +dvec/delay.o: ..\User\bsp\delay.c ..\User\bsp\delay.h \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\stdint.h ..\User\bsp\bsp.h \ + ..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os.h \ + ..\Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\stddef.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\RVDS\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\CMSIS_RTOS_V2\cmsis_os2.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\stm32f407xx.h \ + ..\Drivers\CMSIS\Include\core_cm4.h \ + ..\Drivers\CMSIS\Include\cmsis_version.h \ + ..\Drivers\CMSIS\Include\cmsis_compiler.h \ + ..\Drivers\CMSIS\Include\cmsis_armclang.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_i2c.h \ + ..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.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_spi.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 diff --git a/MDK-ARM/DveC/delay.o b/MDK-ARM/DveC/delay.o new file mode 100644 index 0000000000000000000000000000000000000000..4abb4c36a15e3255c6e2efc0eee0d4811b2a8e02 GIT binary patch literal 6244 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ᑓ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 literal 0 HcmV?d00001 diff --git a/MDK-ARM/DveC/dma.d b/MDK-ARM/DveC/dma.d new file mode 100644 index 0000000..d6efe04 --- /dev/null +++ b/MDK-ARM/DveC/dma.d @@ -0,0 +1,34 @@ +dvec/dma.o: ..\Core\Src\dma.c ..\Core\Inc\dma.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\stm32f407xx.h \ + ..\Drivers\CMSIS\Include\core_cm4.h \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\stdint.h \ + ..\Drivers\CMSIS\Include\cmsis_version.h \ + ..\Drivers\CMSIS\Include\cmsis_compiler.h \ + ..\Drivers\CMSIS\Include\cmsis_armclang.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 \ + D:\cangming\ARM\ARMCLANG\Bin\..\include\stddef.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_i2c.h \ + ..\Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_i2c_ex.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_spi.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 diff --git a/MDK-ARM/DveC/dma.o b/MDK-ARM/DveC/dma.o new file mode 100644 index 0000000000000000000000000000000000000000..2f5c7e31930b8ec990dc80b8239ff652731781be GIT binary patch literal 6096 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
      6iMTHbu)F@O#7F8OvsE{Iy z8ii`eqDo^H6;fnTqfiZ5RB6njLW(SE6sjSMDveoGNRdU2LN#Pjr7?>NDYB?hsD>=6 zG-gpD99bcY8ii`eqDo^HWg-qWWKp9~Euw%NYRIBek7FxjQKL{TqJSJ~@RCxGV=H(` zqfjlPfE;S@l2VUjD|ktxP%WZ>9BS~AQjcRRcuAvBEuw%NYVeX$k7Fx%Nuy9LqJSJ~ z@RCxGV=H(`qfjlPfE;S@l2VUjD|ktxP%WZ>9BS~AQjcS+hyr=aUqk^p)ZisWm1FBG z^86z&pg!6=RINMwdtOf*Y7qtEP>U!ahgw8|IMgBv#Gw{ZKo0ezo7ZTMPhUB6jQ`;C ztuM&{uF+TAa4Y$A>lUZA#_*3f+)g%rA~v2Q5&RcIzmp?Kz2$~amRcX%)LMMqLSmQmQTb9jDr<D}_Y z&Wc_U_owdqQ`a4G>%OO8Xx+<0>!x~Sas8fHZ-*>wPDXN~z6}>nT{z-4{6N9bhF63( zO!eq#g5MMC?a+KX#g)@{#)#}QMqAFKg(+!0*-niips~}qbm^|KAPG^av~>?9{`H66@KPudTjPzJmC@#J9WyLX%v=+N7paX&QN zDW5LRD^4hb{rpU_pGIeJeRVoqx0|;mC#@-hy}UO$X>$>p6*L~q@tI{0_^uPmU^m~L z989A_AHbFSv5WJaCzQc{UR>{Ix;XbtG|s!@dGQHlu%DMD`)PFOo?Sd1;dVSPI-v~q z^L_PxrsEltE9?&E|LYgQUVc021hdNUkW#^p<$w2!U?;y-?qoWW2j6ff8Pje

  • k56P@ZvCaf?8VmKC!Bq) z^&ga)eWUdw5BUNVRK8~2WJ6d_LaOga++(H61Me%* zsdDdxi-((t3Wv-UWv4Syi>N@!gAs}cBNEfd;bKD%N#4P&xeqUW0BnE$T$=l@0yS%vdb2`zXW7CmzsS+C(w*y>#pec6|E z)0Zi6_cV^b+{F8u-Aqk-7mwnl=R0(OKmX}3OYJ=1nuP&@Poi7!7pwza<*Ud#h!Km= zH-*}rW3##ap2PQx&9rd)J?A&;?-R^%$Rbd34hrX_TmPY{Ir-LqL`F_e>pwC(r#Jp# zRBdj*kHd2Y5uxL=x&5AVke83!?>R?We@QT>()xRca|T)efvGtsTK}OLIj35`+{9GsW~rNKNsD7*DyHcYu{a{z?7-O zCQm(Q($FbW$Cs8=mlYi_eR_O~@2H96Crz9%a>CSu+x~5ERa*&;88>or+dlE)K5b8! zIC0#;ZHG-BKWxhQwx{+UQ9W{4X;IPXzM~I5?Wn&Wc}&$wrwux1*ofg1CruqW`Lv^_ zjXdhKs-r7Xk0?{K7|5J($7a z;!%mJBm%RGaNy{XXPz^vYT|@Mio|l-5e^I-Ibp<*6BF?g*H_|)%$Rb*nBiw75+w3S zNjQ3Bb(4`uByWbH^_tHdD_;S#UXYoQMyXhCQ^PfziXp4IMGEIzAf0ksLjK*#4qTEhf9?V|c@dO&B$P%!E;= zfe!L_ROR3L_dD&#F%wRU$4?vMwtw1`sUyZrm`auGR*ms;G)D*g(}CNO%2k$MH;)wR zP=)rF>Xc)ha9bU63bnrq8VcNW;Lz^mO7-hlB+F5g<0@98{mxkEmr0eHR6$Z5^+{D+ zBn@>+%Ct{IrmFaV%e4(#KXt%=%Vp}?fY9`x$7ZrU|L3y3{^zp2OSVv?!YNlPFD%#E zQ6C_z{#&vV4%}jp7Y0YVkXjj=J>1 za!wQCO$z;J3KcqP0fqdIy2u~Lp&!|f`q@{l{ZAl0nTS+J{qC#Lp?*4*$?mUHkJJ9j zCUsrRrR`9Jx_+Bw>bg|w`eBx-YmVR6B@xuM(7)fhP6qdt?*_p9XP4rCUskdXeWNCg znb>4$8H#IG$zNL=EGAhBZF%`jrTKN+$ZoA18E8`dbFx)%m{XcbB9eHIi>J~(PJi$7&;J=G^6m? z$s6JP|%_!Fal~Qg9m?`EvfMRb^EGtr>1ASz!Zk$z1rjPygGP{*JVCGy!%FQ&H zLLYJ`PGO;}1CgviM`qu|jy{}N)IP+9k9Mkq%2C%}SRM?hPnn-Wr(7bInuyPc(D^DB zSCP2RRny9KyZ$=AxLD`*(|@bdM}SxP^U;>Fg>USgSMF>cHH=6;(l{*37C7@?@~O z)?eQMh_;8&``ff%7erLFR(C4YZHx5*LQ?wI=z?;GO`xzLclcm(uO+uYAlpLV!%|}B z8VKYCy4qM-M(R=}d2^gvP`)Cl0Puse1U5Wy*0!PA0;%?D<(CW*b?+tOse|SAE%UG zJ?l3S>e^X^W!f9MGfC!|*QuoEff05*Gmjwl3){)JFOX_N>YhM76Lls1YXL3fYaHs* znenDAT@z@8cqa(FUjl+ElBYvej=B?)lJBUubPZF}Jnq!Gg|l^gJ!L&Q>I4>BKz-wbdi`<%i_YPZ zmMuE>ESqv<{ zqD+ShrJ3UePs8nW`x4y}uC7?Og%aw{$APeM-4;sHVuX$q=@vb8=l;5tq_u#=v~jlT zj)g)OYoUwa_J@qCW0BeP4B0!nSP+>--#o%|E;`KfxXsn{ay)0~=HYvEn*q9Wq3%c< z?VKu|yG-Yx!(H95$TEaz{1)&>RLuo-x|^DVHMr2+7S3SUhjPvTxO5I0S3gtwqpl-| zo1#7^rZaR_l>_@)eKY`Qdpw}btd<_X#%d)0{p9x#Y-sTsp$wPMV+Zi~RX5=M9MluK za$O+qgiq2w^|>2f8Yp+-0y{_DaiOep#TyLuX3lJQi%ZK>;#$wqEvj@Ur$)D+*Uo6& zdX$cBqk+^$%ia*f)wG=gUl(v{8+v6@I1~6cDbJGPk7Ot1=ZQSfaIDU*)S;D*TFrok zhA1#8RZV6CD>_RDCphZXnbk6g_f(CJSLzPzYDKzNr7m8fd-T)Ag}O(DEX`A!t!~zl(@-!B9W{C4Ig`AYv(FiM&PcDGk>e+gp6vRo;rb>|oj7GEN{NZ%h?5RX zoIG;q@bP7YIOKA>gGyrfI0Q^L&KKlq(?DNzQ|f7Wpmeq}^(`O82(leseLf3HHG?i8 z7&^7=_BCw5d^V5`Y>aMoSkL1iUWZ9h4;+HGo_1D=%TFu zG(;734)kCb>!0pk6Nu|jkyhgy>I!zIuDj`mig1Ee*^pp{0{iE}VTsqs*QSx28l9#l zLLwk$Db6@L9jz9k6IYJ~;@+=EBoafdvsLX?ZhsfdEO*q#3k(Oa4K^=LjTI>pk24lG z-9a8vk3&Nl$TkR>y8VK3JRaYgsP}DK?>k<-w?RW8mN&8Gq`3^FTj^XK9VH3Z!+d5s z>Z?Evt?=zKf`I00T9Dw?7c>I2fx+*#fk(XtUZjDvLaheqv>r00qCIGs(n}y=2)XWt zlIUeE{FOnd=L{fo)#K+g`VV2Lh;`JXVfIy6=N;#jON4qgP)#_h9=RYsN{2?%vnc#t zWRz}Jq(hZGwHg>qSN8>6KyDHkdiz15!7J%TL1cCzLnSqy)X9I6niH9A_-a(QO-Hbl z#B36q@2}*;Bu1h2%F=pi@diOi4rg^{L`0L6o@NlcP5(00l^|crc%50oAmX}%GnU_S z`ZZQJD|6IJpb4sPW6SHbKo^o@NSs}#!ci+`#?=QZF25ptex-oeHRML({9S<$HTX?@ zogQD@%M8?~7SG(m=Bz%ZI>ZQlSX|whD6XS}9CbOtbYW@Z&K8C^7&*YLs-IhGkP{Dt zo6P7R3@js3V#f4v`g#dOHEEiDv_;l? zMV|hzMHU))C3{X%@%}6XLftJF!#!7U`Xtz%xbuN7Z^-TtK zmrh27yKRjNyuR&~8pr80knY9vl5?X+VXDU(g!{?oLVDqaVE+^6)d<8k(t28@ZZ`@7 zSIrU_tRFjPfl;F^b03G@iF)@y)1{uDnH8+LOeS0kqSeu*^k~)+!C) z{)<72j?O@}t&rYtZ4Zxe*Z1MxT1n}q)mb`ptfS`6NZvOu4taoj2x(4c;#D7G`9&5N zdt?azr${|a#iiKPwn5S+~*`+$GyY5(G$a){j*6Jds zKZGx?9++MuUDzqzSu&kjbkx=ml4Oyt28h{)!bK4w(nMdDTciuZf72<2TFrN}Bba^? ziZ_7N?E1^;bZdxrs8aijMQ1Ebgx@JjA{Aee%~Iv3(L)JQTn*O-QA`=`sLSXLJ^Klm zG~FA1w$NXLnns}ioD`B1hg29gLscC0{kgKb)!cBoQy0J>tr3@jA&EdUqHaT3B<0`p zGh<&vhM2J>;aZ)7gsna!3@~b`0Q6GZ&rRM`Zs$zic7LJQ{h!?KH>dlr(gC{vU^uz^ z58LK1@|vHAWT~DKDo81sQ}>-~kY{}uSsX>z+H*yuS5KRsgwVbz6@j9VOS0SFB*fWl zTlo;BlnnA#Y2{|OmAzq>uqdLN6|z?1x@TOMvCL}0kN&z3SaE~fa zY#_~{+{rA{ZvdlJ*rp49l6puA~@B*3DR9G_F{$-j0=w&Hj+V}Vw(iQkcQ&K{c zyC}Fgr4CTSXvIlMofXFB1xE)OgC= zfCiYYV^@mNS}dMcoiwjMr+CP_hPTFKUZ1DGO_3i`$F|s%55vmC#rd1eFheLU=})1~ zt^g6xRz<6HwyT+m$8}Q*@zOa4{+~yfx9iTK$B^1cjUhIyHYo5q(Oj1uD={00q4&>6 z5EF`YerZ36e2_>XD@4Nj=NIY}xL0*vwJuOZ9WV+yo2YqfB$=4(uswef?WPQPeGo8R zDhnMdDzekAsb=NwiQr#AJdpi0B9KM*Z`PnB?3!9mZqxg5UUarwHV|t<9j=LbkXmuR zyKr_&dmqvU?L92*z2LTYllb4mPkXmX&3%w(uf3r76>;mP`4cJsP$7#-=B&m(~oCt2fsPb?cl#O9eluT_yg(G3jC0=*XWck zMREp7iBcczQ`IMQM8po4g?a8g!QD*tnAEp;Ds<3M-?4i%A`(m_dqEuWL#V_hQw?GI zBTD{@X_HC52qKYIp<5KOVPulE1q{Q^DNw5gsRkH(rqn`l)MbRyXFGKuO9h9PQ_z#K zak^PPonm&O6@)Chu&WaZ{O?A8me{_{UV{w=OBmVY`6(XJdBmvcQq>$bofPDgr>B^y zd!3%8sB_C9?T=0|c(92Wb%~?yAqdj0m!qO5$jmUFFsPH_R58jmQ{w8W)H;5RUf^}f zMiE7YNo(^>w=ZU^etU*XPVNvcXN6nqhf;JoegL~2zbGoDh3jeIQ(Cy*ZDE&WTTBbP zq|44RMjyd`>qR9s`mJfym9U=h8r?|MM#@Gyqwe1UWuCJidHbR?57!?y1>s{TD5@F= z*<^!53)7G@O2--;B1-)$Eg2ne;5@VehZfCnap+r9Q7_1V8p1|g)d-3DgHdc^-oA4r zJB-ZtjgHzf*=*U5rvb5NX&!C%6T%g*Cmyl%Ub-S;DHb{GlcLas&q*uS%?wZY^yE63 zxaWw-g`pn{*>S6TR;qiP?9_B0sUU6=ZQPuO!uih0?jm@^5k{3|y9s^=KJ5dF5L!Wh zLJ}}OQGKVe(3Vf8?p@+rOgcF9NgANL0Y6>&jK0f&WQMN=bUV^a4^y^4Ca$1AWZx}) zyL__2t6$SDR@He$^T3_j<_mXV2O6PA!O)t379%W2S{MdhrvnRC{@hvF;|G zUR;S^KqbA{bv9dUtd6y|o^6$MR@5yqp;XgkS$s-q6GQ2D&MucE`IQ=PAeYE!Nw{}g zOcq}*yeBi_mVPjntS@=k%alr{jc%qV_Q~|5$>d`3u5;a`^G~=B!D4ped+7P=F#+*@ zu=q_=w$v=UcfGQ=p%jvn#UCe2U2W7AY2ian#GENYXtmCtHl*r=JzL~LZZ9xFpay*Ng|ld?oczs}e9SBP5`%G9)|Zpa%9@wnu(F6!|4dI_ zS<84|$?&O5&UJ;SZ>9CODb6e{&R~{yO|0g$M%_VGiie_*og{{J@enc1N_A#;-M+u> z$)aJ4FLu@;2(n(Bo9yC4c3L;dETp&6Nf@K~EUQ{EiB{f9M>-v)Q|24wr%8m0?di2B ziUf&!BM9o|qjZ}&lDwGY)*u{ha`L1ucXR)c9xoNpWI=N)b+Z8oog!64=jiOwQflu+ z!&Wd3IU}OiVfKaZC$fI%OVSFxCZmB*yKx#6Mtu$I6q3{OwBGxw5pOZsVI4P5gqH&v zw2=c3XxY-5X@Ub$^#_%JVCfYMDi@N}3P5Fg2esFqEqU_5jqss5YmRR2o-f~WwoCYZ-bB@kq1DuO`8jZ%8sM(n;oWcq^vUftcnwweYyk9k^ zGLX@PQQE@zGodf3#X8!9L;oc3+>q&#pIC2idf`U7%7b#||0~_yhnN(9LLHD2DD!=#556@($N5z`7KQvz)rUT zofv=%_YFz)?ltvlH5llPkE=P&1k(f+_7TJ80Wbs_RJ7xhxS_XT29;`y4ovKk@~T*| z%!A08#fay1>eKO}R#rDQix=uxl`LdqQ6l&mL%Sg15WjK|a~7;6-MF_|BZ763nA|MI zO0Z=lZ`taEeTZmar%KZ8Bo&afHIWn}=|1e4)e^{eJaUWnyZV8CDRR1a{{D;>{uif< zf4<274JHl7=B&}Nns@$Y%$6Ds?HU^}an?6(%oMS{WW0av)R1GjriYG=Py7CCRj#1~ zRW&_0bd4K6IiA`1*qAn9o=^$fay5r+AW6O0_+5b(HYlbI)!+;K{VZAA9O>nWJzS0x zo+^jTt!gnhz#Od_bDCFu^=Mfx@Myc(Y0WI8fxFQH1tR@X7QyFYJ+W2iZPoe9*f%&0 z;k#Cx6^i{qrkEeGvmtAu%;Ve6)f`7V>Za+Q5>x6c6Kjl{QMKnp6s8eHV02T`;9;BG^SLfa`6h>-7k@;T^t z!1+<^}HBbsg;dQicCj1+T*}zf(~+e zqt?h-1`-QLjf(Ay6D;Y@>w#(=q{g|XqOUxQt&9Dx@xdQrtHjct-^AkSB)RR1C4~Vk z`jt8c*jwjy*IlpTYMt<=mMa)pusvQ5!-8c~}~6L$m} znU9%#T(T5EG#cWICg+3u`lDiH8gTy*Xu8JIVdJ1m#^I0zm7}rN|;U)m&p0;z8^lgu{S(VV`14DV7(x zS*H!qh1YX70E*6Y+2BNH9w3WCI^K<6V0FmisH2pq3%#VyCZ=DX*s_VtlPkpNEVNP|R1~NBL zhv^7Z77ZZw;ZkpgoN^en?hf-7hI^Auxmc$wxOT=Dgmiq4xQe;YTBlx(sMeJge1}r( ze|qUtW{U+_HI+bPiOYo`${F%lcJtYOBH$+AQESnS8E zvr!roeK>%M*QoC~A7x?}F?qqQu%0mIVn`+ir$XRX%2LLX^5rIrd6M+4o@XXfK%r_1 z)T!B=Au*;Up&BtC&}=8Y&|j*N2JS73bxsf68Pi}?J1U?s?GU<21nSRbR+5(FP7HgFFEpg^QbJ7Y9oNdQ0{6g*(2Y>7vz zv9%Zi$S{GyV8PVKT*$qxYq0L(c=2uRE|@*}!b%O_A1n3$w$;^N;jaGAti-LwCi}eb zTvITiYT&ZqbUa2(teXDh^_YY;X(J}7DfdN)*Jqf#RmU)SFF;*XWGw2Y^C73N1##{L z9oe0PmdHjgf+ABzBm`tMA)V{03>g6$DWHJIH}>b}fZpY$kl2f1FDzrSGrCWfef? zWfe4MO)b;SIhe1&?j-D}JkbNDuq*_Yd3Z&LE@FL*fuVssvQP&=9a~|x`i^i?b#d9o z!>0)sD}=Pf=tOeN8iIm}l5sD(1bB{L!a}v9o-L;I%$0b`BA3UhLURy$BlDPpb-*Mp4HsP`St-vYNZV9-}ZjQ!r$ew`lS#tPLK zZYUSBCiZ4|V}&4sCie|9@!MMqi~G@;ZmmmOHO9pPA+4WNlY`-Zop6mY)RvUY;kp>jYYBYQMyJ$DSj$bn4mCWC>6Kl9iuqB-xin~r?44De&pkb%f z7Ba>hwJHT6U)>gowwT$xM;)bUUT zv=&~^Xgt<&^2Y={#WAIa9)C;|Obn`vQ@C>jp0iSN=ddJ^CS^u%bZ7Lvq!~49ZYQ-W zvGQ3&t*~G93`UH~gOD>6d|4Ok99|VE)WPMt8*HyStj^HkxhNJD!MjsfQ51#WWsh$m zGZaJr2$kqqt`DIes6l2OHX#GCDOdIG(Vb+?QYVQ@rrJF)OsoZt{OC@9o!VdLato-) zy@F?U9MfH{dXo+xWO}jv9O*@>x;cXCGIzC!`}!P#g;LjYcgdWAC+eQV`4K}kxgIwq zm3lTp|9`|1RxLqIPOBX^=&-pEwG9MjB3Gr>%KdfK;DsBuMg=%JvI6eMi5t*(KQs}ztFXSxncIp*)ZzhC?g1{ z=Cyd)7ZE$mp@4w;MWGXS=L!9j8%UXKL4LK71)iynWOGp6iBl(vimrRy3AAq(XEAMw zSC?;*RqoB}%VXR*tj%pqSq%cLMu(=j!2o?|CxV5eIte3jI+In&#?sX(ORQ4a3sI(= z>Mm2JD9-7M2+e9MM?*ma|AEkfw>dcxjQK4!nKEB)8f(F|5f_tN$bK-Unu9a5t=wjy zrqmm$`*ia=Q<7!1@NDL3VY=aO)TYUTuVGck8I3tHE2UoWf&KYFrVeF*srQD-b*4iP zrGcDOAS}!h1fWc&rHx#1QLq8M#G0^xQtU7U3nZ8>D;|c6k-IfLJvn@msp>^eGZUL_ zzD&`h>0;FLgfURA>dy{eY&dMSRk+RCaZaU=}@dXXI-1aGlk6v!LNJM=`Js)AeAHW5^ULoN-cJ zP<@t#hQ}NqMg#4kqeA3g9BXV-9?L0rwy5XEnw7aTr`D-KhHS>-+QNwwhpC1P9E~)n z4wXfHG#rWS4V(~UA#h?<$#o|U6I?FVhe&tJ#=@Fmu9(Xlv+N7v+<%3qpcKfO?xHlI&;j1mgZpDR-{jpJ-J4ohQbkC zE7zwvqjc)=`m{o#3EAjWIe{yq0xAP0DEexN=+iU;ddIexKL_d!GlKDR0z1vd7;Wb?eiu$_o)tqstI8w7$^A1~GrR|IBLjN-NK{CIOZE zxug|{u-pV1mvLmE)c4Iq>G%9utk2cijHg0pZDmp#rr~DUb@xEY0&?qn-e|K9XXmr@ zXbpuZHh;6t`dBOEN1_uU_{m6=|Ohe3aRceCn1__0n#Ael>_uqdU+%Yer;q z5rqQpH9*cx;k@P^$RR7eb)frMoPz0|!WoHDBj8or!3m$zv^qbilF9A+H3qheMhk48 z&lA2^J!%545lCw55z`j1d9E5rKh8GYrV`1mmK9uxoX2ztlUQMDoMS5aA+OPFO&9oX zq>k2+Y-nmN1Q)rDUq2V!6HLUKqsg_&w8SELKw5f*E34{$@x4ZyomoXHy_V65`rasO zudarCsIN&putpIOul!0+9QCB!!c~{%o56u31TG_BsuYg#$L8ERsX{{!`c)gVpkJlI zIn_d{)gR5-c}p5`NY}_P7D8<^&=}g=hKVI`6$xU(kW1%3N38>Aw!DR>Z%kym-DJw) zUUrkEU?y}6&sszyD|N|Q8EHWeL80ygb*t`d2Xv*m8V+6-iH@q38ZQzd+hu#zmJWY* zCgw4SJ_VvCf}b)HKsz;qJ-N5g>r@d|J7J-YC2vTigH!v!ZpGDGlw&(u)(Y0?qce@@ zb#JRijK1mCR!BtzQiu}4nIPOq1hkH#G*mrw6kSzO18-vTUyW=Q<7nnchTxEIip&@^%BvYR9dy@ zDNDKPS*SaRi)>u3ZaHI11MytdkDe}QD?Kg2P+_Q{omVplo}_>PYxcueTeDSvO)_J7 zwXJYaM~kMRfSQ#$#MnIE2Sdv~c3swl2t@l}@+f1)Ybx=;x)7c*NW2(zpQ#fZ!!`zx_`=x_S zI@{^GHAyL#bhNYXKteG8h8o!P>EhMd=!99<+A}C zk&E?3nA+&z+EWd&cp7Pm(CSlBjUXs?l&i@C*UCn#+jR5;)6CjLGs27yFx}G5T$&S` zm?q7Ixz${vd(dJ_X|%UAv-1?xv1$p7b65mcVH!KoT+l(XAfsuv>2`c?CmG!UB=u8R z&X0Af5v@W`fk!!`435>!dm?2p9BM{k_Dm%P_IR+IBL-tm|y}e081aWmtXP z5w@sd&|~bNA3NC$`UNVbmk*zuH0Vzm9HgEL?%t@k0Tvnc?VTD%eLo#z)LT0<>O1f= z>fN2qs4qWRM!mbU%rvHLF5q4|#U18@ofsw;UyKxi6hQlbAXjrV(M2>C3hkTKS%@^` zQ*%!ixUhwg-UKqgQj88PfMT^Dt+UI_YTkT`D~LSYsgd+x@Ni`p4|2N$knRpKsycJ*wk#%}9p-b-NJn+yj#m@68H(Ai^PqXKO-&wNkyS8T=IbFJWkAW+m7P4 zfl=~&kHrJL%oSpBA)HaW3Z~f@At0q2^5VwJqb@(3mmD9a(X(us9}c!@c9yO?`gB&a`lp}~uYn~0xm#6sS5kQ{r7C^cDl z5X;0|WXvGe(kfcXO_*i`;V{(0uBpb0Vgm9IX^@q7C9S_!6HM`Uu+#7}s0G$8gD!p{ zg8!`?WIB-n>^0H&F=&HPEk@ZSHqI